jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / rtos / ThreadX.c
index add34b4f4db8b2c2da8cb3dd0032e8d74317422c..5bdd007d42699bc7aaae7439d93fd9d3709fc275 100644 (file)
@@ -1,21 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2011 by Broadcom Corporation                            *
  *   Evan Hunter - ehunter@broadcom.com                                    *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 #include "helper/types.h"
 #include "rtos_standard_stackings.h"
 
-static int ThreadX_detect_rtos(struct target *target);
-static int ThreadX_create(struct target *target);
-static int ThreadX_update_threads(struct rtos *rtos);
-static int ThreadX_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char **hex_reg_list);
-static int ThreadX_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[]);
+static const struct rtos_register_stacking *get_stacking_info(const struct rtos *rtos, int64_t stack_ptr);
+static const struct rtos_register_stacking *get_stacking_info_arm926ejs(const struct rtos *rtos, int64_t stack_ptr);
+
+static int is_thread_id_valid(const struct rtos *rtos, int64_t thread_id);
+static int is_thread_id_valid_arm926ejs(const struct rtos *rtos, int64_t thread_id);
+
+static bool threadx_detect_rtos(struct target *target);
+static int threadx_create(struct target *target);
+static int threadx_update_threads(struct rtos *rtos);
+static int threadx_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, struct rtos_reg **reg_list, int *num_regs);
+static int threadx_get_symbol_list_to_lookup(struct symbol_table_elem *symbol_list[]);
+
+
 
