From 4eb314e041edab4d77f7c3e01da8aa09916f570f Mon Sep 17 00:00:00 2001 From: Maureen Helm Date: Mon, 24 Jan 2022 14:09:50 -0600 Subject: [PATCH] rtos: Fix reading Zephyr thread name and update debug symbol names (#1320) * rtos: Fix reading Zephyr thread name The Zephyr thread structure was changed to hold a buffered copy of the thread name rather than a pointer to the thread name, in order to fix potential access issues when reading from user mode. This was implemented in Zephyr v2.0.0 and backported to the 1.14 LTS branch. See https://github.com/zephyrproject-rtos/zephyr/pull/17071 for further details. Signed-off-by: Maureen Helm * rtos: Update Zephyr debug symbol names Zephyr thread awareness was first introduced for OpenOCD, then later extended to include pyOCD and J-Link. The debug symbol names were renamed to reflect that this support is no longer specific to OpenOCD. The old symbols were deprecated in Zephyr v2.6.0 and will be removed after two releases. See https://github.com/zephyrproject-rtos/zephyr/pull/33283 for further details. Signed-off-by: Maureen Helm --- pyocd/rtos/zephyr.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/pyocd/rtos/zephyr.py b/pyocd/rtos/zephyr.py index ba5178a4b..71aa343c3 100644 --- a/pyocd/rtos/zephyr.py +++ b/pyocd/rtos/zephyr.py @@ -1,5 +1,6 @@ # pyOCD debugger # Copyright (c) 2016-2020 Arm Limited +# Copyright (c) 2022 Intel Corporation # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -192,12 +193,8 @@ def update_info(self): self._state = self._target_context.read8(self._base + self._offsets["t_state"]) if self._provider.version > 0: - addr = self._target_context.read32(self._base + self._offsets["t_name"]) - if addr != 0: - self._name = read_c_string(self._target_context, addr) - else: - self._name = "Unnamed" - + addr = self._base + self._offsets["t_name"] + self._name = read_c_string(self._target_context, addr) except exceptions.TransferError: LOG.debug("Transfer error while reading thread info") @@ -246,8 +243,8 @@ class ZephyrThreadProvider(ThreadProvider): ## Required Zephyr symbols. ZEPHYR_SYMBOLS = [ "_kernel", - "_kernel_openocd_offsets", - "_kernel_openocd_size_t_size", + "_kernel_thread_info_offsets", + "_kernel_thread_info_size_t_size", ] ZEPHYR_OFFSETS = [ @@ -286,15 +283,15 @@ def init(self, symbolProvider): def _get_offsets(self): # Read the kernel and thread structure member offsets - size = self._target_context.read8(self._symbols["_kernel_openocd_size_t_size"]) - LOG.debug("_kernel_openocd_size_t_size = %d", size) + size = self._target_context.read8(self._symbols["_kernel_thread_info_size_t_size"]) + LOG.debug("_kernel_thread_info_size_t_size = %d", size) if size != 4: - LOG.error("Unsupported _kernel_openocd_size_t_size") + LOG.error("Unsupported _kernel_thread_info_size_t_size") return None offsets = {} for index, name in enumerate(self.ZEPHYR_OFFSETS): - offset = self._symbols["_kernel_openocd_offsets"] + index * size + offset = self._symbols["_kernel_thread_info_offsets"] + index * size offsets[name] = self._target_context.read32(offset) LOG.debug("%s = 0x%04x", name, offsets[name])