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]"

Reply via email to