Re: [PATCH v6] rtems-debugger: Fixed 32bit pointers

2021-05-13 Thread Gedare Bloom
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

2021-05-12 Thread Stephen Clark
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