This is an automated email from Gerrit.

Paul Fertser ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/2355

-- gerrit

commit 880daad27f0f257c9f1a10f6b49d8455ca1e9922
Author: Paul Fertser <[email protected]>
Date:   Sat Oct 25 11:20:10 2014 +0400

    rtos: allow symbols to be optional for a particular RTOS
    
    Default to non-optional.
    
    Change-Id: Ifc9ddb1ab701a19c3760f95da47da6f7d412ff2e
    Signed-off-by: Paul Fertser <[email protected]>

diff --git a/src/rtos/ChibiOS.c b/src/rtos/ChibiOS.c
index 46fdca3..ba14a28 100644
--- a/src/rtos/ChibiOS.c
+++ b/src/rtos/ChibiOS.c
@@ -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;
-       *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];
diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c
index 1e699c6..8f66c4c 100644
--- a/src/rtos/FreeRTOS.c
+++ b/src/rtos/FreeRTOS.c
@@ -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;
-       *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];
diff --git a/src/rtos/ThreadX.c b/src/rtos/ThreadX.c
index 88470b6..fb9f5f7 100644
--- a/src/rtos/ThreadX.c
+++ b/src/rtos/ThreadX.c
@@ -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;
-       *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];
diff --git a/src/rtos/eCos.c b/src/rtos/eCos.c
index 62fb3b7..746172d 100644
--- a/src/rtos/eCos.c
+++ b/src/rtos/eCos.c
@@ -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;
-       *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];
diff --git a/src/rtos/embKernel.c b/src/rtos/embKernel.c
index 6cb42d1..a8b07c3 100644
--- a/src/rtos/embKernel.c
+++ b/src/rtos/embKernel.c
@@ -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;
-       *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];
diff --git a/src/rtos/linux.c b/src/rtos/linux.c
index 9021d8c..b4403af 100644
--- a/src/rtos/linux.c
+++ b/src/rtos/linux.c
@@ -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 *)
-               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];
diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c
index 735c106..4439ed0 100644
--- a/src/rtos/rtos.c
+++ b/src/rtos/rtos.c
@@ -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 const char *next_symbol(struct rtos *os, char *cur_symbol, uint64_t 
cur_addr)
+symbol_table_elem_t *next_symbol(struct rtos *os, char *cur_symbol, uint64_t 
cur_addr)
 {
        symbol_table_elem_t *s;
 
@@ -155,13 +155,13 @@ 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])
-               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;
@@ -192,7 +192,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] = "";
-       const char *next_sym;
+       symbol_table_elem_t *next_sym = NULL;
        struct target *target = get_target_from_connection(connection);
        struct rtos *os = target->rtos;
 
@@ -206,7 +206,8 @@ 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 
found an address for a symbol */
+           !next_sym->optional) {                               /* 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);
@@ -242,13 +243,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);
diff --git a/src/rtos/rtos.h b/src/rtos/rtos.h
index 980d95d..7750f3c 100644
--- a/src/rtos/rtos.h
+++ b/src/rtos/rtos.h
@@ -35,7 +35,7 @@ struct reg;
 typedef struct symbol_table_elem_struct {
        const char *symbol_name;
        symbol_address_t address;
-
+       bool optional;
 } symbol_table_elem_t;
 
 struct thread_detail {

-- 

------------------------------------------------------------------------------
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to