rtos: allow symbols to be optional for a particular RTOS 55/2355/3
authorPaul Fertser <fercerpav@gmail.com>
Sat, 25 Oct 2014 07:20:10 +0000 (11:20 +0400)
committerSpencer Oliver <spen@spen-soft.co.uk>
Mon, 24 Nov 2014 22:21:37 +0000 (22:21 +0000)
Default to non-optional.

Change-Id: Ifc9ddb1ab701a19c3760f95da47da6f7d412ff2e
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2355
Tested-by: jenkins
Reviewed-by: Christian Gudrian <christian.gudrian@gmx.de>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/rtos/ChibiOS.c
src/rtos/FreeRTOS.c
src/rtos/ThreadX.c
src/rtos/eCos.c
src/rtos/embKernel.c
src/rtos/linux.c
src/rtos/rtos.c
src/rtos/rtos.h

index 46fdca323fcdf7ec1bb3bb80288a0d4c427931b4..ba14a284ccfc31e41dfb3853123c5d84386f4979 100644 (file)
@@ -497,8 +497,8 @@ static int ChibiOS_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, cha
 static int ChibiOS_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
 static int ChibiOS_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = malloc(
-                       sizeof(symbol_table_elem_t) * ARRAY_SIZE(ChibiOS_symbol_list));
+       *symbol_list = calloc(
+                       ARRAY_SIZE(ChibiOS_symbol_list), sizeof(symbol_table_elem_t));
 
        for (i = 0; i < ARRAY_SIZE(ChibiOS_symbol_list); i++)
                (*symbol_list)[i].symbol_name = ChibiOS_symbol_list[i];
 
        for (i = 0; i < ARRAY_SIZE(ChibiOS_symbol_list); i++)
                (*symbol_list)[i].symbol_name = ChibiOS_symbol_list[i];
index 1e699c6adfe1983256c3bc76741fafc8dcc1c035..8f66c4ca0c98b6482a237670795c3b892f50054d 100644 (file)
@@ -390,8 +390,8 @@ static int FreeRTOS_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, ch
 static int FreeRTOS_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
 static int FreeRTOS_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = malloc(
-                       sizeof(symbol_table_elem_t) * ARRAY_SIZE(FreeRTOS_symbol_list));
+       *symbol_list = calloc(
+                       ARRAY_SIZE(FreeRTOS_symbol_list), sizeof(symbol_table_elem_t));
 
        for (i = 0; i < ARRAY_SIZE(FreeRTOS_symbol_list); i++)
                (*symbol_list)[i].symbol_name = FreeRTOS_symbol_list[i];
 
        for (i = 0; i < ARRAY_SIZE(FreeRTOS_symbol_list); i++)
                (*symbol_list)[i].symbol_name = FreeRTOS_symbol_list[i];
index 88470b62ff198c6a83ace509a08286bbc41edb23..fb9f5f7d916affd62774b532805ecb2c4d60bd21 100644 (file)
@@ -330,8 +330,8 @@ static int ThreadX_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, cha
 static int ThreadX_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
 static int ThreadX_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = malloc(
-                       sizeof(symbol_table_elem_t) * ARRAY_SIZE(ThreadX_symbol_list));
+       *symbol_list = calloc(
+                       ARRAY_SIZE(ThreadX_symbol_list), sizeof(symbol_table_elem_t));
 
        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];
index 62fb3b7bc29aa4a5f4e474c2006d330836dd8dfc..746172d6c568123a7e9153afaa170dd4ca1fb8d6 100644 (file)
@@ -359,8 +359,8 @@ 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;
 static int eCos_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = malloc(
-                       sizeof(symbol_table_elem_t) * ARRAY_SIZE(eCos_symbol_list));
+       *symbol_list = calloc(
+                       ARRAY_SIZE(eCos_symbol_list), sizeof(symbol_table_elem_t));
 
        for (i = 0; i < ARRAY_SIZE(eCos_symbol_list); i++)
                (*symbol_list)[i].symbol_name = eCos_symbol_list[i];
 
        for (i = 0; i < ARRAY_SIZE(eCos_symbol_list); i++)
                (*symbol_list)[i].symbol_name = eCos_symbol_list[i];
