aboutsummaryrefslogtreecommitdiff
path: root/src/rtos/rtos.c
diff options
context:
space:
mode:
authorZied Guermazi <guermazi.zied@gmail.com>2013-06-02 22:21:20 +0200
committerSpencer Oliver <spen@spen-soft.co.uk>2013-07-01 08:38:32 +0000
commita6863e9a52c227086d874ef033de2499005ae318 (patch)
treebf07b541505e495c389174d5b31e68c9ee57bf3e /src/rtos/rtos.c
parent146dfe32956de7d0fe1912a91c5268728ac0b7e0 (diff)
downloadriscv-openocd-a6863e9a52c227086d874ef033de2499005ae318.zip
riscv-openocd-a6863e9a52c227086d874ef033de2499005ae318.tar.gz
riscv-openocd-a6863e9a52c227086d874ef033de2499005ae318.tar.bz2
keep gdb aware of threads if RTOS is set but no threads are created
if gdb server (openocd) answers qfThreadInfo with an empty string during boot, gdb will not request thread info anymore. to keep thread awareness in gdb, we have to answer with a non empty string, 'l' indicates an end of list, and is a valid answer here. Change-Id: I7870a5db1090c786f306db16a25871e69b8a9760 Signed-off-by: Zied Guermazi <guermazi.zied@gmail.com> Reviewed-on: http://openocd.zylin.com/1432 Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/rtos/rtos.c')
-rw-r--r--src/rtos/rtos.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c
index 28d0a9e..90763c2 100644
--- a/src/rtos/rtos.c
+++ b/src/rtos/rtos.c
@@ -327,19 +327,20 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s
return ERROR_OK;
} else if (strncmp(packet, "qfThreadInfo", 12) == 0) {
int i;
- if ((target->rtos != NULL) && (target->rtos->thread_count != 0)) {
-
- char *out_str = (char *) malloc(17 * target->rtos->thread_count + 5);
- char *tmp_str = out_str;
- tmp_str += sprintf(tmp_str, "m");
- for (i = 0; i < target->rtos->thread_count; i++) {
- if (i != 0)
- tmp_str += sprintf(tmp_str, ",");
- tmp_str += sprintf(tmp_str, "%016" PRIx64,
- target->rtos->thread_details[i].threadid);
+ if (target->rtos != NULL) {
+ if (target->rtos->thread_count == 0) {
+ 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 *tmp_str = out_str;
+ for (i = 0; i < target->rtos->thread_count; i++) {
+ tmp_str += sprintf(tmp_str, "%c%016" PRIx64, i == 0 ? 'm' : ',',
+ target->rtos->thread_details[i].threadid);
+ }
+ gdb_put_packet(connection, out_str, strlen(out_str));
+ free(out_str);
}
- tmp_str[0] = 0;
- gdb_put_packet(connection, out_str, strlen(out_str));
} else
gdb_put_packet(connection, "", 0);
@@ -441,6 +442,7 @@ int rtos_generic_stack_read(struct target *target,
address -= stacking->stack_registers_size;
retval = target_read_buffer(target, address, stacking->stack_registers_size, stack_data);
if (retval != ERROR_OK) {
+ free(stack_data);
LOG_ERROR("Error reading stack frame from thread");
return retval;
}
@@ -475,6 +477,7 @@ int rtos_generic_stack_read(struct target *target,
stack_data[stacking->register_offsets[i].offset + j]);
}
}
+ free(stack_data);
/* LOG_OUTPUT("Output register string: %s\r\n", *hex_reg_list); */
return ERROR_OK;
}