[rtems commit] libmisc/rtems-fdt: Support prop map items up to the size of uintptr_t

Chris Johns chrisj at rtems.org
Sun Nov 27 22:53:26 UTC 2022


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

Author:    Chris Johns <chrisj at rtems.org>
Date:      Fri Nov 25 12:18:07 2022 +1100

libmisc/rtems-fdt: Support prop map items up to the size of uintptr_t

Updates #4729

---

 cpukit/include/rtems/rtems-fdt.h     |  6 ++++++
 cpukit/libmisc/rtems-fdt/rtems-fdt.c | 19 +++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/cpukit/include/rtems/rtems-fdt.h b/cpukit/include/rtems/rtems-fdt.h
index 18e04352aa..e3ebfe3ba4 100644
--- a/cpukit/include/rtems/rtems-fdt.h
+++ b/cpukit/include/rtems/rtems-fdt.h
@@ -694,6 +694,12 @@ const char *rtems_fdt_entry_name(rtems_fdt_handle* handle, int id);
  */
 int rtems_fdt_entry_offset(rtems_fdt_handle* handle, int id);
 
+/*
+ * Helper function to convert the void* property result of unknown
+ * length to an unsigned int pointer value.
+ */
+uintptr_t rtems_fdt_get_offset_len_uintptr(const void* prop, int offset, int len);
+
 /*
  * Helper function to convert the void* property result to a 32bit unsigned int.
  */
diff --git a/cpukit/libmisc/rtems-fdt/rtems-fdt.c b/cpukit/libmisc/rtems-fdt/rtems-fdt.c
index e5bab21664..ec8f270eef 100644
--- a/cpukit/libmisc/rtems-fdt/rtems-fdt.c
+++ b/cpukit/libmisc/rtems-fdt/rtems-fdt.c
@@ -1063,18 +1063,33 @@ rtems_fdt_prop_map(const char* const path,
       return length;
     }
 
-    if (length != sizeof (uintptr_t))
+    if (length > sizeof (uintptr_t))
     {
       rtems_fdt_release_handle (&fdt);
       return -RTEMS_FDT_ERR_BADPATH;
     }
 
-    values[item] = rtems_fdt_get_uintptr(prop);
+    values[item] = rtems_fdt_get_offset_len_uintptr(prop, 0, length);
   }
 
   return 0;
 }
 
+uintptr_t
+rtems_fdt_get_offset_len_uintptr (const void* prop, int offset, int len)
+{
+  const uint8_t* p = prop;
+  uintptr_t      value = 0;
+  int            b;
+  if (len <= sizeof(uintptr_t)) {
+    for (b = 0; b < len; ++b) {
+      value = (value << 8) | (uintptr_t) p[offset++];
+    }
+  }
+  return value;
+}
+
+
 uint32_t
 rtems_fdt_get_offset_uint32 (const void* prop, int offset)
 {



More information about the vc mailing list