Hi, Erm, did you test this stuff on MIPS too?
We should be smarter about accessing fields in the IP header, rather than trying to play alignment games like this. -adrian On 24 February 2015 at 04:57, Zbigniew Bodek <[email protected]> wrote: > Author: zbb > Date: Tue Feb 24 12:57:03 2015 > New Revision: 279236 > URL: https://svnweb.freebsd.org/changeset/base/279236 > > Log: > Change struct attribute to avoid aligned operations mismatch > > Previous __alignment(4) allowed compiler to assume that operations are > performed on aligned region. On ARM processor, this led to alignment fault > as shown below: > trapframe: 0xda9e5b10 > FSR=00000001, FAR=a67b680e, spsr=60000113 > r0 =00000000, r1 =00000068, r2 =0000007c, r3 =00000000 > r4 =a67b6826, r5 =a67b680e, r6 =00000014, r7 =00000068 > r8 =00000068, r9 =da9e5bd0, r10=00000011, r11=da9e5c10 > r12=da9e5be0, ssp=da9e5b60, slr=a054f164, pc =a054f2cc > <...> > udp_input+0x264: ldmia r5, {r0-r3, r6} > udp_input+0x268: stmia r12, {r0-r3, r6} > > This was due to instructions which do not support unaligned access, > whereas for __alignment(2) compiler replaced ldmia/stmia with some > logically equivalent memcpy operations. > In fact, the assumption that 'struct ip' is always 4-byte aligned > is definitely false, as we have no impact on data alignment of packet > stream received. > > Another possible solution would be to explicitely perform memcpy() > on objects of 'struct ip' type, which, however, would suffer from > performance drop, and be merely a problem hiding. > > Please, note that this has nothing to do with > ARM32_DISABLE_ALIGNMENT_FAULTS option, but is related strictly to > compiler behaviour. > > Submitted by: Wojciech Macek <[email protected]> > Reviewed by: glebius, ian > Obtained from: Semihalf > > Modified: > head/sys/netinet/ip.h > > Modified: head/sys/netinet/ip.h > ============================================================================== > --- head/sys/netinet/ip.h Tue Feb 24 12:31:08 2015 (r279235) > +++ head/sys/netinet/ip.h Tue Feb 24 12:57:03 2015 (r279236) > @@ -67,7 +67,7 @@ struct ip { > u_char ip_p; /* protocol */ > u_short ip_sum; /* checksum */ > struct in_addr ip_src,ip_dst; /* source and dest address */ > -} __packed __aligned(4); > +} __packed __aligned(2); > > #define IP_MAXPACKET 65535 /* maximum packet size */ > > _______________________________________________ [email protected] mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "[email protected]"
