[U-Boot] [PATCH] Use packed structures for networking

Denis Pynkin denis.pynkin at collabora.com
Sat Jul 29 09:56:47 UTC 2017



28.07.2017 00:26, Joe Hershberger wrote:

>>> PXE boot is broken with GCC 7.1 due option '-fstore-merging' enabled
>>> by default for '-O2':

>> So, what I've been wondering, and others have poked me about (who can
>> chime in if they like), how is the kernel not also tripping over this?
> 
> Great question.
> 

Believe kernel do not work in single static buffer for the whole packet 
as u-boot do.

Problem is in ethernet header structure with size ETHER_HDR_SIZE=14, so 
IP and BOOTP headers are not aligned to 4 bytes.

Let's take bootp.c code as example:

755     bp = (struct bootp_hdr *)pkt;
756     bp->bp_op = OP_BOOTREQUEST;
757     bp->bp_htype = HWT_ETHER;
758     bp->bp_hlen = HWL_ETHER;
759     bp->bp_hops = 0;

Without '-fstore-merging' or with enabled 'packed' structures assembler 
code looks like:
   6a:   77a3          strb    r3, [r4, #30]
   6c:   f884 b01c     strb.w  fp, [r4, #28]
   70:   f884 b01d     strb.w  fp, [r4, #29]
   74:   77e5          strb    r5, [r4, #31]

but with option '-fstore-merging' all these instructions merged into 
single instruction:
   62:   61e3          str     r3, [r4, #28]

and store address is not aligned to 32b boundary here, so it results to 
'data abort'.

I see some possible solutions here:
- add option '-fno-store-merging' -- works, I test it already
- use packed structures -- since there are some unsafe code in sources
- rewrite networking part to work with any protocol separately and merge 
headers and data only on send.

Even simple reordering of header flags initialization helps here, but it 
looks like a bit of black magic in code.

PS forgot to mention in patch description -- '-Os' includes 
'-fstore-merging' option as well for gcc 7.1.

-- 
wbr, Denis


More information about the U-Boot mailing list