zephyr/subsys/debug/openocd.c
Daniel Glöckner c9e7a5b6b0 debug: openocd: change how we manage differences between versions
Every time the array of offsets was changed, it was changed in a
backward compatible way by appending elements to the end. The version
number was incremented to inform OpenOCD about the existence of the new
elements. But the patch for OpenOCD to support Zephyr has never been
updated to support anything else than version 0, causing OpenOCD to
reject recent Zephyr versions. So the idea of using a version number to
track compatible changes didn't work out.

Therefore add another symbol that can be read by OpenOCD to get the
number of elements in the array. This value is automatically calculated
during compilation. The version number element should from now on be
incremented only for incompatible changes.

Fixes: #13448

Signed-off-by: Daniel Glöckner <dg@emlix.com>
2019-02-27 13:25:28 -06:00

97 lines
3.5 KiB
C

/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <kernel_structs.h>
#define OPENOCD_UNIMPLEMENTED 0xffffffff
#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,
OPENOCD_OFFSET_T_NAME,
OPENOCD_OFFSET_T_ARCH,
OPENOCD_OFFSET_T_PREEMPT_FLOAT,
OPENOCD_OFFSET_T_COOP_FLOAT,
};
/* Forward-compatibility notes: 1) Only append items to this table; otherwise
* OpenOCD versions that expect less items will read garbage values.
* 2) Avoid incompatible changes that affect the interpretation of existing
* items. But if you have to do them, increment OPENOCD_OFFSET_VERSION
* and submit a patch for OpenOCD to deal with both the old and new scheme.
* Only version 1 is backward compatible to version 0.
*/
__attribute__((used, section(".openocd_dbg")))
size_t _kernel_openocd_offsets[] = {
/* Version 0 starts */
[OPENOCD_OFFSET_VERSION] = 1,
[OPENOCD_OFFSET_K_CURR_THREAD] = offsetof(struct z_kernel, current),
[OPENOCD_OFFSET_K_THREADS] = offsetof(struct z_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 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] = OPENOCD_UNIMPLEMENTED,
#endif
/* Version 0 ends */
[OPENOCD_OFFSET_T_NAME] = offsetof(struct k_thread, name),
[OPENOCD_OFFSET_T_ARCH] = offsetof(struct k_thread, arch),
#if defined(CONFIG_FLOAT) && defined(CONFIG_ARM)
[OPENOCD_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch,
preempt_float),
[OPENOCD_OFFSET_T_COOP_FLOAT] = OPENOCD_UNIMPLEMENTED,
#elif defined(CONFIG_FLOAT) && defined(CONFIG_X86)
[OPENOCD_OFFSET_T_PREEMPT_FLOAT] = offsetof(struct _thread_arch,
preempFloatReg),
[OPENOCD_OFFSET_T_COOP_FLOAT] = offsetof(struct _thread_arch,
coopFloatReg),
#else
[OPENOCD_OFFSET_T_PREEMPT_FLOAT] = OPENOCD_UNIMPLEMENTED,
[OPENOCD_OFFSET_T_COOP_FLOAT] = OPENOCD_UNIMPLEMENTED,
#endif
/* Version is still 1, but existence of following elements must be
* checked with _kernel_openocd_num_offsets.
*/
};
__attribute__((used, section(".openocd_dbg")))
size_t _kernel_openocd_num_offsets = ARRAY_SIZE(_kernel_openocd_offsets);
__attribute__((used, section(".openocd_dbg")))
u8_t _kernel_openocd_size_t_size = (u8_t)sizeof(size_t);
#endif