rtos: support gdb_get_register_packet
[openocd.git] / src / rtos / eCos.c
index 5c18916a12ee58908413bd4410f8ede84cb08d7c..e6b70730b5d40533b749305bdd4b97e6ecf533c2 100644 (file)
@@ -11,9 +11,7 @@
  *   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.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 #include "target/target_type.h"
 #include "rtos.h"
 #include "helper/log.h"
+#include "helper/types.h"
 #include "rtos_ecos_stackings.h"
 
-static int eCos_detect_rtos(struct target *target);
+static bool eCos_detect_rtos(struct target *target);
 static int eCos_create(struct target *target);
 static int eCos_update_threads(struct rtos *rtos);
-static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char **hex_reg_list);
+static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, struct rtos_reg **reg_list, int *num_regs);
 static int eCos_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[]);
 
 struct eCos_thread_state {
        int value;
-       char *desc;
+       const char *desc;
 };
 
-struct eCos_thread_state eCos_thread_states[] = {
+static const struct eCos_thread_state eCos_thread_states[] = {
        { 0, "Ready" },
        { 1, "Sleeping" },
        { 2, "Countsleep" },
@@ -51,7 +50,7 @@ struct eCos_thread_state eCos_thread_states[] = {
 #define ECOS_NUM_STATES (sizeof(eCos_thread_states)/sizeof(struct eCos_thread_state))
 
 struct eCos_params {
-       char *target_name;
+       const char *target_name;
        unsigned char pointer_width;
        unsigned char thread_stack_offset;
        unsigned char thread_name_offset;
@@ -61,9 +60,9 @@ struct eCos_params {
        const struct rtos_register_stacking *stacking_info;
 };
 
-const struct eCos_params eCos_params_list[] = {
+static const struct eCos_params eCos_params_list[] = {
        {
-       "cortex_m3",                    /* target_name */
+       "cortex_m",                     /* target_name */
        4,                                              /* pointer_width; */
        0x0c,                                   /* thread_stack_offset; */
        0x9c,                                   /* thread_name_offset; */
@@ -81,14 +80,12 @@ enum eCos_symbol_values {
        eCos_VAL_current_thread_ptr = 1
 };
 
-static char *eCos_symbol_list[] = {
+static const char * const eCos_symbol_list[] = {
        "Cyg_Thread::thread_list",
        "Cyg_Scheduler_Base::current_thread",
        NULL
 };
 
-#define ECOS_NUM_SYMBOLS (sizeof(eCos_symbol_list)/sizeof(char *))
-
 const struct rtos_type eCos_rtos = {
        .name = "eCos",
 
@@ -116,35 +113,17 @@ static int eCos_update_threads(struct rtos *rtos)
        param = (const struct eCos_params *) rtos->rtos_specific_params;
 
        if (rtos->symbols == NULL) {
-               LOG_OUTPUT("No symbols for eCos\r\n");
+               LOG_ERROR("No symbols for eCos");
                return -4;
        }
 
        if (rtos->symbols[eCos_VAL_thread_list].address == 0) {
-               LOG_OUTPUT("Don't have the thread list head\r\n");
+               LOG_ERROR("Don't have the thread list head");
                return -2;
        }
 
        /* wipe out previous thread details if any */
-       if (rtos->thread_details != NULL) {
-               int j;
-               for (j = 0; j < rtos->thread_count; j++) {
-                       if (rtos->thread_details[j].display_str != NULL) {
-                               free(rtos->thread_details[j].display_str);
-                               rtos->thread_details[j].display_str = NULL;
-                       }
-                       if (rtos->thread_details[j].thread_name_str != NULL) {
-                               free(rtos->thread_details[j].thread_name_str);
-                               rtos->thread_details[j].thread_name_str = NULL;
-                       }
-                       if (rtos->thread_details[j].extra_info_str != NULL) {
-                               free(rtos->thread_details[j].extra_info_str);
-                               rtos->thread_details[j].extra_info_str = NULL;
-                       }
-               }
-               free(rtos->thread_details);
-               rtos->thread_details = NULL;
-       }
+       rtos_free_threadlist(rtos);
 
        /* determine the number of current threads */
        uint32_t thread_list_head = rtos->symbols[eCos_VAL_thread_list].address;
@@ -178,7 +157,7 @@ static int eCos_update_threads(struct rtos *rtos)
                        2,
                        (uint8_t *)&rtos->current_thread);
        if (retval != ERROR_OK) {
-               LOG_OUTPUT("Could not read eCos current thread from target\r\n");
+               LOG_ERROR("Could not read eCos current thread from target");
                return retval;
        }
 
@@ -189,13 +168,12 @@ static int eCos_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 (thread_list_size == 0) {
@@ -204,7 +182,7 @@ static int eCos_update_threads(struct rtos *rtos)
                }
        } 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);
        }
 
@@ -225,7 +203,7 @@ static int eCos_update_threads(struct rtos *rtos)
                                2,
                                (uint8_t *)&thread_id);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Could not read eCos thread id from target\r\n");
+                       LOG_ERROR("Could not read eCos thread id from target");
                        return retval;
                }
                rtos->thread_details[tasks_found].threadid = thread_id;
@@ -236,7 +214,7 @@ static int eCos_update_threads(struct rtos *rtos)
                                param->pointer_width,
                                (uint8_t *)&name_ptr);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Could not read eCos thread name pointer from target\r\n");
+                       LOG_ERROR("Could not read eCos thread name pointer from target");
                        return retval;
                }
 
@@ -247,7 +225,7 @@ static int eCos_update_threads(struct rtos *rtos)
                                ECOS_THREAD_NAME_STR_SIZE,
                                (uint8_t *)&tmp_str);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Error reading thread name from eCos target\r\n");