-struct ThreadX_thread_state {
+struct threadx_thread_state {
        int value;
-       char *desc;
+       const char *desc;
 };
 
-struct ThreadX_thread_state ThreadX_thread_states[] = {
+static const struct threadx_thread_state threadx_thread_states[] = {
        { 0,  "Ready" },
        { 1,  "Completed" },
        { 2,  "Terminated" },
@@ -59,19 +54,80 @@ struct ThreadX_thread_state ThreadX_thread_states[] = {
        { 13, "Waiting - Mutex" },
 };
 
-#define THREADX_NUM_STATES (sizeof(ThreadX_thread_states)/sizeof(struct ThreadX_thread_state))
+#define THREADX_NUM_STATES ARRAY_SIZE(threadx_thread_states)
+
+#define ARM926EJS_REGISTERS_SIZE_SOLICITED (11 * 4)
+static const struct stack_register_offset rtos_threadx_arm926ejs_stack_offsets_solicited[] = {
+       { 0,  -1,   32 },               /* r0        */
+       { 1,  -1,   32 },               /* r1        */
+       { 2,  -1,   32 },               /* r2        */
+       { 3,  -1,   32 },               /* r3        */
+       { 4,  0x08, 32 },               /* r4        */
+       { 5,  0x0C, 32 },               /* r5        */
+       { 6,  0x10, 32 },               /* r6        */
+       { 7,  0x14, 32 },               /* r7        */
+       { 8,  0x18, 32 },               /* r8        */
+       { 9,  0x1C, 32 },               /* r9        */
+       { 10, 0x20, 32 },               /* r10       */
+       { 11, 0x24, 32 },               /* r11       */
+       { 12, -1,   32 },               /* r12       */
+       { 13, -2,   32 },               /* sp (r13)  */
+       { 14, 0x28, 32 },               /* lr (r14)  */
+       { 15, -1,   32 },               /* pc (r15)  */
+       /*{ 16, -1,   32 },*/           /* lr (r14)  */
+       /*{ 17, 0x28, 32 },*/           /* pc (r15)  */
+       { 16, 0x04, 32 },               /* xPSR      */
+};
+#define ARM926EJS_REGISTERS_SIZE_INTERRUPT (17 * 4)
+static const struct stack_register_offset rtos_threadx_arm926ejs_stack_offsets_interrupt[] = {
+       { 0,  0x08, 32 },               /* r0        */
+       { 1,  0x0C, 32 },               /* r1        */
+       { 2,  0x10, 32 },               /* r2        */
+       { 3,  0x14, 32 },               /* r3        */
+       { 4,  0x18, 32 },               /* r4        */
+       { 5,  0x1C, 32 },               /* r5        */
+       { 6,  0x20, 32 },               /* r6        */
+       { 7,  0x24, 32 },               /* r7        */
+       { 8,  0x28, 32 },               /* r8        */
+       { 9,  0x2C, 32 },               /* r9        */
+       { 10, 0x30, 32 },               /* r10       */
+       { 11, 0x34, 32 },               /* r11       */
+       { 12, 0x38, 32 },               /* r12       */
+       { 13, -2,   32 },               /* sp (r13)  */
+       { 14, 0x3C, 32 },               /* lr (r14)  */
+       { 15, 0x40, 32 },               /* pc (r15)  */
+       { 16, 0x04, 32 },               /* xPSR      */
+};
+
+static const struct rtos_register_stacking rtos_threadx_arm926ejs_stacking[] = {
+{
+       .stack_registers_size = ARM926EJS_REGISTERS_SIZE_SOLICITED,
+       .stack_growth_direction = -1,
+       .num_output_registers = 17,
+       .register_offsets = rtos_threadx_arm926ejs_stack_offsets_solicited
+},
+{
+       .stack_registers_size = ARM926EJS_REGISTERS_SIZE_INTERRUPT,
+       .stack_growth_direction = -1,
+       .num_output_registers = 17,
+       .register_offsets = rtos_threadx_arm926ejs_stack_offsets_interrupt
+},
+};
 
-struct ThreadX_params {
-       char *target_name;
+struct threadx_params {
+       const char *target_name;
        unsigned char pointer_width;
        unsigned char thread_stack_offset;
        unsigned char thread_name_offset;
        unsigned char thread_state_offset;
        unsigned char thread_next_offset;
        const struct rtos_register_stacking *stacking_info;
+       size_t stacking_info_nb;
+       const struct rtos_register_stacking* (*fn_get_stacking_info)(const struct rtos *rtos, int64_t stack_ptr);
+       int (*fn_is_thread_id_valid)(const struct rtos *rtos, int64_t thread_id);
 };
 
-const struct ThreadX_params ThreadX_params_list[] = {
+static const struct threadx_params threadx_params_list[] = {
        {
        "cortex_m",                             /* target_name */
        4,                                                      /* pointer_width; */
@@ -79,7 +135,10 @@ const struct ThreadX_params ThreadX_params_list[] = {
        40,                                                     /* thread_name_offset; */
        48,                                                     /* thread_state_offset; */
        136,                                            /* thread_next_offset */
-       &rtos_standard_Cortex_M3_stacking,      /* stacking_info */
+       &rtos_standard_cortex_m3_stacking,      /* stacking_info */
+       1,                                                      /* stacking_info_nb */
+       NULL,                                           /* fn_get_stacking_info */
+       NULL,                                           /* fn_is_thread_id_valid */
        },
        {
        "cortex_r4",                            /* target_name */
@@ -88,64 +147,142 @@ const struct ThreadX_params ThreadX_params_list[] = {
        40,                                                     /* thread_name_offset; */
        48,                                                     /* thread_state_offset; */
        136,                                            /* thread_next_offset */
-       &rtos_standard_Cortex_R4_stacking,      /* stacking_info */
+       &rtos_standard_cortex_r4_stacking,      /* stacking_info */
+       1,                                                      /* stacking_info_nb */
+       NULL,                                           /* fn_get_stacking_info */
+       NULL,                                           /* fn_is_thread_id_valid */
+       },
+       {
+       "arm926ejs",                            /* target_name */
+       4,                                                      /* pointer_width; */
+       8,                                                      /* thread_stack_offset; */
+       40,                                                     /* thread_name_offset; */
+       48,                                                     /* thread_state_offset; */
+       136,                                            /* thread_next_offset */
+       rtos_threadx_arm926ejs_stacking,        /* stacking_info */
+       2,                                                                      /* stacking_info_nb */
+       get_stacking_info_arm926ejs,            /* fn_get_stacking_info */
+       is_thread_id_valid_arm926ejs,           /* fn_is_thread_id_valid */
+       },
+       {
+       "hla_target",                           /* target_name */
+       4,                                                      /* pointer_width; */
+       8,                                                      /* thread_stack_offset; */
+       40,                                                     /* thread_name_offset; */
+       48,                                                     /* thread_state_offset; */
+       136,                                            /* thread_next_offset */
+       &rtos_standard_cortex_m3_stacking,      /* stacking_info */
+       1,                                                      /* stacking_info_nb */
+       NULL,                                           /* fn_get_stacking_info */
+       NULL,                                           /* fn_is_thread_id_valid */
        },
 };
 
-#define THREADX_NUM_PARAMS ((int)(sizeof(ThreadX_params_list)/sizeof(struct ThreadX_params)))
-
-enum ThreadX_symbol_values {
-       ThreadX_VAL_tx_thread_current_ptr = 0,
-       ThreadX_VAL_tx_thread_created_ptr = 1,
-       ThreadX_VAL_tx_thread_created_count = 2,
+enum threadx_symbol_values {
+       THREADX_VAL_TX_THREAD_CURRENT_PTR = 0,
+       THREADX_VAL_TX_THREAD_CREATED_PTR = 1,
+       THREADX_VAL_TX_THREAD_CREATED_COUNT = 2,
 };
 
-static char *ThreadX_symbol_list[] = {
+static const char * const threadx_symbol_list[] = {
        "_tx_thread_current_ptr",
        "_tx_thread_created_ptr",
        "_tx_thread_created_count",
        NULL
 };
 
-const struct rtos_type ThreadX_rtos = {
+const struct rtos_type threadx_rtos = {
        .name = "ThreadX",
 
-       .detect_rtos = ThreadX_detect_rtos,
-       .create = ThreadX_create,
-       .update_threads = ThreadX_update_threads,
-       .get_thread_reg_list = ThreadX_get_thread_reg_list,
-       .get_symbol_list_to_lookup = ThreadX_get_symbol_list_to_lookup,
-
+       .detect_rtos = threadx_detect_rtos,
+       .create = threadx_create,
+       .update_threads = threadx_update_threads,
+       .get_thread_reg_list = threadx_get_thread_reg_list,
+       .get_symbol_list_to_lookup = threadx_get_symbol_list_to_lookup,
 };
 
-static int ThreadX_update_threads(struct rtos *rtos)
+static const struct rtos_register_stacking *get_stacking_info(const struct rtos *rtos, int64_t stack_ptr)
+{
+       const struct threadx_params *param = (const struct threadx_params *) rtos->rtos_specific_params;
+
+       if (param->fn_get_stacking_info)
+               return param->fn_get_stacking_info(rtos, stack_ptr);
+
+       return param->stacking_info + 0;
+}
+
+static int is_thread_id_valid(const struct rtos *rtos, int64_t thread_id)
+{
+       const struct threadx_params *param;
+
+       if (!rtos->rtos_specific_params)
+               return 0; /* invalid */
+
+       param = (const struct threadx_params *) rtos->rtos_specific_params;
+
+       if (param->fn_is_thread_id_valid)
+               return param->fn_is_thread_id_valid(rtos, thread_id);
+
+       return (thread_id != 0);
+}
+
+static const struct rtos_register_stacking *get_stacking_info_arm926ejs(const struct rtos *rtos, int64_t stack_ptr)
+{
+       const struct threadx_params *param = (const struct threadx_params *) rtos->rtos_specific_params;
+       int     retval;
+       uint32_t flag;
+
+       retval = target_read_buffer(rtos->target,
+                       stack_ptr,
+                       sizeof(flag),
+                       (uint8_t *)&flag);
+       if (retval != ERROR_OK) {
+               LOG_ERROR("Error reading stack data from ThreadX thread: stack_ptr=0x%" PRIx64, stack_ptr);
+               return NULL;
+       }
+
+       if (flag == 0) {
+               LOG_DEBUG("  solicited stack");
+               return param->stacking_info + 0;
+       } else {
+               LOG_DEBUG("  interrupt stack: %" PRIu32, flag);
+               return param->stacking_info + 1;
+       }
+}
+
+static int is_thread_id_valid_arm926ejs(const struct rtos *rtos, int64_t thread_id)
+{
+       return (thread_id != 0 && thread_id != 1);
+}
+
+static int threadx_update_threads(struct rtos *rtos)
 {
        int retval;
        int tasks_found = 0;
        int thread_list_size = 0;
-       const struct ThreadX_params *param;
+       const struct threadx_params *param;
 
-       if (rtos == NULL)
+       if (!rtos)
                return -1;
 
-       if (rtos->rtos_specific_params == NULL)
+       if (!rtos->rtos_specific_params)
                return -3;
 
-       param = (const struct ThreadX_params *) rtos->rtos_specific_params;
+       param = (const struct threadx_params *) rtos->rtos_specific_params;
 
-       if (rtos->symbols == NULL) {
+       if (!rtos->symbols) {
                LOG_ERROR("No symbols for ThreadX");
                return -4;
        }
 
-       if (rtos->symbols[ThreadX_VAL_tx_thread_created_count].address == 0) {
+       if (rtos->symbols[THREADX_VAL_TX_THREAD_CREATED_COUNT].address == 0) {
                LOG_ERROR("Don't have the number of threads in ThreadX");
                return -2;
        }
 
        /* read the number of threads */
        retval = target_read_buffer(rtos->target,
-                       rtos->symbols[ThreadX_VAL_tx_thread_created_count].address,
+                       rtos->symbols[THREADX_VAL_TX_THREAD_CREATED_COUNT].address,
                        4,
                        (uint8_t *)&thread_list_size);
 
@@ -159,7 +296,7 @@ static int ThreadX_update_threads(struct rtos *rtos)
 
        /* read the current thread id */
        retval = target_read_buffer(rtos->target,
-                       rtos->symbols[ThreadX_VAL_tx_thread_current_ptr].address,
+                       rtos->symbols[THREADX_VAL_TX_THREAD_CURRENT_PTR].address,
                        4,
                        (uint8_t *)&rtos->current_thread);
 
@@ -175,29 +312,34 @@ static int ThreadX_update_threads(struct rtos *rtos)
                char tmp_str[] = "Current Execution";
                thread_list_size++;
                tasks_found++;
-               rtos->thread_details = (struct thread_detail *) malloc(
+               rtos->thread_details = malloc(
                                sizeof(struct thread_detail) * thread_list_size);
                rtos->thread_details->threadid = 1;
                rtos->thread_details->exists = true;
-               rtos->thread_details->display_str = NULL;
                rtos->thread_details->extra_info_str = NULL;
-               rtos->thread_details->thread_name_str = (char *) malloc(sizeof(tmp_str));
+               rtos->thread_details->thread_name_str = malloc(sizeof(tmp_str));
                strcpy(rtos->thread_details->thread_name_str, tmp_str);
 
+               /* If we just invented thread 1 to represent the current execution, we
+                * need to make sure the RTOS object also claims it's the current thread
+                * so that threadx_get_thread_reg_list() doesn't attempt to read a
+                * thread control block at 0x00000001. */
+               rtos->current_thread = 1;
+
                if (thread_list_size == 0) {
                        rtos->thread_count = 1;
                        return ERROR_OK;
                }
        } else {
                /* create space for new thread details */
-               rtos->thread_details = (struct thread_detail *) malloc(
+               rtos->thread_details = malloc(
                                sizeof(struct thread_detail) * thread_list_size);
        }
 
        /* Read the pointer to the first thread */
        int64_t thread_ptr = 0;
        retval = target_read_buffer(rtos->target,
-                       rtos->symbols[ThreadX_VAL_tx_thread_created_ptr].address,
+                       rtos->symbols[THREADX_VAL_TX_THREAD_CREATED_PTR].address,
                        param->pointer_width,
                        (uint8_t *)&thread_ptr);
        if (retval != ERROR_OK) {
@@ -228,22 +370,27 @@ static int ThreadX_update_threads(struct rtos *rtos)
                }
 
                /* Read the thread name */
-               retval =
-                       target_read_buffer(rtos->target,
-                               name_ptr,
-                               THREADX_THREAD_NAME_STR_SIZE,
-                               (uint8_t *)&tmp_str);
-               if (retval != ERROR_OK) {
-                       LOG_ERROR("Error reading thread name from ThreadX target");
-                       return retval;
+               tmp_str[0] = '\x00';
+
+               /* Check if thread has a valid name */
+               if (name_ptr != 0) {
+                       retval =
+                               target_read_buffer(rtos->target,
+                                       name_ptr,
+                                       THREADX_THREAD_NAME_STR_SIZE,
+                                       (uint8_t *)&tmp_str);
+                       if (retval != ERROR_OK) {
+                               LOG_ERROR("Error reading thread name from ThreadX target");
+                               return retval;
+                       }
+                       tmp_str[THREADX_THREAD_NAME_STR_SIZE - 1] = '\x00';
                }
-               tmp_str[THREADX_THREAD_NAME_STR_SIZE-1] = '\x00';
 
                if (tmp_str[0] == '\x00')
                        strcpy(tmp_str, "No Name");
 
                rtos->thread_details[tasks_found].thread_name_str =
-                       (char *)malloc(strlen(tmp_str)+1);
+                       malloc(strlen(tmp_str)+1);
                strcpy(rtos->thread_details[tasks_found].thread_name_str, tmp_str);
 
                /* Read the thread status */
@@ -258,24 +405,22 @@ static int ThreadX_update_threads(struct rtos *rtos)
                }
 
                for (i = 0; (i < THREADX_NUM_STATES) &&
-                               (ThreadX_thread_states[i].value != thread_status); i++) {
+                               (threadx_thread_states[i].value != thread_status); i++) {
                        /* empty */
                }
 
-               char *state_desc;
+               const char *state_desc;
                if  (i < THREADX_NUM_STATES)
-                       state_desc = ThreadX_thread_states[i].desc;
+                       state_desc = threadx_thread_states[i].desc;
                else
                        state_desc = "Unknown state";
 
-               rtos->thread_details[tasks_found].extra_info_str = (char *)malloc(strlen(
-                                       state_desc)+1);
-               strcpy(rtos->thread_details[tasks_found].extra_info_str, state_desc);
+               rtos->thread_details[tasks_found].extra_info_str = malloc(strlen(
+                                       state_desc)+8);
+               sprintf(rtos->thread_details[tasks_found].extra_info_str, "State: %s", state_desc);
 
                rtos->thread_details[tasks_found].exists = true;
 
-               rtos->thread_details[tasks_found].display_str = NULL;
-
                tasks_found++;
                prev_thread_ptr = thread_ptr;
 
@@ -296,23 +441,22 @@ static int ThreadX_update_threads(struct rtos *rtos)
        return 0;
 }
 
-static int ThreadX_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char **hex_reg_list)
+static int threadx_get_thread_reg_list(struct rtos *rtos, int64_t thread_id,
+               struct rtos_reg **reg_list, int *num_regs)
 {
        int retval;
-       const struct ThreadX_params *param;
-
-       *hex_reg_list = NULL;
+       const struct threadx_params *param;
 
-       if (rtos == NULL)
+       if (!rtos)
                return -1;
 
-       if (thread_id == 0)
+       if (!is_thread_id_valid(rtos, thread_id))
                return -2;
 
-       if (rtos->rtos_specific_params == NULL)
+       if (!rtos->rtos_specific_params)
                return -3;
 
-       param = (const struct ThreadX_params *) rtos->rtos_specific_params;
+       param = (const struct threadx_params *) rtos->rtos_specific_params;
 
        /* Read the stack pointer */
        int64_t stack_ptr = 0;
@@ -325,39 +469,54 @@ static int ThreadX_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, cha
                return retval;
        }
 
-       return rtos_generic_stack_read(rtos->target, param->stacking_info, stack_ptr, hex_reg_list);
+       LOG_INFO("thread: 0x%" PRIx64 ", stack_ptr=0x%" PRIx64, (uint64_t)thread_id, (uint64_t)stack_ptr);
+
+       if (stack_ptr == 0) {
+               LOG_ERROR("null stack pointer in thread");
+               return -5;
+       }
+
+       const struct rtos_register_stacking *stacking_info =
+                       get_stacking_info(rtos, stack_ptr);
+
+       if (!stacking_info) {
+               LOG_ERROR("Unknown stacking info for thread id=0x%" PRIx64, (uint64_t)thread_id);
+               return -6;
+       }
+
+       return rtos_generic_stack_read(rtos->target, stacking_info, stack_ptr, reg_list, num_regs);
 }
 
-static int ThreadX_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
+static int threadx_get_symbol_list_to_lookup(struct symbol_table_elem *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = (symbol_table_elem_t *) malloc(
-                       sizeof(symbol_table_elem_t) * ARRAY_SIZE(ThreadX_symbol_list));
+       *symbol_list = calloc(
+                       ARRAY_SIZE(threadx_symbol_list), sizeof(struct symbol_table_elem));
 
-       for (i = 0; i < ARRAY_SIZE(ThreadX_symbol_list); i++)
-               (*symbol_list)[i].symbol_name = ThreadX_symbol_list[i];
+       for (i = 0; i < ARRAY_SIZE(threadx_symbol_list); i++)
+               (*symbol_list)[i].symbol_name = threadx_symbol_list[i];
 
        return 0;
 }
 
-static int ThreadX_detect_rtos(struct target *target)
+static bool threadx_detect_rtos(struct target *target)
 {
-       if ((target->rtos->symbols != NULL) &&
-                       (target->rtos->symbols[ThreadX_VAL_tx_thread_created_ptr].address != 0)) {
+       if ((target->rtos->symbols) &&
+                       (target->rtos->symbols[THREADX_VAL_TX_THREAD_CREATED_PTR].address != 0)) {
                /* looks like ThreadX */
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 #if 0
 
-static int ThreadX_set_current_thread(struct rtos *rtos, threadid_t thread_id)
+static int threadx_set_current_thread(struct rtos *rtos, threadid_t thread_id)
 {
        return 0;
 }
 
-static int ThreadX_get_thread_detail(struct rtos *rtos,
+static int threadx_get_thread_detail(struct rtos *rtos,
        threadid_t thread_id,
        struct thread_detail *detail)
 {
@@ -367,20 +526,20 @@ static int ThreadX_get_thread_detail(struct rtos *rtos,
 #define THREADX_THREAD_NAME_STR_SIZE (200)
        char tmp_str[THREADX_THREAD_NAME_STR_SIZE];
 
-       const struct ThreadX_params *param;
+       const struct threadx_params *param;
 
-       if (rtos == NULL)
+       if (!rtos)
                return -1;
 
        if (thread_id == 0)
                return -2;
 
-       if (rtos->rtos_specific_params == NULL)
+       if (!rtos->rtos_specific_params)
                return -3;
 
-       param = (const struct ThreadX_params *) rtos->rtos_specific_params;
+       param = (const struct threadx_params *) rtos->rtos_specific_params;
 
-       if (rtos->symbols == NULL) {
+       if (!rtos->symbols) {
                LOG_ERROR("No symbols for ThreadX");
                return -3;
        }
@@ -412,7 +571,7 @@ static int ThreadX_get_thread_detail(struct rtos *rtos,
        if (tmp_str[0] == '\x00')
                strcpy(tmp_str, "No Name");
 
-       detail->thread_name_str = (char *)malloc(strlen(tmp_str)+1);
+       detail->thread_name_str = malloc(strlen(tmp_str)+1);
 
        /* Read the thread status */
        int64_t thread_status = 0;
@@ -427,41 +586,35 @@ static int ThreadX_get_thread_detail(struct rtos *rtos,
        }
 
        for (i = 0; (i < THREADX_NUM_STATES) &&
-                       (ThreadX_thread_states[i].value != thread_status); i++) {
+                       (threadx_thread_states[i].value != thread_status); i++) {
                /* empty */
        }
 
        char *state_desc;
        if  (i < THREADX_NUM_STATES)
-               state_desc = ThreadX_thread_states[i].desc;
+               state_desc = threadx_thread_states[i].desc;
        else
                state_desc = "Unknown state";
 
-       detail->extra_info_str = (char *)malloc(strlen(state_desc)+1);
+       detail->extra_info_str = malloc(strlen(state_desc)+1);
 
        detail->exists = true;
 
-       detail->display_str = NULL;
-
        return 0;
 }
 
 #endif
 
-static int ThreadX_create(struct target *target)
+static int threadx_create(struct target *target)
 {
-       int i = 0;
-       while ((i < THREADX_NUM_PARAMS) &&
-                       (0 != strcmp(ThreadX_params_list[i].target_name, target->type->name))) {
-               i++;
-       }
-       if (i >= THREADX_NUM_PARAMS) {
-               LOG_ERROR("Could not find target in ThreadX compatibility list");
-               return -1;
-       }
+       for (unsigned int i = 0; i < ARRAY_SIZE(threadx_params_list); i++)
+               if (strcmp(threadx_params_list[i].target_name, target->type->name) == 0) {
+                       target->rtos->rtos_specific_params = (void *)&threadx_params_list[i];
+                       target->rtos->current_thread = 0;
+                       target->rtos->thread_details = NULL;
+                       return 0;
+               }
 
-       target->rtos->rtos_specific_params = (void *) &ThreadX_params_list[i];
-       target->rtos->current_thread = 0;
-       target->rtos->thread_details = NULL;
-       return 0;
+       LOG_ERROR("Could not find target in ThreadX compatibility list");
+       return -1;
 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)