|
|
|
@ -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 != '$') |
|
|
|
|
{ |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|