From b5c616b90ec3e2e75d48dc6765b06a86ca44e05f Mon Sep 17 00:00:00 2001 From: Evan Hunter Date: Thu, 3 Jan 2013 16:29:18 +0000 Subject: [PATCH] rtos: Fix regression preventing use of first RTOS & clean up rtos_qsymbol() ThreadX support was not working due to it being first in the list of RTOS - regression. Auto-detect off, an RTOS was always be marked as successfully detected, even if symbols are not found. Lines 223-227 were unnecessary as they are done in rtos_try_next() Added lots of comments Improved readability by separating: GDB not finding a symbol vs no more symbols being available Regression caused by patch which was allowed only 52 minutes for review : http://openocd.zylin.com/895 Change-Id: Ib4decb01db595ddb3796837c6d8338ce6b9a91ca Signed-off-by: Evan Hunter Reviewed-on: http://openocd.zylin.com/986 Tested-by: jenkins Reviewed-by: Freddie Chopin --- src/rtos/rtos.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 28bbe5ee16..61fc7936ff 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -199,13 +199,30 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) if (!os) goto done; - if (sscanf(packet, "qSymbol:%" SCNx64 ":", &addr)) - hex_to_str(cur_sym, strchr(packet + 8, ':') + 1); - else if (target->rtos_auto_detect && !rtos_try_next(target)) - goto done; + /* Decode any symbol name in the packet*/ + hex_to_str(cur_sym, strchr(packet + 8, ':') + 1); + + 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 */ + /* 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); + goto done; + } else { + /* Autodetecting RTOS - try next RTOS */ + if (!rtos_try_next(target)) + goto done; + /* Next RTOS selected - invalidate current symbol */ + cur_sym[0] = '\x00'; + + } + } next_sym = next_symbol(os, cur_sym, addr); + if (!next_sym) { + /* No more symbols need looking up */ + if (!target->rtos_auto_detect) { rtos_detected = 1; goto done; @@ -215,16 +232,10 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) LOG_OUTPUT("Auto-detected RTOS: %s\r\n", os->type->name); rtos_detected = 1; goto done; - } - - if (!rtos_try_next(target)) - goto done; - - os->type->get_symbol_list_to_lookup(&os->symbols); - - next_sym = os->symbols[0].symbol_name; - if (!next_sym) + } else { + LOG_WARNING("No RTOS could be auto-detected!"); goto done; + } } if (8 + (strlen(next_sym) * 2) + 1 > sizeof(reply)) { -- 2.30.2