[rtems commit] rtems-debugger: Fixed pointer types to work on 32 and 64 bit architectures

Joel Sherrill joel at rtems.org
Wed Oct 27 18:22:13 UTC 2021


Module:    rtems
Branch:    master
Commit:    9b088157edeeaac688ea196abcfb111bf4de6f1f
Changeset: http://git.rtems.org/rtems/commit/?id=9b088157edeeaac688ea196abcfb111bf4de6f1f

Author:    Stephen Clark <stephen.clark at oarcorp.com>
Date:      Thu May 13 10:13:57 2021 -0500

rtems-debugger: Fixed pointer types to work on 32 and 64 bit architectures

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.

---

 cpukit/libdebugger/rtems-debugger-server.c | 32 ++++++++++++++++++++++++------
 cpukit/libdebugger/rtems-debugger-target.c |  2 +-
 cpukit/libdebugger/rtems-debugger-target.h |  2 +-
 3 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/cpukit/libdebugger/rtems-debugger-server.c b/cpukit/libdebugger/rtems-debugger-server.c
index 975ec23..9de9421 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_addr(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(&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) {
@@ -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_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 bf75797..34e4e84 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 f2abbe5..db356e1 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);
 
 /**



More information about the vc mailing list