[ipxe-devel] [PATCH 1/1] [efi] avoid unaligned read in efi_devpath_end()

Michael Brown mcb30 at ipxe.org
Wed Mar 28 19:25:29 UTC 2018


On 28/03/18 20:23, Heinrich Schuchardt wrote:
> 00000000 <efi_devpath_end>:
>     0:   7803            ldrb    r3, [r0, #0]  <<< Reading on byte
>     2:   2b7f            cmp     r3, #127        ; 0x7f
>     4:   d100            bne.n   8 <efi_devpath_end+0x8>
>     6:   4770            bx      lr
>     8:   8843            ldrh    r3, [r0, #2]  <<< Reading two bytes
> infocenter.arm.com/help/topic/com.arm.doc.faqs/ka15414.html
> LDRH/STRH - address must be 2-byte aligned.
> 
>     a:   4418            add     r0, r3
>     c:   e7f8            b.n     0 <efi_devpath_end>

Thanks.  The compiler is indeed creating a single ldrh instruction. 
This indicates that the compiler believes that unaligned accesses are 
permitted, and so is optimising away the two byte loads to a single word 
load.

You can try building with -mno-unaligned-access; this should cause the 
compiler to emit byte-by-byte accesses for anything that is potentially 
unaligned.  This is likely to substantially increase the code size, and 
decrease execution speed.

As in my other e-mail: your best option is probably to enable the MMU 
and fix up unaligned accesses as they occur.  That way you will at least 
avoid the penalty for accesses that are correctly aligned.

Michael



More information about the ipxe-devel mailing list