/* * Copyright (c) 2017 Intel Corporation * Copyright 2023 NXP * * SPDX-License-Identifier: Apache-2.0 */ #include #define THREAD_INFO_UNIMPLEMENTED 0xffffffff enum { THREAD_INFO_OFFSET_VERSION, THREAD_INFO_OFFSET_K_CURR_THREAD, THREAD_INFO_OFFSET_K_THREADS, THREAD_INFO_OFFSET_T_ENTRY, THREAD_INFO_OFFSET_T_NEXT_THREAD, THREAD_INFO_OFFSET_T_STATE, THREAD_INFO_OFFSET_T_USER_OPTIONS, THREAD_INFO_OFFSET_T_PRIO, THREAD_INFO_OFFSET_T_STACK_PTR, THREAD_INFO_OFFSET_T_NAME, THREAD_INFO_OFFSET_T_ARCH, THREAD_INFO_OFFSET_T_PREEMPT_FLOAT, THREAD_INFO_OFFSET_T_COOP_FLOAT, THREAD_INFO_OFFSET_T_ARM_EXC_RETURN, THREAD_INFO_OFFSET_T_ARC_RELINQUISH_CAUSE, }; #if CONFIG_MP_MAX_NUM_CPUS > 1 #error "This code doesn't work properly with multiple CPUs enabled" #endif /* Forward-compatibility notes: 1) Only append items to this table; otherwise * debugger plugin versions that expect fewer items will read garbage values. * 2) Avoid incompatible changes that affect the interpretation of existing * items. But if you have to do them, increment THREAD_INFO_OFFSET_VERSION * and submit a patch for debugger plugins to deal with both the old and new * scheme. * Only version 1 is backward compatible to version 0. */ __attribute__((used, section(".dbg_thread_info"))) const size_t _kernel_thread_info_offsets[] = { /* Version 0 starts */ [THREAD_INFO_OFFSET_VERSION] = 1, [THREAD_INFO_OFFSET_K_CURR_THREAD] = offsetof(struct _cpu, current), [THREAD_INFO_OFFSET_K_THREADS] = offsetof(struct z_kernel, threads), [THREAD_INFO_OFFSET_T_ENTRY] = offsetof(struct k_thread, entry), [THREAD_INFO_OFFSET_T_NEXT_THREAD] = offsetof(struct k_thread, next_thread), [THREAD_INFO_OFFSET_T_STATE] = offsetof(struct _thread_base, thread_state), [THREAD_INFO_OFFSET_T_USER_OPTIONS] = offsetof(struct _thread_base, user_options), [THREAD_INFO_OFFSET_T_PRIO] = offsetof(struct _thread_base, prio), #if defined(CONFIG_ARM64) /* We are assuming that the SP of interest is SP_EL1 */ [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.sp_elx), #elif defined(CONFIG_ARM) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.psp), #elif defined(CONFIG_ARC) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.sp), #elif defined(CONFIG_X86) #if defined(CONFIG_X86_64) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.rsp), #else [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.esp), #endif #elif defined(CONFIG_MIPS) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.sp), #elif defined(CONFIG_NIOS2) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.sp), #elif defined(CONFIG_RISCV) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.sp), #elif defined(CONFIG_SPARC) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.o6), #elif defined(CONFIG_ARCH_POSIX) [THREAD_INFO_OFFSET_T_STACK_PTR] = offsetof(struct k_thread, callee_saved.thread_status), #elif defined(CONFIG_XTENSA) /* Xtensa does not store stack pointers inside thread objects. * The registers are saved in thread stack where there is * no fixed location for this to work. So mark this as * unimplemented to avoid the #warning below. */ [THREAD_INFO_OFFSET_T_STACK_PTR] = THREAD_INFO_UNIMPLEMENTED, #else /* Use a special value so that OpenOCD knows that obtaining the stack * pointer is not possible on this particular architecture. */ #warning Please define THREAD_INFO_OFFSET_T_STACK_PTR for this architecture [THREAD_INFO_OFFSET_T_STACK_PTR] = THREAD_INFO_UNIMPLEMENTED, #endif /* Version 0 ends */ [THREAD_INFO_OFFSET_T_NAME] = offsetof(struct k_thread, name), [THREAD_INFO_OFFSET_T_ARCH] = offsetof(struct k_thread, arch), #if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING) && defined(CONFIG_ARM) [THREAD_INFO_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch, preempt_float), [THREAD_INFO_OFFSET_T_COOP_FLOAT] = THREAD_INFO_UNIMPLEMENTED, #elif defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING) && defined(CONFIG_ARM64) [THREAD_INFO_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch, saved_fp_context), [THREAD_INFO_OFFSET_T_COOP_FLOAT] = THREAD_INFO_UNIMPLEMENTED, #elif defined(CONFIG_FPU) && defined(CONFIG_X86) #if defined(CONFIG_X86_64) [THREAD_INFO_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch, sse), #else [THREAD_INFO_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch, preempFloatReg), #endif [THREAD_INFO_OFFSET_T_COOP_FLOAT] = THREAD_INFO_UNIMPLEMENTED, #else [THREAD_INFO_OFFSET_T_PREEMPT_FLOAT] = THREAD_INFO_UNIMPLEMENTED, [THREAD_INFO_OFFSET_T_COOP_FLOAT] = THREAD_INFO_UNIMPLEMENTED, #endif /* Version is still 1, but existence of following elements must be * checked with _kernel_thread_info_num_offsets. */ #ifdef CONFIG_ARM_STORE_EXC_RETURN /* ARM overwrites the LSB of the Link Register on the stack when * this option is enabled. If this offset is not THREAD_INFO_UNIMPLEMENTED * then the LSB needs to be restored from mode_exc_return. */ [THREAD_INFO_OFFSET_T_ARM_EXC_RETURN] = offsetof(struct _thread_arch, mode_exc_return), #else [THREAD_INFO_OFFSET_T_ARM_EXC_RETURN] = THREAD_INFO_UNIMPLEMENTED, #endif /* CONFIG_ARM_STORE_EXC_RETURN */ #if defined(CONFIG_ARC) [THREAD_INFO_OFFSET_T_ARC_RELINQUISH_CAUSE] = offsetof(struct _thread_arch, relinquish_cause), #else [THREAD_INFO_OFFSET_T_ARC_RELINQUISH_CAUSE] = THREAD_INFO_UNIMPLEMENTED, #endif /* CONFIG_ARC */ }; extern const size_t __attribute__((alias("_kernel_thread_info_offsets"))) _kernel_openocd_offsets; __attribute__((used, section(".dbg_thread_info"))) const size_t _kernel_thread_info_num_offsets = ARRAY_SIZE(_kernel_thread_info_offsets); extern const size_t __attribute__((alias("_kernel_thread_info_num_offsets"))) _kernel_openocd_num_offsets; __attribute__((used, section(".dbg_thread_info"))) const uint8_t _kernel_thread_info_size_t_size = (uint8_t)sizeof(size_t); extern const uint8_t __attribute__((alias("_kernel_thread_info_size_t_size"))) _kernel_openocd_size_t_size;