From 408dbeb9225e1969113b81ad3ef484f351b9b4e3 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Fri, 25 Nov 2022 12:18:07 +1100 Subject: 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) { -- cgit v1.2.3