From 629fa5fc565a7c8a67fa7c3eb46babdff10cf19e Mon Sep 17 00:00:00 2001 From: vhaudiquet Date: Sun, 8 Oct 2023 15:15:34 +0200 Subject: [PATCH] gdbstub: ctrl-c command support --- src/gdbstub/gdbstub.c | 56 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/gdbstub/gdbstub.c b/src/gdbstub/gdbstub.c index 5da7480..f98d6bc 100644 --- a/src/gdbstub/gdbstub.c +++ b/src/gdbstub/gdbstub.c @@ -24,6 +24,7 @@ socket_t gdbstub_server_socket; socket_t gdb_socket; void gdbstub_thread_gdb(); +static void gdbstub_handle_ctrlc(); /* * Receive a packet from client gdb @@ -35,9 +36,27 @@ static void gdbstub_recv_packet(char* packet, ssize_t* size) recv(gdb_socket, &data, 1, 0); // Start of packet symbol is '$' - // Skip data that is not packet (should only be ACK '+') + // Skip data that is not packet if(data != '$') - return gdbstub_recv_packet(packet, size); + { + switch(data) + { + case '+': + // '+' : ACK + // We ignore ACK, so read next + return gdbstub_recv_packet(packet, size); + break; + case 0x3: + // 0x3 : COMMAND CTRL-C (interrupt execution) + gdbstub_handle_ctrlc(); + return gdbstub_recv_packet(packet, size); + break; + default: + // Ignore unknown data + return gdbstub_recv_packet(packet, size); + break; + } + } // Receive packet until end of packet '#' symbol size_t i = 0; @@ -153,6 +172,7 @@ void gdbstub_thread_gdb() // Analyse packet to respond correctly if(packet[0] == '?') { + // Halt Reason : Signal 05 (SIGTRAP) char* resp = "S05"; gdbstub_send_packet(resp, 3); } @@ -198,6 +218,38 @@ void gdbstub_thread_gdb() gdbstub_send_packet("OK", 2); } + else if(packet[0] == 's') + { + // s : single-step + + // Send back halt reason + // Halt Reason : Signal 05 (SIGTRAP) + char* resp = "S05"; + gdbstub_send_packet(resp, 3); + } + else if(packet[0] == 'c') + { + // c : continue until something happens + + // Send an ACK + send(gdb_socket, "+", 1, 0); + + // Continue simulation + } else gdbstub_send_unsupported(); } } + +/* + * Handles the GDB CTRL+C (^C) command, that + * should interrupt the simulation + */ +static void gdbstub_handle_ctrlc() +{ + // Halt the simulation + + // Send back halt signal to gdb + // Halt Reason : Signal 05 (SIGTRAP) + char* resp = "S05"; + gdbstub_send_packet(resp, 3); +}