| /* | 
 |  * Copyright (c) 2017 Intel Corporation | 
 |  * Copyright 2023 NXP | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 |  | 
 | #include <zephyr/kernel.h> | 
 |  | 
 | #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; |