In order for OpenOCD to have a high-level view of an RTOS, it uses the GDB protocol to obtain symbols from the system. The GDB protocol, however, does not allow obtaining fields from structures directly, and hardcoding offsets is not only brittle (due to possibly different architectures or changes in the code), it's also infeasible considering Zephyr is highly-configurable and parts of key structs can be compiled in or out. Export an array with offsets for these key structs. Also add a version element in that array to allow changes in those structs. Change-Id: I83bcfa0a7bd57d85582e5ec6efe70e1cceb1fc51 Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
68 lines
2.3 KiB
C
68 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2017 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <kernel_structs.h>
|
|
|
|
#if defined(CONFIG_OPENOCD_SUPPORT) && defined(CONFIG_THREAD_MONITOR)
|
|
enum {
|
|
OPENOCD_OFFSET_VERSION,
|
|
OPENOCD_OFFSET_K_CURR_THREAD,
|
|
OPENOCD_OFFSET_K_THREADS,
|
|
OPENOCD_OFFSET_T_ENTRY,
|
|
OPENOCD_OFFSET_T_NEXT_THREAD,
|
|
OPENOCD_OFFSET_T_STATE,
|
|
OPENOCD_OFFSET_T_USER_OPTIONS,
|
|
OPENOCD_OFFSET_T_PRIO,
|
|
OPENOCD_OFFSET_T_STACK_PTR,
|
|
};
|
|
|
|
/* Forward-compatibility notes: 1) Increment OPENOCD_OFFSET_VERSION element
|
|
* each time an offset is added to this table. 2) Only append items to this
|
|
* table; otherwise, OpenOCD versions that expects version 0 will read garbage
|
|
* values.
|
|
*/
|
|
__attribute__((used, section(".openocd_dbg")))
|
|
size_t _kernel_openocd_offsets[] = {
|
|
/* Version 0 starts */
|
|
[OPENOCD_OFFSET_VERSION] = 0,
|
|
[OPENOCD_OFFSET_K_CURR_THREAD] = offsetof(struct _kernel, current),
|
|
[OPENOCD_OFFSET_K_THREADS] = offsetof(struct _kernel, threads),
|
|
[OPENOCD_OFFSET_T_ENTRY] = offsetof(struct k_thread, entry),
|
|
[OPENOCD_OFFSET_T_NEXT_THREAD] = offsetof(struct k_thread, next_thread),
|
|
[OPENOCD_OFFSET_T_STATE] = offsetof(struct _thread_base, thread_state),
|
|
[OPENOCD_OFFSET_T_USER_OPTIONS] = offsetof(struct _thread_base,
|
|
user_options),
|
|
[OPENOCD_OFFSET_T_PRIO] = offsetof(struct _thread_base, prio),
|
|
#if defined(CONFIG_ARM)
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = offsetof(struct k_thread,
|
|
callee_saved.psp),
|
|
#elif defined(CONFIG_ARC)
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = offsetof(struct k_thread,
|
|
callee_saved.sp),
|
|
#elif defined(CONFIG_X86)
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = offsetof(struct k_thread,
|
|
callee_saved.esp),
|
|
#elif defined(CONFIG_NIOS2)
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = offsetof(struct k_thread,
|
|
callee_saved.sp),
|
|
#elif defined(CONFIG_RISCV32)
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = offsetof(struct k_thread,
|
|
callee_saved.sp),
|
|
#else
|
|
/* Use 0xffffffff as a special value so that OpenOCD knows that
|
|
* obtaining the stack pointer is not possible on this particular
|
|
* architecture.
|
|
*/
|
|
#warning Please define OPENOCD_OFFSET_T_STACK_PTR for this architecture
|
|
[OPENOCD_OFFSET_T_STACK_PTR] = 0xffffffff,
|
|
#endif
|
|
/* Version 0 ends */
|
|
};
|
|
|
|
__attribute__((used, section(".openocd_dbg")))
|
|
uint8_t _kernel_openocd_size_t_size = (uint8_t)sizeof(size_t);
|
|
#endif
|