1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright 2022-2023 NXP 4 */ 5 6 #include <kernel/thread.h> 7 #include <kernel/thread_private.h> 8 #include <gen-asm-defines.h> 9 #include <kernel/boot.h> 10 #include <mm/core_memprot.h> 11 #include <mm/core_mmu.h> 12 #include <mm/core_mmu_arch.h> 13 #include <types_ext.h> 14 15 DEFINES 16 { 17 /* struct thread_ctx */ 18 DEFINE(THREAD_CTX_KERN_SP, offsetof(struct thread_ctx, kern_sp)); 19 DEFINE(THREAD_CTX_STACK_VA_END, offsetof(struct thread_ctx, 20 stack_va_end)); 21 DEFINE(THREAD_CTX_SIZE, sizeof(struct thread_ctx)); 22 23 /* struct thread_core_local */ 24 DEFINE(THREAD_CORE_LOCAL_SIZE, sizeof(struct thread_core_local)); 25 DEFINE(THREAD_CORE_LOCAL_HART_ID, 26 offsetof(struct thread_core_local, hart_id)); 27 DEFINE(THREAD_CORE_LOCAL_HART_INDEX, 28 offsetof(struct thread_core_local, hart_index)); 29 DEFINE(THREAD_CORE_LOCAL_TMP_STACK_VA_END, 30 offsetof(struct thread_core_local, tmp_stack_va_end)); 31 DEFINE(THREAD_CORE_LOCAL_CURR_THREAD, 32 offsetof(struct thread_core_local, curr_thread)); 33 DEFINE(THREAD_CORE_LOCAL_FLAGS, 34 offsetof(struct thread_core_local, flags)); 35 DEFINE(THREAD_CORE_LOCAL_ABT_STACK_VA_END, 36 offsetof(struct thread_core_local, abt_stack_va_end)); 37 DEFINE(THREAD_CORE_LOCAL_X0, offsetof(struct thread_core_local, x[0])); 38 DEFINE(THREAD_CORE_LOCAL_X1, offsetof(struct thread_core_local, x[1])); 39 40 DEFINE(STACK_TMP_GUARD, STACK_CANARY_SIZE / 2 + STACK_TMP_OFFS); 41 DEFINE(__STACK_CANARY_SIZE, STACK_CANARY_SIZE); 42 43 /* struct thread_ctx_regs */ 44 DEFINE(THREAD_CTX_REG_STATUS, offsetof(struct thread_ctx_regs, status)); 45 DEFINE(THREAD_CTX_REG_EPC, offsetof(struct thread_ctx_regs, epc)); 46 DEFINE(THREAD_CTX_REG_IE, offsetof(struct thread_ctx_regs, ie)); 47 DEFINE(THREAD_CTX_REG_RA, offsetof(struct thread_ctx_regs, ra)); 48 DEFINE(THREAD_CTX_REG_SP, offsetof(struct thread_ctx_regs, sp)); 49 DEFINE(THREAD_CTX_REG_GP, offsetof(struct thread_ctx_regs, gp)); 50 DEFINE(THREAD_CTX_REG_TP, offsetof(struct thread_ctx_regs, tp)); 51 DEFINE(THREAD_CTX_REG_T0, offsetof(struct thread_ctx_regs, t0)); 52 DEFINE(THREAD_CTX_REG_S0, offsetof(struct thread_ctx_regs, s0)); 53 DEFINE(THREAD_CTX_REG_A0, offsetof(struct thread_ctx_regs, a0)); 54 DEFINE(THREAD_CTX_REG_S2, offsetof(struct thread_ctx_regs, s2)); 55 DEFINE(THREAD_CTX_REG_T3, offsetof(struct thread_ctx_regs, t3)); 56 DEFINE(THREAD_CTX_REGS_SIZE, sizeof(struct thread_ctx_regs)); 57 58 /* struct thread_user_mode_rec */ 59 DEFINE(THREAD_USER_MODE_REC_CTX_REGS_PTR, 60 offsetof(struct thread_user_mode_rec, ctx_regs_ptr)); 61 DEFINE(THREAD_USER_MODE_REC_RA, 62 offsetof(struct thread_user_mode_rec, x[0])); 63 DEFINE(THREAD_USER_MODE_REC_S0, 64 offsetof(struct thread_user_mode_rec, x[1])); 65 DEFINE(THREAD_USER_MODE_REC_S2, 66 offsetof(struct thread_user_mode_rec, x[3])); 67 DEFINE(THREAD_USER_MODE_REC_SIZE, sizeof(struct thread_user_mode_rec)); 68 69 /* struct thread_abort_regs */ 70 DEFINE(THREAD_ABT_REG_RA, offsetof(struct thread_abort_regs, ra)); 71 DEFINE(THREAD_ABT_REG_SP, offsetof(struct thread_abort_regs, sp)); 72 DEFINE(THREAD_ABT_REG_GP, offsetof(struct thread_abort_regs, gp)); 73 DEFINE(THREAD_ABT_REG_TP, offsetof(struct thread_abort_regs, tp)); 74 DEFINE(THREAD_ABT_REG_T0, offsetof(struct thread_abort_regs, t0)); 75 DEFINE(THREAD_ABT_REG_S0, offsetof(struct thread_abort_regs, s0)); 76 DEFINE(THREAD_ABT_REG_A0, offsetof(struct thread_abort_regs, a0)); 77 DEFINE(THREAD_ABT_REG_S2, offsetof(struct thread_abort_regs, s2)); 78 DEFINE(THREAD_ABT_REG_T3, offsetof(struct thread_abort_regs, t3)); 79 DEFINE(THREAD_ABT_REG_EPC, offsetof(struct thread_abort_regs, epc)); 80 DEFINE(THREAD_ABT_REG_STATUS, 81 offsetof(struct thread_abort_regs, status)); 82 DEFINE(THREAD_ABT_REG_IE, offsetof(struct thread_abort_regs, ie)); 83 DEFINE(THREAD_ABT_REG_CAUSE, offsetof(struct thread_abort_regs, cause)); 84 DEFINE(THREAD_ABT_REG_TVAL, offsetof(struct thread_abort_regs, tval)); 85 DEFINE(THREAD_ABT_REGS_SIZE, sizeof(struct thread_abort_regs)); 86 87 /* struct thread_scall_regs */ 88 DEFINE(THREAD_SCALL_REG_RA, offsetof(struct thread_scall_regs, ra)); 89 DEFINE(THREAD_SCALL_REG_SP, offsetof(struct thread_scall_regs, sp)); 90 DEFINE(THREAD_SCALL_REG_GP, offsetof(struct thread_scall_regs, gp)); 91 DEFINE(THREAD_SCALL_REG_TP, offsetof(struct thread_scall_regs, tp)); 92 DEFINE(THREAD_SCALL_REG_T0, offsetof(struct thread_scall_regs, t0)); 93 DEFINE(THREAD_SCALL_REG_A0, offsetof(struct thread_scall_regs, a0)); 94 DEFINE(THREAD_SCALL_REG_T3, offsetof(struct thread_scall_regs, t3)); 95 DEFINE(THREAD_SCALL_REG_EPC, offsetof(struct thread_scall_regs, epc)); 96 DEFINE(THREAD_SCALL_REG_STATUS, 97 offsetof(struct thread_scall_regs, status)); 98 DEFINE(THREAD_SCALL_REG_IE, offsetof(struct thread_scall_regs, ie)); 99 DEFINE(THREAD_SCALL_REGS_SIZE, sizeof(struct thread_scall_regs)); 100 101 /* struct core_mmu_config */ 102 DEFINE(CORE_MMU_CONFIG_SIZE, sizeof(struct core_mmu_config)); 103 DEFINE(CORE_MMU_CONFIG_SATP, 104 offsetof(struct core_mmu_config, satp[0])); 105 DEFINE(CORE_MMU_CONFIG_SATP_SIZE, sizeof(unsigned long)); 106 DEFINE(CORE_MMU_CONFIG_MAP_OFFSET, 107 offsetof(struct core_mmu_config, map_offset)); 108 109 /* struct thread_abi_args */ 110 DEFINE(THREAD_ABI_ARGS_A0, offsetof(struct thread_abi_args, a0)); 111 DEFINE(THREAD_ABI_ARGS_SIZE, sizeof(struct thread_abi_args)); 112 } 113