+                       LOG_ERROR("Error reading thread name from eCos target");
                        return retval;
                }
                tmp_str[ECOS_THREAD_NAME_STR_SIZE-1] = '\x00';
@@ -256,7 +234,7 @@ static int eCos_update_threads(struct rtos *rtos)
                        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 */
@@ -266,7 +244,7 @@ static int eCos_update_threads(struct rtos *rtos)
                                4,
                                (uint8_t *)&thread_status);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Error reading thread state from eCos target\r\n");
+                       LOG_ERROR("Error reading thread state from eCos target");
                        return retval;
                }
 
@@ -276,20 +254,18 @@ static int eCos_update_threads(struct rtos *rtos)
                         */
                }
 
-               char *state_desc;
+               const char *state_desc;
                if  (i < ECOS_NUM_STATES)
                        state_desc = eCos_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_index;
 
@@ -300,7 +276,7 @@ static int eCos_update_threads(struct rtos *rtos)
                                param->pointer_width,
                                (uint8_t *) &thread_index);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Error reading next thread pointer in eCos thread list\r\n");
+                       LOG_ERROR("Error reading next thread pointer in eCos thread list");
                        return retval;
                }
        } while (thread_index != first_thread);
@@ -309,13 +285,12 @@ static int eCos_update_threads(struct rtos *rtos)
        return 0;
 }
 
-static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char **hex_reg_list)
+static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id,
+               struct rtos_reg **reg_list, int *num_regs)
 {
        int retval;
        const struct eCos_params *param;
 
-       *hex_reg_list = NULL;
-
        if (rtos == NULL)
                return -1;
 
@@ -340,7 +315,7 @@ static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char *
                                2,
                                (uint8_t *)&id);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Error reading unique id from eCos thread\r\n");
+                       LOG_ERROR("Error reading unique id from eCos thread");
                        return retval;
                }
 
@@ -362,14 +337,15 @@ static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char *
                                param->pointer_width,
                                (uint8_t *)&stack_ptr);
                if (retval != ERROR_OK) {
-                       LOG_OUTPUT("Error reading stack frame from eCos thread\r\n");
+                       LOG_ERROR("Error reading stack frame from eCos thread");
                        return retval;
                }
 
                return rtos_generic_stack_read(rtos->target,
                        param->stacking_info,
                        stack_ptr,
-                       hex_reg_list);
+                       reg_list,
+                       num_regs);
        }
 
        return -1;
@@ -378,23 +354,23 @@ static int eCos_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char *
 static int eCos_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = (symbol_table_elem_t *) malloc(
-                       sizeof(symbol_table_elem_t) * ECOS_NUM_SYMBOLS);
+       *symbol_list = calloc(
+                       ARRAY_SIZE(eCos_symbol_list), sizeof(symbol_table_elem_t));
 
-       for (i = 0; i < ECOS_NUM_SYMBOLS; i++)
+       for (i = 0; i < ARRAY_SIZE(eCos_symbol_list); i++)
                (*symbol_list)[i].symbol_name = eCos_symbol_list[i];
 
        return 0;
 }
 
-static int eCos_detect_rtos(struct target *target)
+static bool eCos_detect_rtos(struct target *target)
 {
        if ((target->rtos->symbols != NULL) &&
                        (target->rtos->symbols[eCos_VAL_thread_list].address != 0)) {
                /* looks like eCos */
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 static int eCos_create(struct target *target)
@@ -405,7 +381,7 @@ static int eCos_create(struct target *target)
                i++;
        }
        if (i >= ECOS_NUM_PARAMS) {
-               LOG_OUTPUT("Could not find target in eCos compatibility list\r\n");
+               LOG_ERROR("Could not find target in eCos 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)