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

Reply via email to