From: Tom Rini <tr...@konsulko.com>

The device tree must be loaded in to memory at an 8-byte aligned
address.  Add a check for this condition in fdt_ro_probe_() and a new
error code to return if we are not.

Signed-off-by: Tom Rini <tr...@konsulko.com>
Message-Id: <20201104130605.28874-1-tr...@konsulko.com>
Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
---
 cpukit/dtc/libfdt/fdt.c | 4 ++++
 cpukit/include/libfdt.h | 6 +++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/cpukit/dtc/libfdt/fdt.c b/cpukit/dtc/libfdt/fdt.c
index 6cf2fa03b0..3e893073da 100644
--- a/cpukit/dtc/libfdt/fdt.c
+++ b/cpukit/dtc/libfdt/fdt.c
@@ -22,6 +22,10 @@ int32_t fdt_ro_probe_(const void *fdt)
        if (can_assume(VALID_DTB))
                return totalsize;
 
+       /* The device tree must be at an 8-byte aligned address */
+       if ((uintptr_t)fdt & 7)
+               return -FDT_ERR_ALIGNMENT;
+
        if (fdt_magic(fdt) == FDT_MAGIC) {
                /* Complete tree */
                if (!can_assume(LATEST)) {
diff --git a/cpukit/include/libfdt.h b/cpukit/include/libfdt.h
index 5979832305..89adee3cd7 100644
--- a/cpukit/include/libfdt.h
+++ b/cpukit/include/libfdt.h
@@ -101,7 +101,11 @@ extern "C" {
        /* FDT_ERR_BADFLAGS: The function was passed a flags field that
         * contains invalid flags or an invalid combination of flags. */
 
-#define FDT_ERR_MAX            18
+#define FDT_ERR_ALIGNMENT      19
+       /* FDT_ERR_ALIGNMENT: The device tree base address is not 8-byte
+        * aligned. */
+
+#define FDT_ERR_MAX            19
 
 /* constants */
 #define FDT_MAX_PHANDLE 0xfffffffe
-- 
2.31.1

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to