Re: [PATCH v6] rtems-debugger: Fixed 32bit pointers
On Wed, May 12, 2021 at 1:21 PM Stephen Clark wrote: > > 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_uintptr > function to rtems-debugger. > --- > cpukit/include/rtems/shellconfig.h | 8 ++ > cpukit/libdebugger/rtems-debugger-server.c | 32 ++ > cpukit/libdebugger/rtems-debugger-target.c | 2 +- > cpukit/libdebugger/rtems-debugger-target.h | 2 +- > 4 files changed, 36 insertions(+), 8 deletions(-) > > diff --git a/cpukit/include/rtems/shellconfig.h > b/cpukit/include/rtems/shellconfig.h > index c5fcf4a45e..07860fbbc3 100644 > --- a/cpukit/include/rtems/shellconfig.h > +++ b/cpukit/include/rtems/shellconfig.h > @@ -98,6 +98,7 @@ extern rtems_shell_cmd_t rtems_shell_RTRACE_Command; >extern rtems_shell_cmd_t rtems_shell_ROUTE_Command; >extern rtems_shell_cmd_t rtems_shell_NETSTATS_Command; >extern rtems_shell_cmd_t rtems_shell_PING_Command; > + extern rtems_shell_cmd_t rtems_shell_TTCP_Command; > #endif > > /* > @@ -516,6 +517,13 @@ extern rtems_shell_alias_t * const > rtems_shell_Initial_aliases[]; >defined(CONFIGURE_SHELL_COMMAND_PING) > _shell_PING_Command, >#endif > + > + #if (defined(CONFIGURE_SHELL_COMMANDS_ALL_NETWORKING) && \ > + !defined(CONFIGURE_SHELL_NO_COMMAND_TTCP)) || \ > + defined(CONFIGURE_SHELL_COMMAND_TTCP) > +_shell_TTCP_Command, > + #endif > + What's this stuff? > #endif > > /* Miscanellous shell commands */ > diff --git a/cpukit/libdebugger/rtems-debugger-server.c > b/cpukit/libdebugger/rtems-debugger-server.c > index 975ec23a30..c82ced2aa9 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 uintptr_t > +hex_decode_uintptr(const uint8_t* data) nit: I'd prefer you call it hex_decode_addr(). > +{ > + uintptr_t ui = 0; > + size_t i; > + if (data[0] == '-') { > +if (data[1] == '1') > + ui = (uintptr_t) -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([1]); > +addr = hex_decode_uintptr([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([1]); > +addr = hex_decode_uintptr([1]); > length = hex_decode_uint((const uint8_t*) comma + 1); > r = rtems_debugger_target_start_memory_access(); > if (r == 0) { > @@ -1519,9 +1539,9 @@ remote_breakpoints(bool insert, uint8_t* buffer, int > size) > comma2 = strchr(comma1 + 1, ','); > if (comma2 != NULL) { >uint32_t capabilities; > - DB_UINT addr; > + uintptr_t addr; >DB_UINT kind; > - addr = hex_decode_uint((const uint8_t*) comma1 + 1); > + addr = hex_decode_uintptr((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);
[PATCH v6] rtems-debugger: Fixed 32bit pointers
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_uintptr function to rtems-debugger. --- cpukit/include/rtems/shellconfig.h | 8 ++ cpukit/libdebugger/rtems-debugger-server.c | 32 ++ cpukit/libdebugger/rtems-debugger-target.c | 2 +- cpukit/libdebugger/rtems-debugger-target.h | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/cpukit/include/rtems/shellconfig.h b/cpukit/include/rtems/shellconfig.h index c5fcf4a45e..07860fbbc3 100644 --- a/cpukit/include/rtems/shellconfig.h +++ b/cpukit/include/rtems/shellconfig.h @@ -98,6 +98,7 @@ extern rtems_shell_cmd_t rtems_shell_RTRACE_Command; extern rtems_shell_cmd_t rtems_shell_ROUTE_Command; extern rtems_shell_cmd_t rtems_shell_NETSTATS_Command; extern rtems_shell_cmd_t rtems_shell_PING_Command; + extern rtems_shell_cmd_t rtems_shell_TTCP_Command; #endif /* @@ -516,6 +517,13 @@ extern rtems_shell_alias_t * const rtems_shell_Initial_aliases[]; defined(CONFIGURE_SHELL_COMMAND_PING) _shell_PING_Command, #endif + + #if (defined(CONFIGURE_SHELL_COMMANDS_ALL_NETWORKING) && \ + !defined(CONFIGURE_SHELL_NO_COMMAND_TTCP)) || \ + defined(CONFIGURE_SHELL_COMMAND_TTCP) +_shell_TTCP_Command, + #endif + #endif /* Miscanellous shell commands */ diff --git a/cpukit/libdebugger/rtems-debugger-server.c b/cpukit/libdebugger/rtems-debugger-server.c index 975ec23a30..c82ced2aa9 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 uintptr_t +hex_decode_uintptr(const uint8_t* data) +{ + uintptr_t ui = 0; + size_t i; + if (data[0] == '-') { +if (data[1] == '1') + ui = (uintptr_t) -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([1]); +addr = hex_decode_uintptr([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([1]); +addr = hex_decode_uintptr([1]); length = hex_decode_uint((const uint8_t*) comma + 1); r = rtems_debugger_target_start_memory_access(); if (r == 0) { @@ -1519,9 +1539,9 @@ remote_breakpoints(bool insert, uint8_t* buffer, int size) comma2 = strchr(comma1 + 1, ','); if (comma2 != NULL) { uint32_t capabilities; - DB_UINT addr; + uintptr_t addr; DB_UINT kind; - addr = hex_decode_uint((const uint8_t*) comma1 + 1); + addr = hex_decode_uintptr((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(boolinsert, - DB_UINT addr, + uintptr_t addr, DB_UINT kind); /** -- 2.27.0