On Thu, Apr 19, 2018 at 04:00:47PM +0100, Mark Rutland wrote: > On Thu, Apr 19, 2018 at 12:33:10AM +0100, Michael Brown wrote: > > On 18/04/18 20:21, Heinrich Schuchardt wrote: > For better or worse, I don't think that it is sufficient to pass the > compiler -mno-unaligned-accesses, even if it happens to mask the problem > in this specific case. The compiler can validly assume structures have > their usual alignment, and hence the LDRD should not be misaligned.
I've just verified that this is the case: ---- struct foo { int a; int b; }; int foo_cmp (struct foo *f1) { return (f1->a == f1->b); }; ---- ... when compiled with: arm-linux-gnueabihf-gcc -mcpu=cortex-a15 -mabi=aapcs -mno-unaligned-access -O2 -c test.c ... yields: 00000000 <foo_cmp>: 0: e9d0 2000 ldrd r2, r0, [r0] 4: eba2 0000 sub.w r0, r2, r0 8: fab0 f080 clz r0, r0 c: ea4f 1050 mov.w r0, r0, lsr #5 10: 4770 bx lr 12: bf00 nop ... whereas using packed (rather than aligned(1), which I was wrong about): ---- struct foo { int a; int b; } __attribute__ ((packed)); int foo_cmp (struct foo *f1) { return (f1->a == f1->b); }; ---- ... when compiled allowing unaligned accesses with: arm-linux-gnueabihf-gcc -mcpu=cortex-a15 -mabi=aapcs -O2 -c test.c ... yields: 00000000 <foo_cmp>: 0: 6802 ldr r2, [r0, #0] 2: 6840 ldr r0, [r0, #4] 4: eba2 0000 sub.w r0, r2, r0 8: fab0 f080 clz r0, r0 c: ea4f 1050 mov.w r0, r0, lsr #5 10: 4770 bx lr 12: bf00 nop ... which should avoid alignment traps so long as SCTLR.A is clear to permit unaligned LDR. Thanks, Mark. _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel