[Banana Pi] Fatal kernel mode data abort: 'Alignment Fault' on read
Hans Petter Selasky
hps at selasky.org
Thu Nov 5 11:19:01 UTC 2015
Hi,
On 11/05/15 12:02, Hans Petter Selasky wrote:
> On 11/05/15 11:48, Lars Engels wrote:
>> Using FreeBSD-armv6-11.0-A20-290366.img I can reproducible crash the
>> kernel by USB-tethering the Banana Pi to a mobile phone and run "
>> pkg bootstrap". It looks like this:
>>
>> root at bananapi:/ # pkg bootstrap
>> The package management tool is not yet installed on your system.
>> Do you want to fetch and install it now? [y/N]: y
>> Bootstrapping pkg from
>> pkg+http://pkg.FreeBSD.org/FreeBSD:11:armv6/latest, please wait...
>> Fatal kernel mode data abort: 'Alignment Fault' on read
>> trapframe: 0xea576a90
>> FSR=00000001, FAR=c43a1d6e, spsr=60000113
>> r0 =00000014, r1 =0000003c, r2 =0000003c, r3 =00000903
>> r4 =00000000, r5 =c43a1d6a, r6 =00000028, r7 =c43a1d56
>> r8 =00000000, r9 =00000014, r10=00000028, r11=ea576bf8
>> r12=00000000, ssp=ea576b20, slr=c061aba4, pc =c04f68e8
>>
>> [ thread pid 13 tid 100024 ]
>> Stopped at tcp_input+0x820: ldr r0, [r5, #0x004]
>
> Hi,
>
> Could you "objdump -Dx --source /boot/kernel/kernel" and figure out
> which code line "tcp_input+0x820" corresponds to?
>
> According to if_rndis, the IP-header should be aligned via the
> ETHER_ALIGN macro, to 32-bits. The issue is possibly outside USB.
>
Wild guess:
This piece of code:
> case TCPOPT_SACK:
> if (optlen <= 2 || (optlen - 2) % TCPOLEN_SACK != 0)
> continue;
> if (flags & TO_SYN)
> continue;
> to->to_flags |= TOF_SACK;
> to->to_nsacks = (optlen - 2) / TCPOLEN_SACK;
> to->to_sacks = cp + 2;
^^^ more specifically here
> TCPSTAT_INC(tcps_sack_rcv_blocks);
> break;
Causes +2 bytes unaligned access below for ARM?
> case TOF_SACK:
> {
> int sackblks = 0;
> struct sackblk *sack = (struct sackblk *)to->to_sacks;
> tcp_seq sack_seq;
>
> while (!optlen || optlen % 4 != 2) {
> optlen += TCPOLEN_NOP;
> *optp++ = TCPOPT_NOP;
> }
> if (TCP_MAXOLEN - optlen < TCPOLEN_SACKHDR + TCPOLEN_SACK)
> continue;
> optlen += TCPOLEN_SACKHDR;
> *optp++ = TCPOPT_SACK;
> sackblks = min(to->to_nsacks,
> (TCP_MAXOLEN - optlen) / TCPOLEN_SACK);
> *optp++ = TCPOLEN_SACKHDR + sackblks * TCPOLEN_SACK;
> while (sackblks--) {
> sack_seq = htonl(sack->start);
> bcopy((u_char *)&sack_seq, optp, sizeof(sack_seq));
> optp += sizeof(sack_seq);
> sack_seq = htonl(sack->end);
> bcopy((u_char *)&sack_seq, optp, sizeof(sack_seq));
> optp += sizeof(sack_seq);
> optlen += TCPOLEN_SACK;
> sack++;
> }
> TCPSTAT_INC(tcps_sack_send_blocks);
> break;
> }
????
--HPS
More information about the freebsd-arm
mailing list