diff options
author | Jean-Jacques Hiblot | 2019-10-22 10:05:22 +0200 |
---|---|---|
committer | Simon Glass | 2019-10-27 13:01:53 -0600 |
commit | d60ae4c59df55c08dc96202ff58fed21ab3afb7d (patch) | |
tree | 1d22f0e91bf9091b7da037584cf12fa37f7b0ed4 | |
parent | 97b5f9d1a0dcae66cf7fe5e892f6dc56d14b0c21 (diff) |
fdt: Fix alignment issue when reading 64-bits properties from fdt
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>
-rw-r--r-- | common/fdt_support.c | 2 | ||||
-rw-r--r-- | drivers/core/ofnode.c | 2 | ||||
-rw-r--r-- | include/linux/libfdt_env.h | 1 | ||||
-rw-r--r-- | lib/fdtdec.c | 2 |
4 files changed, 4 insertions, 3 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c index baf7924ff61..68343990395 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -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; diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 297f0a0c7cc..8f0eab2ca62 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -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)); diff --git a/include/linux/libfdt_env.h b/include/linux/libfdt_env.h index e2bf79c7ee8..e49fcd72bd6 100644 --- a/include/linux/libfdt_env.h +++ b/include/linux/libfdt_env.h @@ -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) diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 17736ce6655..125d9dbf263 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -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); |