From 52c9ae0aa1f1413e01e3599fc23b9e98147129b6 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Fri, 15 Sep 2023 09:42:16 -0700 Subject: [PATCH] server/gdb_server: Handle events if first target is unavailable When a target in an SMP group is unavailable, the gdb layer might get an event for a different target in that SMP group, but not one that is the primary target for that gdb connection. So propagate events if they're for any of the targets in the SMP group, not just if it's for the first one in that group. Change-Id: I8d6738762acc7c0aef96f56ce2cb7f2eeb233b33 Signed-off-by: Tim Newsome --- src/server/gdb_server.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 41a47bf3c8..c9cf9e660f 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -166,6 +166,24 @@ struct target *get_available_target_from_connection(struct connection *connectio return target; } +/** Return true iff the given connection includes the given target. */ +static bool gdb_connection_includes_target(struct connection *connection, struct target *target) +{ + struct gdb_service *gdb_service = connection->service->priv; + struct target *service_target = gdb_service->target; + if (service_target->smp) { + struct target_list *tlist; + foreach_smp_target(tlist, service_target->smp_targets) { + struct target *t = tlist->target; + if (t == target) + return true; + } + return false; + } + /* Non-SMP target. */ + return service_target == target; +} + static int gdb_last_signal(struct target *target) { switch (target->debug_reason) { @@ -988,9 +1006,9 @@ static int gdb_target_callback_event_handler(struct target *target, enum target_event event, void *priv) { struct connection *connection = priv; - struct target *gdb_target = get_available_target_from_connection(connection); - if (gdb_target != target) + /* Propagate this event if it's for any of the targets on this gdb connection. */ + if (!gdb_connection_includes_target(connection, target)) return ERROR_OK; switch (event) {