Skip to content

Commit

Permalink
[U-Boot] Data Abort with gcc 7.1
Browse files Browse the repository at this point in the history
https://lists.denx.de/pipermail/u-boot/2017-July/298016.html

The --wno-unaligned-access option does not help because the
compiler assumes that the struct pointer is properly aligned.

This bug can be fixed by either:

  1) Always ensure proper alignment of the udp packet header
     pointers, which are passed to the net_set_ip_header() function
     and similar functions. Some further investigation is necessary.

or

  2) Just add a "packed" attribute to the ip_udp_hdr struct. In this
     case the compiler will always assume the smallest 1 byte alignment.
     It may have some performance implications though.
  • Loading branch information
aspeedtech committed Mar 19, 2019
1 parent 751ab06 commit 2627937
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 9 deletions.
14 changes: 7 additions & 7 deletions include/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ struct ethernet_hdr {
u8 et_dest[6]; /* Destination node */
u8 et_src[6]; /* Source node */
u16 et_protlen; /* Protocol or length */
};
}__attribute__((__packed__));

/* Ethernet header size */
#define ETHER_HDR_SIZE (sizeof(struct ethernet_hdr))
Expand All @@ -314,7 +314,7 @@ struct e802_hdr {
u8 et_snap2;
u8 et_snap3;
u16 et_prot; /* 802 protocol */
};
}__attribute__((__packed__));

/* 802 + SNAP + ethernet header size */
#define E802_HDR_SIZE (sizeof(struct e802_hdr))
Expand All @@ -328,7 +328,7 @@ struct vlan_ethernet_hdr {
u16 vet_vlan_type; /* PROT_VLAN */
u16 vet_tag; /* TAG of VLAN */
u16 vet_type; /* protocol type */
};
}__attribute__((__packed__));

/* VLAN Ethernet header size */
#define VLAN_ETHER_HDR_SIZE (sizeof(struct vlan_ethernet_hdr))
Expand Down Expand Up @@ -358,7 +358,7 @@ struct ip_hdr {
u16 ip_sum; /* checksum */
struct in_addr ip_src; /* Source IP address */
struct in_addr ip_dst; /* Destination IP address */
};
}__attribute__((__packed__));

#define IP_OFFS 0x1fff /* ip offset *= 8 */
#define IP_FLAGS 0xe000 /* first 3 bits */
Expand Down Expand Up @@ -386,7 +386,7 @@ struct ip_udp_hdr {
u16 udp_dst; /* UDP destination port */
u16 udp_len; /* Length of UDP packet */
u16 udp_xsum; /* Checksum */
};
}__attribute__((__packed__));

#define IP_UDP_HDR_SIZE (sizeof(struct ip_udp_hdr))
#define UDP_HDR_SIZE (IP_UDP_HDR_SIZE - IP_HDR_SIZE)
Expand Down Expand Up @@ -425,7 +425,7 @@ struct arp_hdr {
u8 ar_tha[]; /* Target hardware address */
u8 ar_tpa[]; /* Target protocol address */
#endif /* 0 */
};
}__attribute__((__packed__));

#define ARP_HDR_SIZE (8+20) /* Size assuming ethernet */

Expand Down Expand Up @@ -460,7 +460,7 @@ struct icmp_hdr {
} frag;
u8 data[0];
} un;
};
}__attribute__((__packed__));

#define ICMP_HDR_SIZE (sizeof(struct icmp_hdr))
#define IP_ICMP_HDR_SIZE (IP_HDR_SIZE + ICMP_HDR_SIZE)
Expand Down
2 changes: 1 addition & 1 deletion net/bootp.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct bootp_hdr {
char bp_sname[64]; /* Server host name */
char bp_file[128]; /* Boot file name */
char bp_vend[OPT_FIELD_SIZE]; /* Vendor information */
};
}__attribute__((__packed__));

#define BOOTP_HDR_SIZE sizeof(struct bootp_hdr)

Expand Down
2 changes: 1 addition & 1 deletion net/sntp.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ struct sntp_pkt_t {
unsigned long long originate_timestamp;
unsigned long long receive_timestamp;
unsigned long long transmit_timestamp;
};
}__attribute__((__packed__));

void sntp_start(void); /* Begin SNTP */

Expand Down

0 comments on commit 2627937

Please sign in to comment.