On Mon, Apr 11, 2016 at 11:08:02PM +0200, Marek Vasut wrote: > >>> + val = fdt_getprop(gd->fdt_blob, offset, "reg", &len); > >>> + if (len < sizeof(*val) * 4) > >>> + return -EINVAL; > >>> + > >>> + /* Don't use fdt64_t to avoid unaligned access */ > >> > >> This looks iffy, can you elaborate on this issue ? > > > > I was getting a "Synchronous Abort handler, esr 0x96000021" which > > seemed to indicate a alignment fault, but thinking again about it I'm > > not sure anymore of the real cause. fdt64_t and fdt64_to_cpu() don't > > work here, I will try to investigate better why. Suggestions are > > welcome :) > > Toolchain issues ? Stack alignment issue ?
So, after some investigation, the reason is that the code runs when caches are still disabled and thus all the memory is treated as Device-nGnRnE, requiring aligned accesses. The return value of fdt_getprop() is guaranteed to be aligned to a 4 byte boundary (but not 8) and therefore a 32-bit type must be used to avoid alignment faults. Probably the comment should be updated to explain this better. Beniamino _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot