From 2380856d5d36c84dfd36afd594a3ec2cc481e8b1 Mon Sep 17 00:00:00 2001 From: Jannik Vogel Date: Mon, 10 Jul 2017 12:48:11 +0200 Subject: [PATCH 1/3] Redesign memory access functions --- dbg.proto | 12 ++++++------ dbg.py | 20 +++++++++++--------- dbgd.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/dbg.proto b/dbg.proto index 338be5f..80f662d 100644 --- a/dbg.proto +++ b/dbg.proto @@ -22,9 +22,9 @@ message Request { required Type type = 1; // optional string msg = 2; // DEBUG_PRINT - optional int32 address = 3; // FREE, MEM_READ, MEM_WRITE - optional int32 size = 4; // MALLOC, MEM_READ, MEM_WRITE - optional int64 value = 5; // MEM_WRITE + optional uint32 address = 3; // FREE, MEM_READ, MEM_WRITE + optional uint32 size = 4; // MALLOC, MEM_READ + optional bytes data = 5; // MEM_WRITE } message Response { @@ -37,7 +37,7 @@ message Response { required Type type = 1; // optional string msg = 2; // optional SysInfo info = 3; // SYSINFO - optional int32 address = 4; // MALLOC - optional int32 size = 5; // - optional int64 value = 6; // MEM_READ + optional uint32 address = 4; // MALLOC + optional uint32 size = 5; // + optional bytes data = 6; // MEM_READ } diff --git a/dbg.py b/dbg.py index f9d679f..1f833e0 100755 --- a/dbg.py +++ b/dbg.py @@ -58,17 +58,19 @@ def free(self, addr): req.address = addr return self._send_simple_request(req) - def mem(self, addr, value=None): + def mem(self, addr, size=0, data=None): """Read/write system memory""" - write = value is not None + write = data is not None req = Request() - req.type = Request.MEM_WRITE if write else Request.MEM_READ - req.address = addr - req.size = 1 # TODO: Support word, dword, qword accesses if write: - req.value = value + req.type = Request.MEM_WRITE + req.data = data + else: + req.type = Request.MEM_READ + req.size = size + req.address = addr res = self._send_simple_request(req) - return res if write else res.value + return res if write else res.data def debug_print(self, string): """Print a debug string to the screen""" @@ -109,8 +111,8 @@ def main(): addr = xbox.malloc(1024) val = 0x5A print("Allocated memory at 0x%x" % addr) - xbox.mem(addr, val) - assert(xbox.mem(addr) == val) + xbox.mem(addr, data=bytes([val])) + assert(xbox.mem(addr, size=1)[0] == val) xbox.free(addr) #xbox.reboot() diff --git a/dbgd.c b/dbgd.c index 096a282..4930655 100644 --- a/dbgd.c +++ b/dbgd.c @@ -211,21 +211,55 @@ static int dbgd_mem_read(Dbg__Request *req, Dbg__Response *res) res->address = req->address; res->has_address = 1; - res->size = 1; /* FIXME: add word, dword, qword support */ - res->has_size = 1; + res->data.len = req->size; + res->data.data = malloc(res->data.len); + res->has_data = 1; - res->value = *((uint8_t*)(req->address)); - res->has_value = 1; + unsigned int i = 0; + unsigned int s = req->size; + + while(s >= 4) { + *(uint32_t*)&res->data.data[i] = *(volatile uint32_t*)(req->address + i); + i += 4; + s -= 4; + } + while(s >= 2) { + *(uint16_t*)&res->data.data[i] = *(volatile uint16_t*)(req->address + i); + i += 2; + s -= 2; + } + while(s >= 1) { + *(uint8_t*)&res->data.data[i] = *(volatile uint8_t*)(req->address + i); + i += 1; + s -= 1; + } return DBG__RESPONSE__TYPE__OK; } static int dbgd_mem_write(Dbg__Request *req, Dbg__Response *res) { - if (!req->has_address || !req->has_size || !req->has_value) + if (!req->has_address || !req->has_data) return DBG__RESPONSE__TYPE__ERROR_INCOMPLETE_REQUEST; - *((uint8_t*)(req->address)) = (uint8_t)req->value; + unsigned int i = 0; + unsigned int s = req->data.len; + + while(s >= 4) { + *(volatile uint32_t*)(req->address + i) = *(uint32_t*)&req->data.data[i]; + i += 4; + s -= 4; + } + while(s >= 2) { + *(volatile uint16_t*)(req->address + i) = *(uint16_t*)&req->data.data[i]; + i += 2; + s -= 2; + } + while(s >= 1) { + *(volatile uint8_t*)(req->address + i) = *(uint8_t*)&req->data.data[i]; + i += 1; + s -= 1; + } return DBG__RESPONSE__TYPE__OK; } From a61289e94c10823d666d5af7109c35d756ea26a4 Mon Sep 17 00:00:00 2001 From: Jannik Vogel Date: Mon, 10 Jul 2017 16:15:45 +0200 Subject: [PATCH 2/3] Split `mem()` into `mem_read()` and `mem_write()` --- dbg.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/dbg.py b/dbg.py index 1f833e0..38e2c11 100755 --- a/dbg.py +++ b/dbg.py @@ -58,19 +58,21 @@ def free(self, addr): req.address = addr return self._send_simple_request(req) - def mem(self, addr, size=0, data=None): - """Read/write system memory""" - write = data is not None + def mem_read(self, addr, size): + """read memory""" req = Request() - if write: - req.type = Request.MEM_WRITE - req.data = data - else: - req.type = Request.MEM_READ - req.size = size + req.type = Request.MEM_READ + req.size = size req.address = addr - res = self._send_simple_request(req) - return res if write else res.data + return self._send_simple_request(req).data + + def mem_write(self, addr, data): + """write memory""" + req = Request() + req.type = Request.MEM_WRITE + req.data = data + req.address = addr + return self._send_simple_request(req) def debug_print(self, string): """Print a debug string to the screen""" @@ -111,8 +113,8 @@ def main(): addr = xbox.malloc(1024) val = 0x5A print("Allocated memory at 0x%x" % addr) - xbox.mem(addr, data=bytes([val])) - assert(xbox.mem(addr, size=1)[0] == val) + xbox.mem_write(addr, bytes([val])) + assert(xbox.mem_read(addr, 1)[0] == val) xbox.free(addr) #xbox.reboot() From 6fc38a2b68269a3ccf4dfa4cfc24fcbadacd2d84 Mon Sep 17 00:00:00 2001 From: Jannik Vogel Date: Mon, 16 Jul 2018 01:46:06 +0200 Subject: [PATCH 3/3] Use a growing buffer for transfers --- dbgd.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dbgd.c b/dbgd.c index 4930655..3ff1a9a 100644 --- a/dbgd.c +++ b/dbgd.c @@ -30,6 +30,20 @@ #define HTTPD_DEBUG LWIP_DBG_OFF #endif +static void* get_transfer_buffer(uint32_t size) { + static uint32_t buffer_size = 0; + static void* buffer = NULL; + + if (size > buffer_size) { + if (buffer != NULL) { + free(buffer); + } + buffer = malloc(size); + buffer_size = size; + } + return buffer; +} + static int dbgd_sysinfo(Dbg__Request *req, Dbg__Response *res); static int dbgd_reboot(Dbg__Request *req, Dbg__Response *res); static int dbgd_malloc(Dbg__Request *req, Dbg__Response *res); @@ -212,7 +226,7 @@ static int dbgd_mem_read(Dbg__Request *req, Dbg__Response *res) res->has_address = 1; res->data.len = req->size; - res->data.data = malloc(res->data.len); + res->data.data = get_transfer_buffer(res->data.len); res->has_data = 1; unsigned int i = 0;