svn commit: r279236 - head/sys/netinet
Zbigniew Bodek
zbb at FreeBSD.org
Tue Feb 24 12:57:05 UTC 2015
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 <wma at semihalf.com>
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 */
More information about the svn-src-all
mailing list