fdt: Fix alignment issue when reading 64-bits properties from fdt
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Tue, 22 Oct 2019 08:05:22 +0000 (10:05 +0200)
committerSimon Glass <sjg@chromium.org>
Sun, 27 Oct 2019 19:01:53 +0000 (13:01 -0600)
The FDT specification [0] gives a requirement of aligning properties on
32-bits. Make sure that the compiler is aware of this constraint when
accessing 64-bits properties.

[0]: https://github.com/devicetree-org/devicetree-specification/blob/master/source/flattened-format.rst

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/fdt_support.c
drivers/core/ofnode.c
include/linux/libfdt_env.h
lib/fdtdec.c

index baf7924ff6126ede18548c746e28defc65eca635..68343990395084f5fadea890a8d093682c49479f 100644 (file)
@@ -1566,7 +1566,7 @@ static int fdt_read_prop(const fdt32_t *prop, int prop_len, int cell_off,
                         uint64_t *val, int cells)
 {
        const fdt32_t *prop32 = &prop[cell_off];
-       const fdt64_t *prop64 = (const fdt64_t *)&prop[cell_off];
+       const unaligned_fdt64_t *prop64 = (const fdt64_t *)&prop[cell_off];
 
        if ((cell_off + cells) > prop_len)
                return -FDT_ERR_NOSPACE;
index 297f0a0c7cc142880b41539e979b081972e16f16..8f0eab2ca6241856c0c958fe546c73b9043add29 100644 (file)
@@ -57,7 +57,7 @@ int ofnode_read_s32_default(ofnode node, const char *propname, s32 def)
 
 int ofnode_read_u64(ofnode node, const char *propname, u64 *outp)
 {
-       const fdt64_t *cell;
+       const unaligned_fdt64_t *cell;
        int len;
 
        assert(ofnode_valid(node));
index e2bf79c7ee8d63bf6bc29d6239b85a0487f5353a..e49fcd72bd60d3d54ab1314257c2e94ce2fbcc13 100644 (file)
@@ -16,6 +16,7 @@
 typedef __be16 fdt16_t;
 typedef __be32 fdt32_t;
 typedef __be64 fdt64_t;
+typedef __be64 unaligned_fdt64_t __aligned(4);
 
 #define fdt32_to_cpu(x) be32_to_cpu(x)
 #define cpu_to_fdt32(x) cpu_to_be32(x)
index 17736ce66554e0ce56e317480e7b12b64e73b399..125d9dbf26395c2262b338c6bb7d77d0e7a08bcb 100644 (file)
@@ -242,7 +242,7 @@ int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr,
 uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name,
                           uint64_t default_val)
 {
-       const uint64_t *cell64;
+       const unaligned_fdt64_t *cell64;
        int length;
 
        cell64 = fdt_getprop(blob, node, prop_name, &length);