tcl/board: Add ST NUCLEO L152RE configuration
[fw/openocd] / src / rtos / rtos.c
index 1cb6958c0102dbac8ec2e0d61843f857432f8801..d09e110546e110a01d01d86e0890f6c4de93c2b5 100644 (file)
@@ -147,7 +147,7 @@ int gdb_thread_packet(struct connection *connection, char const *packet, int pac
        return target->rtos->gdb_thread_packet(connection, packet, packet_size);
 }
 
-static char *next_symbol(struct rtos *os, char *cur_symbol, uint64_t cur_addr)
+static symbol_table_elem_t *next_symbol(struct rtos *os, char *cur_symbol, uint64_t cur_addr)
 {
        symbol_table_elem_t *s;
 
@@ -155,18 +155,29 @@ static char *next_symbol(struct rtos *os, char *cur_symbol, uint64_t cur_addr)
                os->type->get_symbol_list_to_lookup(&os->symbols);
 
        if (!cur_symbol[0])
-               return os->symbols[0].symbol_name;
+               return &os->symbols[0];
 
        for (s = os->symbols; s->symbol_name; s++)
                if (!strcmp(s->symbol_name, cur_symbol)) {
                        s->address = cur_addr;
                        s++;
-                       return s->symbol_name;
+                       return s;
                }
 
        return NULL;
 }
 
+/* searches for 'symbol' in the lookup table for 'os' and returns TRUE,
+ * if 'symbol' is not declared optional */
+static bool is_symbol_mandatory(const struct rtos *os, const char *symbol)
+{
+       for (symbol_table_elem_t *s = os->symbols; s->symbol_name; ++s) {
+               if (!strcmp(s->symbol_name, symbol))
+                       return !s->optional;
+       }
+       return false;
+}
+
 /* rtos_qsymbol() processes and replies to all qSymbol packets from GDB.
  *
  * GDB sends a qSymbol:: packet (empty address, empty name) to notify
@@ -191,7 +202,8 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        int rtos_detected = 0;
        uint64_t addr = 0;
        size_t reply_len;
-       char reply[GDB_BUFFER_SIZE], cur_sym[GDB_BUFFER_SIZE / 2] = "", *next_sym;
+       char reply[GDB_BUFFER_SIZE], cur_sym[GDB_BUFFER_SIZE / 2] = "";
+       symbol_table_elem_t *next_sym = NULL;
        struct target *target = get_target_from_connection(connection);
        struct rtos *os = target->rtos;
 
@@ -205,7 +217,9 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        cur_sym[len] = 0;
 
        if ((strcmp(packet, "qSymbol::") != 0) &&               /* GDB is not offering symbol lookup for the first time */
-           (!sscanf(packet, "qSymbol:%" SCNx64 ":", &addr))) { /* GDB did not found an address for a symbol */
+           (!sscanf(packet, "qSymbol:%" SCNx64 ":", &addr)) && /* GDB did not find an address for a symbol */
+           is_symbol_mandatory(os, cur_sym)) {                                 /* the symbol is mandatory for this RTOS */
+
                /* GDB could not find an address for the previous symbol */
                if (!target->rtos_auto_detect) {
                        LOG_WARNING("RTOS %s not detected. (GDB could not find symbol \'%s\')", os->type->name, cur_sym);
@@ -223,7 +237,7 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        }
        next_sym = next_symbol(os, cur_sym, addr);
 
-       if (!next_sym) {
+       if (!next_sym->symbol_name) {
                /* No more symbols need looking up */
 
                if (!target->rtos_auto_detect) {
@@ -241,13 +255,13 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
                }
        }
 
-       if (8 + (strlen(next_sym) * 2) + 1 > sizeof(reply)) {
-               LOG_ERROR("ERROR: RTOS symbol '%s' name is too long for GDB!", next_sym);
+       if (8 + (strlen(next_sym->symbol_name) * 2) + 1 > sizeof(reply)) {
+               LOG_ERROR("ERROR: RTOS symbol '%s' name is too long for GDB!", next_sym->symbol_name);
                goto done;
        }
 
        reply_len = snprintf(reply, sizeof(reply), "qSymbol:");
-       reply_len += hexify(reply + reply_len, next_sym, 0, sizeof(reply) - reply_len);
+       reply_len += hexify(reply + reply_len, next_sym->symbol_name, 0, sizeof(reply) - reply_len);
 
 done:
        gdb_put_packet(connection, reply, reply_len);
@@ -289,7 +303,7 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                        if (detail->extra_info_str != NULL)
                                str_size += strlen(detail->extra_info_str);
 
-                       char *tmp_str = (char *) malloc(str_size + 7);
+                       char *tmp_str = malloc(str_size + 7);
                        char *tmp_str_ptr = tmp_str;
 
                        if (detail->display_str != NULL)
@@ -309,7 +323,7 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                        assert(strlen(tmp_str) ==
                                (size_t) (tmp_str_ptr - tmp_str));
 
-                       char *hex_str = (char *) malloc(strlen(tmp_str) * 2 + 1);
+                       char *hex_str = malloc(strlen(tmp_str) * 2 + 1);
                        int pkt_len = hexify(hex_str, tmp_str, 0, strlen(tmp_str) * 2 + 1);
 
                        gdb_put_packet(connection, hex_str, pkt_len);
@@ -334,7 +348,7 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                                gdb_put_packet(connection, "l", 1);
                        } else {
                                /*thread id are 16 char +1 for ',' */
-                               char *out_str = (char *) malloc(17 * target->rtos->thread_count + 1);
+                               char *out_str = malloc(17 * target->rtos->thread_count + 1);
                                char *tmp_str = out_str;
                                for (i = 0; i < target->rtos->thread_count; i++) {
                                        tmp_str += sprintf(tmp_str, "%c%016" PRIx64, i == 0 ? 'm' : ',',
@@ -437,7 +451,7 @@ int rtos_generic_stack_read(struct target *target,
                return -5;
        }
        /* Read the stack */
-       uint8_t *stack_data = (uint8_t *) malloc(stacking->stack_registers_size);
+       uint8_t *stack_data = malloc(stacking->stack_registers_size);
        uint32_t address = stack_ptr;
 
        if (stacking->stack_growth_direction == 1)
@@ -456,7 +470,7 @@ int rtos_generic_stack_read(struct target *target,
 #endif
        for (i = 0; i < stacking->num_output_registers; i++)
                list_size += stacking->register_offsets[i].width_bits/8;
-       *hex_reg_list = (char *)malloc(list_size*2 + 1);
+       *hex_reg_list = malloc(list_size*2 + 1);
        tmp_str_ptr = *hex_reg_list;
        new_stack_ptr = stack_ptr - stacking->stack_growth_direction *
                stacking->stack_registers_size;