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