Using 32bit types like uint32_t for pointers creates issues on 64 bit architectures like AArch64. Replaced occurrences of these with uintptr_t, which will work for both 32 and 64 bit architectures. Added hex_decode_addr function to rtems-debugger. --- .../rtems/debugger/rtems-debugger-server.h | 5 ++++ cpukit/libdebugger/rtems-debugger-server.c | 30 +++++++++++++++---- cpukit/libdebugger/rtems-debugger-target.c | 2 +- cpukit/libdebugger/rtems-debugger-target.h | 2 +- 4 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/cpukit/include/rtems/debugger/rtems-debugger-server.h b/cpukit/include/rtems/debugger/rtems-debugger-server.h index 2189aac873..beff302641 100644 --- a/cpukit/include/rtems/debugger/rtems-debugger-server.h +++ b/cpukit/include/rtems/debugger/rtems-debugger-server.h @@ -50,6 +50,11 @@ extern "C" { */ #define DB_UINT uint32_t +/** + * Data type for addresses. Here for 64bit support. + */ +#define DB_ADDR uintptr_t + /* * Debugger signals. */ diff --git a/cpukit/libdebugger/rtems-debugger-server.c b/cpukit/libdebugger/rtems-debugger-server.c index 975ec23a30..2ada418a79 100644 --- a/cpukit/libdebugger/rtems-debugger-server.c +++ b/cpukit/libdebugger/rtems-debugger-server.c @@ -154,6 +154,26 @@ hex_encode(int val) return "0123456789abcdef"[val & 0xf]; } +static inline DB_ADDR +hex_decode_addr(const uint8_t* data) +{ + DB_ADDR ui = 0; + size_t i; + if (data[0] == '-') { + if (data[1] == '1') + ui = (DB_ADDR) -1; + } + else { + for (i = 0; i < (sizeof(ui) * 2); ++i) { + int v = hex_decode(data[i]); + if (v < 0) + break; + ui = (ui << 4) | v; + } + } + return ui; +} + static inline DB_UINT hex_decode_uint(const uint8_t* data) { @@ -1438,10 +1458,10 @@ remote_read_memory(uint8_t* buffer, int size) if (comma == NULL) remote_packet_out_str(r_E01); else { - DB_UINT addr; + uintptr_t addr; DB_UINT length; int r; - addr = hex_decode_uint(&buffer[1]); + addr = hex_decode_addr(&buffer[1]); length = hex_decode_uint((const uint8_t*) comma + 1); remote_packet_out_reset(); r = rtems_debugger_target_start_memory_access(); @@ -1468,10 +1488,10 @@ remote_write_memory(uint8_t* buffer, int size) comma = strchr((const char*) buffer, ','); colon = strchr((const char*) buffer, ':'); if (comma != NULL && colon != NULL) { - DB_UINT addr; + uintptr_t addr; DB_UINT length; int r; - addr = hex_decode_uint(&buffer[1]); + addr = hex_decode_addr(&buffer[1]); length = hex_decode_uint((const uint8_t*) comma + 1); r = rtems_debugger_target_start_memory_access(); if (r == 0) { @@ -1521,7 +1541,7 @@ remote_breakpoints(bool insert, uint8_t* buffer, int size) uint32_t capabilities; DB_UINT addr; DB_UINT kind; - addr = hex_decode_uint((const uint8_t*) comma1 + 1); + addr = hex_decode_addr((const uint8_t*) comma1 + 1); kind = hex_decode_uint((const uint8_t*)comma2 + 1); capabilities = rtems_debugger_target_capabilities(); switch (buffer[1]) { diff --git a/cpukit/libdebugger/rtems-debugger-target.c b/cpukit/libdebugger/rtems-debugger-target.c index bf7579700d..34e4e84d2f 100644 --- a/cpukit/libdebugger/rtems-debugger-target.c +++ b/cpukit/libdebugger/rtems-debugger-target.c @@ -168,7 +168,7 @@ rtems_debugger_target_reg_table_size(void) } int -rtems_debugger_target_swbreak_control(bool insert, DB_UINT addr, DB_UINT kind) +rtems_debugger_target_swbreak_control(bool insert, uintptr_t addr, DB_UINT kind) { rtems_debugger_target* target = rtems_debugger->target; rtems_debugger_target_swbreak* swbreaks; diff --git a/cpukit/libdebugger/rtems-debugger-target.h b/cpukit/libdebugger/rtems-debugger-target.h index f2abbe5fd3..db356e1f07 100644 --- a/cpukit/libdebugger/rtems-debugger-target.h +++ b/cpukit/libdebugger/rtems-debugger-target.h @@ -200,7 +200,7 @@ extern void rtems_debugger_target_exception_print(CPU_Exception_frame* frame); * Software breakpoints. These are also referred to as memory breakpoints. */ extern int rtems_debugger_target_swbreak_control(bool insert, - DB_UINT addr, + uintptr_t addr, DB_UINT kind); /** -- 2.27.0 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel