diff --git a/src/gdbstub/gdbstub.c b/src/gdbstub/gdbstub.c index f98d6bc..2caa5c8 100644 --- a/src/gdbstub/gdbstub.c +++ b/src/gdbstub/gdbstub.c @@ -1,6 +1,8 @@ #include "gdbstub.h" #include "cpu/rv32cpu.h" +#include "memory/memory.h" +#include "memory/mmu/mmu.h" #include #include @@ -218,6 +220,43 @@ void gdbstub_thread_gdb() gdbstub_send_packet("OK", 2); } + else if(packet[0] == 'm') + { + // m : read memory at address,length + uint32_t address; + uint32_t length; + sscanf(packet + 1, "%x,%x", &address, &length); + + char data[length * 2 + 1]; + for(size_t i = 0; i < length; i++) + { + uint32_t value = memory[mmu_translate(address + i)]; + snprintf(data + i * 2, 3, "%02x", value); + } + + gdbstub_send_packet(data, length * 2); + } + else if(packet[0] == 'M') + { + // M : write memory at address,length:data + uint32_t address; + uint32_t length; + sscanf(packet + 1, "%x,%x:", &address, &length); + + uint32_t data_start = 1; + while(*(packet + data_start) != ':') + data_start++; + data_start++; + + for(size_t i = 0; i < length; i++) + { + uint32_t value; + sscanf(packet + data_start + i * 2, "%02x", &value); + memory[mmu_translate(address + i)] = value; + } + + gdbstub_send_packet("OK", 2); + } else if(packet[0] == 's') { // s : single-step