X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fserver%2Fgdb_server.c;h=48015abcda1f8e4e65aace51151808f66bd9b911;hp=14925a2bf48329daa6557a7894166d837c52cd4b;hb=0961987a1916a498e65240cded359ab3c9b73f95;hpb=0a4c8990c29e61fd0c2796486519cdb256b8da3b diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 14925a2bf4..48015abcda 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -702,40 +702,44 @@ static void gdb_signal_reply(struct target *target, struct connection *connectio int sig_reply_len; int signal_var; - if (gdb_connection->ctrl_c) { - signal_var = 0x2; - gdb_connection->ctrl_c = 0; - } else - signal_var = gdb_last_signal(target); + if (target->debug_reason == DBG_REASON_EXIT) { + sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "W00"); + } else { + if (gdb_connection->ctrl_c) { + signal_var = 0x2; + gdb_connection->ctrl_c = 0; + } else + signal_var = gdb_last_signal(target); - stop_reason[0] = '\0'; - if (target->debug_reason == DBG_REASON_WATCHPOINT) { - enum watchpoint_rw hit_wp_type; - uint32_t hit_wp_address; + stop_reason[0] = '\0'; + if (target->debug_reason == DBG_REASON_WATCHPOINT) { + enum watchpoint_rw hit_wp_type; + uint32_t hit_wp_address; - if (watchpoint_hit(target, &hit_wp_type, &hit_wp_address) == ERROR_OK) { + if (watchpoint_hit(target, &hit_wp_type, &hit_wp_address) == ERROR_OK) { - switch (hit_wp_type) { - case WPT_WRITE: - snprintf(stop_reason, sizeof(stop_reason), - "watch:%08x;", hit_wp_address); - break; - case WPT_READ: - snprintf(stop_reason, sizeof(stop_reason), - "rwatch:%08x;", hit_wp_address); - break; - case WPT_ACCESS: - snprintf(stop_reason, sizeof(stop_reason), - "awatch:%08x;", hit_wp_address); - break; - default: - break; + switch (hit_wp_type) { + case WPT_WRITE: + snprintf(stop_reason, sizeof(stop_reason), + "watch:%08x;", hit_wp_address); + break; + case WPT_READ: + snprintf(stop_reason, sizeof(stop_reason), + "rwatch:%08x;", hit_wp_address); + break; + case WPT_ACCESS: + snprintf(stop_reason, sizeof(stop_reason), + "awatch:%08x;", hit_wp_address); + break; + default: + break; + } } } - } - sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "T%2.2x%s", - signal_var, stop_reason); + sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "T%2.2x%s", + signal_var, stop_reason); + } gdb_put_packet(connection, sig_reply, sig_reply_len); gdb_connection->frontend_state = TARGET_HALTED; @@ -860,6 +864,10 @@ static int gdb_target_callback_event_handler(struct target *target, { int retval; struct connection *connection = priv; + struct gdb_service *gdb_service = connection->service->priv; + + if (gdb_service->target != target) + return ERROR_OK; switch (event) { case TARGET_EVENT_GDB_HALT: