Make server a struct
This commit is contained in:
		
							parent
							
								
									57403690ff
								
							
						
					
					
						commit
						884b52b397
					
				| 
						 | 
				
			
			@ -6,6 +6,13 @@
 | 
			
		|||
#include <stdbool.h>
 | 
			
		||||
#include <vb.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										19
									
								
								main.c
								
								
								
								
							
							
						
						
									
										19
									
								
								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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										36
									
								
								server.c
								
								
								
								
							
							
						
						
									
										36
									
								
								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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue