diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 547314c0a..cc0e92edf 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -11,6 +11,7 @@ #include "rtos.h" #include "target/target.h" +#include "target/smp.h" #include "helper/log.h" #include "helper/binarybuffer.h" #include "helper/types.h" @@ -715,10 +716,24 @@ int rtos_generic_stack_read(struct target *target, return ERROR_OK; } +struct rtos *rtos_from_target(struct target *target) +{ + if (target->rtos && target->rtos->type) + return target->rtos; + + struct target_list *pos; + foreach_smp_target(pos, target->smp_targets) + if (pos->target->rtos && pos->target->rtos->type) + return pos->target->rtos; + + return NULL; +} + int rtos_update_threads(struct target *target) { - if ((target->rtos) && (target->rtos->type)) - target->rtos->type->update_threads(target->rtos); + struct rtos *rtos = rtos_from_target(target); + if (rtos) + rtos->type->update_threads(rtos); return ERROR_OK; } diff --git a/src/rtos/rtos.h b/src/rtos/rtos.h index 2084739cf..17efccf0e 100644 --- a/src/rtos/rtos.h +++ b/src/rtos/rtos.h @@ -154,6 +154,11 @@ int rtos_write_buffer(struct target *target, target_addr_t address, bool rtos_needs_fake_step(struct target *target, int64_t thread_id); struct target *rtos_swbp_target(struct target *target, target_addr_t address, uint32_t length, enum breakpoint_type type); +/** + * Get the RTOS from the target itself, or from one of the targets in + * the same SMP node, or NULL when no RTOS is set. + */ +struct rtos *rtos_from_target(struct target *target); // Keep in alphabetic order this list of rtos extern const struct rtos_type chibios_rtos; diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index f09e4807e..a989bda57 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -813,9 +813,12 @@ static void gdb_signal_reply(struct target *target, struct connection *connectio sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "W00"); } else { struct target *ct; - if (target->rtos) { - target->rtos->current_threadid = target->rtos->current_thread; - target->rtos->gdb_target_for_threadid(connection, target->rtos->current_threadid, &ct); + struct rtos *rtos; + + rtos = rtos_from_target(target); + if (rtos) { + rtos->current_threadid = rtos->current_thread; + rtos->gdb_target_for_threadid(connection, rtos->current_threadid, &ct); } else { ct = target; } @@ -853,9 +856,9 @@ static void gdb_signal_reply(struct target *target, struct connection *connectio } current_thread[0] = '\0'; - if (target->rtos) + if (rtos) snprintf(current_thread, sizeof(current_thread), "thread:%" PRIx64 ";", - target->rtos->current_thread); + rtos->current_thread); sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "T%2.2x%s%s", signal_var, stop_reason, current_thread);