diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2020-04-14 15:02:51 +1000 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2020-04-14 15:02:51 +1000 |
commit | b28464a550c536296439b5785ed8852d1e15b35b (patch) | |
tree | f8d72aa136e484629d35f9f5c7e799946367aaf7 /flattree.c | |
parent | 87a656ae5ff96c4903e68eb2f999532a3b98e3a7 (diff) | |
download | dtc-b28464a550c536296439b5785ed8852d1e15b35b.zip dtc-b28464a550c536296439b5785ed8852d1e15b35b.tar.gz dtc-b28464a550c536296439b5785ed8852d1e15b35b.tar.bz2 |
Fix some potential unaligned accesses in dtc
Because of the convention of packed representations in property layouts,
it's not uncommon to have integer values in properties which aren't
naturally aligned. Thus, there are several places in the dtc code where we
cast a potentially unaligned byte pointer into an integer pointer and load
it directly. On a number of architectures (including sparc64 and arm) this
won't work and will cause a fault. In some cases it may be trapped and
emulated by the kernel, but not always.
Therefore, replace such direct unaligned reads with a helper which will
handle unaligned data reads (a variant on the fdtXX_ld() functions already
used in libfdt).
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'flattree.c')
-rw-r--r-- | flattree.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -156,7 +156,7 @@ static void asm_emit_data(void *e, struct data d) emit_offset_label(f, m->ref, m->offset); while ((d.len - off) >= sizeof(uint32_t)) { - asm_emit_cell(e, fdt32_to_cpu(*((fdt32_t *)(d.val+off)))); + asm_emit_cell(e, dtb_ld32(d.val + off)); off += sizeof(uint32_t); } |