Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Feb 2015 12:57:04 +0000 (UTC)
From:      Zbigniew Bodek <zbb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r279236 - head/sys/netinet
Message-ID:  <201502241257.t1OCv40V097418@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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 */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502241257.t1OCv40V097418>