gdbstub: ctrl-c command support
This commit is contained in:
parent
6b9e5c766b
commit
629fa5fc56
|
@ -24,6 +24,7 @@ socket_t gdbstub_server_socket;
|
||||||
socket_t gdb_socket;
|
socket_t gdb_socket;
|
||||||
|
|
||||||
void gdbstub_thread_gdb();
|
void gdbstub_thread_gdb();
|
||||||
|
static void gdbstub_handle_ctrlc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Receive a packet from client gdb
|
* 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);
|
recv(gdb_socket, &data, 1, 0);
|
||||||
|
|
||||||
// Start of packet symbol is '$'
|
// Start of packet symbol is '$'
|
||||||
// Skip data that is not packet (should only be ACK '+')
|
// Skip data that is not packet
|
||||||
if(data != '$')
|
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
|
// Receive packet until end of packet '#' symbol
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
@ -153,6 +172,7 @@ void gdbstub_thread_gdb()
|
||||||
// Analyse packet to respond correctly
|
// Analyse packet to respond correctly
|
||||||
if(packet[0] == '?')
|
if(packet[0] == '?')
|
||||||
{
|
{
|
||||||
|
// Halt Reason : Signal 05 (SIGTRAP)
|
||||||
char* resp = "S05";
|
char* resp = "S05";
|
||||||
gdbstub_send_packet(resp, 3);
|
gdbstub_send_packet(resp, 3);
|
||||||
}
|
}
|
||||||
|
@ -198,6 +218,38 @@ void gdbstub_thread_gdb()
|
||||||
|
|
||||||
gdbstub_send_packet("OK", 2);
|
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();
|
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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue