|
|
|
@ -644,7 +644,7 @@ static void ReadMemory() { |
|
|
|
|
|
|
|
auto start_offset = command_buffer + 1; |
|
|
|
auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); |
|
|
|
PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); |
|
|
|
VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); |
|
|
|
|
|
|
|
start_offset = addr_pos + 1; |
|
|
|
u32 len = |
|
|
|
@ -656,12 +656,14 @@ static void ReadMemory() { |
|
|
|
SendReply("E01"); |
|
|
|
} |
|
|
|
|
|
|
|
const u8* data = Memory::GetPointer(addr); |
|
|
|
if (!data) { |
|
|
|
if (!Memory::IsValidVirtualAddress(addr)) { |
|
|
|
return SendReply("E00"); |
|
|
|
} |
|
|
|
|
|
|
|
MemToGdbHex(reply, data, len); |
|
|
|
std::vector<u8> data(len); |
|
|
|
Memory::ReadBlock(addr, data.data(), len); |
|
|
|
|
|
|
|
MemToGdbHex(reply, data.data(), len); |
|
|
|
reply[len * 2] = '\0'; |
|
|
|
SendReply(reinterpret_cast<char*>(reply)); |
|
|
|
} |
|
|
|
@ -670,18 +672,20 @@ static void ReadMemory() { |
|
|
|
static void WriteMemory() { |
|
|
|
auto start_offset = command_buffer + 1; |
|
|
|
auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); |
|
|
|
PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); |
|
|
|
VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); |
|
|
|
|
|
|
|
start_offset = addr_pos + 1; |
|
|
|
auto len_pos = std::find(start_offset, command_buffer + command_length, ':'); |
|
|
|
u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset)); |
|
|
|
|
|
|
|
u8* dst = Memory::GetPointer(addr); |
|
|
|
if (!dst) { |
|
|
|
if (!Memory::IsValidVirtualAddress(addr)) { |
|
|
|
return SendReply("E00"); |
|
|
|
} |
|
|
|
|
|
|
|
GdbHexToMem(dst, len_pos + 1, len); |
|
|
|
std::vector<u8> data(len); |
|
|
|
|
|
|
|
GdbHexToMem(data.data(), len_pos + 1, len); |
|
|
|
Memory::WriteBlock(addr, data.data(), len); |
|
|
|
SendReply("OK"); |
|
|
|
} |
|
|
|
|
|
|
|
|