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

Reply via email to