index 6cb42d14e8577cf543cb35a3804d5f234cdea39e..a8b07c39885273a06e043571d146e8fec26d7410 100644 (file)
@@ -335,7 +335,7 @@ static int embKernel_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, c
 static int embKernel_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
 static int embKernel_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
-       *symbol_list = malloc(sizeof(symbol_table_elem_t) * ARRAY_SIZE(embKernel_symbol_list));
+       *symbol_list = calloc(ARRAY_SIZE(embKernel_symbol_list), sizeof(symbol_table_elem_t));
 
        for (i = 0; i < ARRAY_SIZE(embKernel_symbol_list); i++)
                (*symbol_list)[i].symbol_name = embKernel_symbol_list[i];
 
        for (i = 0; i < ARRAY_SIZE(embKernel_symbol_list); i++)
                (*symbol_list)[i].symbol_name = embKernel_symbol_list[i];
index 9021d8c25476684f98032ebe11a002aa44b0646a..b4403af08c0e34cada343f55baaeb995738f8924 100644 (file)
@@ -329,7 +329,7 @@ static int linux_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
 {
        unsigned int i;
        *symbol_list = (symbol_table_elem_t *)
 {
        unsigned int i;
        *symbol_list = (symbol_table_elem_t *)
-               malloc(sizeof(symbol_table_elem_t) * ARRAY_SIZE(linux_symbol_list));
+               calloc(ARRAY_SIZE(linux_symbol_list), sizeof(symbol_table_elem_t));
 
        for (i = 0; i < ARRAY_SIZE(linux_symbol_list); i++)
                (*symbol_list)[i].symbol_name = linux_symbol_list[i];
 
        for (i = 0; i < ARRAY_SIZE(linux_symbol_list); i++)
                (*symbol_list)[i].symbol_name = linux_symbol_list[i];
index 735c1065b576ccde05586e6f00c1c859ec1d3467..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);
 }
 
        return target->rtos->gdb_thread_packet(connection, packet, packet_size);
 }
 
-static const 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;
 
 {
        symbol_table_elem_t *s;
 
@@ -155,18 +155,29 @@ static const char *next_symbol(struct rtos *os, char *cur_symbol, uint64_t cur_a
                os->type->get_symbol_list_to_lookup(&os->symbols);
 
        if (!cur_symbol[0])
                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++;
 
        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;
 }
 
                }
 
        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
 /* rtos_qsymbol() processes and replies to all qSymbol packets from GDB.
  *
  * GDB sends a qSymbol:: packet (empty address, empty name) to notify
@@ -192,7 +203,7 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        uint64_t addr = 0;
        size_t reply_len;
        char reply[GDB_BUFFER_SIZE], cur_sym[GDB_BUFFER_SIZE / 2] = "";
        uint64_t addr = 0;
        size_t reply_len;
        char reply[GDB_BUFFER_SIZE], cur_sym[GDB_BUFFER_SIZE / 2] = "";
-       const char *next_sym;
+       symbol_table_elem_t *next_sym = NULL;
        struct target *target = get_target_from_connection(connection);
        struct rtos *os = target->rtos;
 
        struct target *target = get_target_from_connection(connection);
        struct rtos *os = target->rtos;
 
@@ -206,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 */
        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);
                /* 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);
@@ -224,7 +237,7 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        }
        next_sym = next_symbol(os, cur_sym, addr);
 
        }
        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) {
                /* No more symbols need looking up */
 
                if (!target->rtos_auto_detect) {
@@ -242,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:");
                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);
 
 done:
        gdb_put_packet(connection, reply, reply_len);
index 980d95d51802e03f165ded8e257bd2a240d1a46a..7750f3c7fa8ee4c8227bff53b1b146e839002560 100644 (file)
@@ -35,7 +35,7 @@ struct reg;
 typedef struct symbol_table_elem_struct {
        const char *symbol_name;
        symbol_address_t address;
 typedef struct symbol_table_elem_struct {
        const char *symbol_name;
        symbol_address_t address;
-
+       bool optional;
 } symbol_table_elem_t;
 
 struct thread_detail {
 } symbol_table_elem_t;
 
 struct thread_detail {

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)