Hi!
With the angstrom EABI build I'm getting many alignment errors I don't
understand.
As a simple example I looked at the zeroconf program:
# zeroconf -i usb0
# logread | tail
Dec 31 23:59:22 ipaq-pxa270 user.warn kernel: Alignment trap: zeroconf
(3506) PC=0x00008d00 Instr=0xe58d3032 Address=0xbed9fbba FSR 0x813
gdb shows that the error is a memcpy in line 140 of the arp function:
/**
* Send out an ARP packet.
*/
static void arp(int fd, struct sockaddr *saddr, int op,
struct ether_addr *source_addr, struct in_addr source_ip,
struct ether_addr *target_addr, struct in_addr target_ip)
{
struct arp_packet p;
memset(&p, 0, sizeof(p));
// ether header
p.hdr.ether_type = htons(ETHERTYPE_ARP);
memcpy(p.hdr.ether_shost, source_addr, ETH_ALEN);
memcpy(p.hdr.ether_dhost, &broadcast_addr, ETH_ALEN);
// arp request
p.arp.ar_hrd = htons(ARPHRD_ETHER);
p.arp.ar_pro = htons(ETHERTYPE_IP);
p.arp.ar_hln = ETH_ALEN;
p.arp.ar_pln = 4;
p.arp.ar_op = htons(op);
memcpy(&p.source_addr, source_addr, ETH_ALEN);
memcpy(&p.source_ip, &source_ip, sizeof(p.source_ip));
memcpy(&p.target_addr, target_addr, ETH_ALEN);
memcpy(&p.target_ip, &target_ip, sizeof(p.target_ip)); /* this is
line 140 */
// send it
if (sendto(fd, &p, sizeof(p), 0, saddr, sizeof(*saddr)) < 0) {
perror("sendto failed");
exit(1);
}
}
Obviously p.target_ip is not 32-bit aligned.
Dump of assembler code for function arp:
0x00008c44 <arp+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, lr}
0x00008c48 <arp+4>: sub sp, sp, #72 ; 0x48
0x00008c4c <arp+8>: mov r9, r0
0x00008c50 <arp+12>: mov r10, r1
0x00008c54 <arp+16>: mov r5, r2
0x00008c58 <arp+20>: mov r7, r3
0x00008c5c <arp+24>: add r6, sp, #12 ; 0xc
0x00008c60 <arp+28>: mov r8, #60 ; 0x3c
0x00008c64 <arp+32>: mov r0, r6
0x00008c68 <arp+36>: mov r1, #0 ; 0x0
0x00008c6c <arp+40>: mov r2, r8
0x00008c70 <arp+44>: bl 0x87f8 <memset>
0x00008c74 <arp+48>: mov r3, #1536 ; 0x600
0x00008c78 <arp+52>: add r3, r3, #8 ; 0x8
0x00008c7c <arp+56>: strh r3, [sp, #24]
0x00008c80 <arp+60>: mov r4, #6 ; 0x6
0x00008c84 <arp+64>: add r0, sp, #18 ; 0x12
0x00008c88 <arp+68>: mov r1, r7
0x00008c8c <arp+72>: mov r2, r4
0x00008c90 <arp+76>: bl 0x884c <memcpy>
0x00008c94 <arp+80>: mov r0, r6
0x00008c98 <arp+84>: ldr r1, [pc, #164] ; 0x8d44 <arp+256>
0x00008c9c <arp+88>: mov r2, r4
0x00008ca0 <arp+92>: bl 0x884c <memcpy>
0x00008ca4 <arp+96>: mov r3, #256 ; 0x100
0x00008ca8 <arp+100>: strh r3, [sp, #26]
0x00008cac <arp+104>: mov r3, #8 ; 0x8
0x00008cb0 <arp+108>: strh r3, [sp, #28]
0x00008cb4 <arp+112>: strb r4, [sp, #30]
0x00008cb8 <arp+116>: mov r3, #4 ; 0x4
0x00008cbc <arp+120>: strb r3, [sp, #31]
0x00008cc0 <arp+124>: mov r5, r5, lsl #16
0x00008cc4 <arp+128>: mov r3, r5, lsr #8
0x00008cc8 <arp+132>: and r3, r3, #65280 ; 0xff00
0x00008ccc <arp+136>: orr r3, r3, r5, lsr #24
0x00008cd0 <arp+140>: strh r3, [sp, #32]
0x00008cd4 <arp+144>: add r0, sp, #34 ; 0x22
0x00008cd8 <arp+148>: mov r1, r7
0x00008cdc <arp+152>: mov r2, r4
0x00008ce0 <arp+156>: bl 0x884c <memcpy>
0x00008ce4 <arp+160>: ldr r3, [sp, #104]
0x00008ce8 <arp+164>: str r3, [sp, #40]
0x00008cec <arp+168>: add r0, sp, #44 ; 0x2c
0x00008cf0 <arp+172>: ldr r1, [sp, #108]
0x00008cf4 <arp+176>: mov r2, r4
0x00008cf8 <arp+180>: bl 0x884c <memcpy>
0x00008cfc <arp+184>: ldr r3, [sp, #112]
0x00008d00 <arp+188>: str r3, [sp, #50] <--- Alignment trap here
0x00008d04 <arp+192>: str r10, [sp]
0x00008d08 <arp+196>: mov r3, #16 ; 0x10
0x00008d0c <arp+200>: str r3, [sp, #4]
0x00008d10 <arp+204>: mov r0, r9
0x00008d14 <arp+208>: mov r1, r6
0x00008d18 <arp+212>: mov r2, r8
0x00008d1c <arp+216>: sub r3, r3, #16 ; 0x10
0x00008d20 <arp+220>: bl 0x8888 <sendto>
0x00008d24 <arp+224>: cmp r0, #0 ; 0x0
0x00008d28 <arp+228>: bge 0x8d3c <arp+248>
0x00008d2c <arp+232>: ldr r0, [pc, #20] ; 0x8d48 <arp+260>
0x00008d30 <arp+236>: bl 0x8894 <perror>
0x00008d34 <arp+240>: mov r0, #1 ; 0x1
0x00008d38 <arp+244>: bl 0x890c <exit>
0x00008d3c <arp+248>: add sp, sp, #72 ; 0x48
0x00008d40 <arp+252>: ldmia sp!, {r4, r5, r6, r7, r8, r9, r10, pc}
0x00008d44 <arp+256>: andeq r2, r1, r0, lsl #8
0x00008d48 <arp+260>: andeq r9, r0, r8, asr #29
End of assembler dump.
Am I reading this correctly, is
memcpy(&p.target_ip, &target_ip, sizeof(p.target_ip));
compiled into
ldr r3, [sp, #112]
str r3, [sp, #50]
str r10, [sp]
target_ip being at sp+112 and p.target_ip at sp+50?
I guess this is gcc's builtin memcpy inlining gone wrong.
What could be done to fix this?
happy easter
Philipp
_______________________________________________
Oe mailing list
[email protected]
https://www.handhelds.org/mailman/listinfo/oe