From 884b52b397aaacd199764508d455a3889da3f623 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Thu, 10 Oct 2024 18:20:16 -0400 Subject: [PATCH] Make server a struct --- include/server.h | 9 ++++++++- main.c | 19 ++++++------------- server.c | 36 ++++++++++++++++++++++++------------ 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/include/server.h b/include/server.h index a8d35a0..0c831f3 100644 --- a/include/server.h +++ b/include/server.h @@ -6,6 +6,13 @@ #include #include -int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running); +typedef struct RdbServer { + VB *sim; + bool running; +} RdbServer; + +void rdb_server_init(RdbServer *srv, VB *sim); +int rdb_server_handle_command(RdbServer *srv, CommandBuf *cmd, RdbResponse *res); +int rdb_server_break(RdbServer *srv, RdbResponse *res); #endif \ No newline at end of file diff --git a/main.c b/main.c index f473537..011c657 100644 --- a/main.c +++ b/main.c @@ -23,16 +23,15 @@ int sleep_nanos(long int ns) { int server(int connfd, VB *sim) { RdbRequest req; RdbResponse res; + RdbServer srv; char reqbuf[BUFLEN]; char resbuf[BUFLEN]; - bool running; rdb_read_result_t read_result; int result; rdb_request_init(&req, connfd, reqbuf, BUFLEN); rdb_response_init(&res, connfd, resbuf, BUFLEN); - - running = false; + rdb_server_init(&srv, sim); while (1) { CommandBuf cmd; @@ -45,20 +44,14 @@ int server(int connfd, VB *sim) { printf("client has disconnected\n"); return 0; } else if (read_result == read_result_pending) { - if (running) { + if (srv.running) { cycles = MAX_STEP_CYCLES; brk = vbEmulate(sim, &cycles); if (brk) { /* We hit a breakpoint */ if (brk == -1) { /* actually, not implemented */ - running = false; - rdb_response_begin_packet(&res); - rdb_response_write_str(&res, "T05:thread:p1.t1;threads:p1.t1;"); - result = rdb_response_send_packet(&res); - if (result != 0) { - return result; - } + rdb_server_break(&srv, &res); } else { fprintf(stderr, "surprising response %d from vbEmulate\n", brk); return -1; @@ -71,11 +64,11 @@ int server(int connfd, VB *sim) { } else { printf("received command \"%.*s\"\n", (int) cmd.len, cmd.buf); fflush(stdout); - result = handle_command(&res, &cmd, sim, &running); + result = rdb_server_handle_command(&srv, &cmd, &res); if (result != 0) { return result; } - rdb_request_set_blocking(&req, !running); + rdb_request_set_blocking(&req, !srv.running); rdb_request_reset(&req); } diff --git a/server.c b/server.c index 03e104e..56a88e2 100644 --- a/server.c +++ b/server.c @@ -69,7 +69,12 @@ const uint32_t SYSTEM_REGISTERS[] = { const uint32_t PC_INDEX = 32 + 13; -int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { +void rdb_server_init(RdbServer *srv, VB *sim) { + srv->sim = sim; + srv->running = false; +} + +int rdb_server_handle_command(RdbServer *srv, CommandBuf *cmd, RdbResponse *res) { rdb_response_begin_packet(res); if (cmd_match_str(cmd, "QStartNoAckMode")) { @@ -149,11 +154,11 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { } if (reg_no == PC_INDEX) { - reg_value = vbGetProgramCounter(sim); + reg_value = vbGetProgramCounter(srv->sim); } else if (reg_no > 31) { - reg_value = vbGetSystemRegister(sim, SYSTEM_REGISTERS[reg_no - 32]); + reg_value = vbGetSystemRegister(srv->sim, SYSTEM_REGISTERS[reg_no - 32]); } else { - reg_value = vbGetProgramRegister(sim, reg_no); + reg_value = vbGetProgramRegister(srv->sim, reg_no); } rdb_response_write_i32_hex(res, reg_value); return rdb_response_send_packet(res); @@ -176,11 +181,11 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { return rdb_response_send_packet(res); } if (reg_no == PC_INDEX) { - vbSetProgramCounter(sim, reg_value); + vbSetProgramCounter(srv->sim, reg_value); } else if (reg_no > 31) { - vbSetSystemRegister(sim, SYSTEM_REGISTERS[reg_no - 32], reg_value); + vbSetSystemRegister(srv->sim, SYSTEM_REGISTERS[reg_no - 32], reg_value); } else { - vbSetProgramRegister(sim, reg_no, reg_value); + vbSetProgramRegister(srv->sim, reg_no, reg_value); } rdb_response_write_str(res, "OK"); return rdb_response_send_packet(res); @@ -193,12 +198,12 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { if (cmd_match_str(cmd, "c")) { /* The debugger has told us to run until we are stopped. */ /* Don't send a response to this until we receive an ETX (when the debugger pauses us). */ - *running = true; + srv->running = true; return 0; } if (cmd_match_str(cmd, "\x03")) { /* Received an ETX, indicating that the server wants to cancel the "c" command from before. */ - *running = false; + srv->running = false; /* Send the response to the "c" command from before. */ rdb_response_write_str(res, "T05thread:p1.t1;threads:p1.t1"); return rdb_response_send_packet(res); @@ -206,7 +211,7 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { if (cmd_match_str(cmd, "?")) { /* The debugger has asked us why we stopped */ rdb_response_write_str(res, "T"); - rdb_response_write_str(res, *running ? "00" : "05"); + rdb_response_write_str(res, srv->running ? "00" : "05"); rdb_response_write_str(res, "thread:p1.t1;threads:p1.t1;"); return rdb_response_send_packet(res); } @@ -218,7 +223,7 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { if (!cmd_match_hex_number(cmd, &len)) return -1; for (i = 0; i < len; ++i) { - uint8_t byte = vbRead(sim, address + i, VB_U8); + uint8_t byte = vbRead(srv->sim, address + i, VB_U8); rdb_response_write_i8_hex(res, byte); } return rdb_response_send_packet(res); @@ -234,7 +239,7 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { for (i = 0; i < len; ++i) { uint8_t byte; if (!cmd_match_hex_bytes(cmd, 1, &byte)) return -1; - vbWrite(sim, address + i, VB_U8, byte); + vbWrite(srv->sim, address + i, VB_U8, byte); } rdb_response_write_str(res, "OK"); return rdb_response_send_packet(res); @@ -243,3 +248,10 @@ int handle_command(RdbResponse *res, CommandBuf *cmd, VB *sim, bool *running) { return rdb_response_send_packet(res); } +int rdb_server_break(RdbServer *srv, RdbResponse *res) { + srv->running = false; + rdb_response_begin_packet(res); + rdb_response_write_str(res, "T05:thread:p1.t1;threads:p1.t1;"); + return rdb_response_send_packet(res); +} +