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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to