Module Name: src Committed By: rin Date: Sun Jan 6 00:39:05 UTC 2019
Modified Files: src/sys/dev/usb: if_axe.c Log Message: Fix kernel panic on arm reported by @furandon_pig on Twitter. Hardware header is 2-byte aligned in RX buffer, not 4-byte. For some architectures, __builtin_memcpy() of GCC 6 attempts to copy 4-byte header at once, which results in alignment error. To generate a diff of this commit: cvs rdiff -u -r1.93 -r1.94 src/sys/dev/usb/if_axe.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/if_axe.c diff -u src/sys/dev/usb/if_axe.c:1.93 src/sys/dev/usb/if_axe.c:1.94 --- src/sys/dev/usb/if_axe.c:1.93 Wed Sep 12 21:57:18 2018 +++ src/sys/dev/usb/if_axe.c Sun Jan 6 00:39:05 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.93 2018/09/12 21:57:18 christos Exp $ */ +/* $NetBSD: if_axe.c,v 1.94 2019/01/06 00:39:05 rin Exp $ */ /* $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */ /* @@ -87,7 +87,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.93 2018/09/12 21:57:18 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.94 2019/01/06 00:39:05 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1271,7 +1271,18 @@ axe_rxeof(struct usbd_xfer *xfer, void * goto done; } +#if !defined(__NO_STRICT_ALIGNMENT) && __GNUC_PREREQ__(6, 1) + /* + * XXX hdr is 2-byte aligned in buf, not 4-byte. + * For some architectures, __builtin_memcpy() of + * GCC 6 attempts to copy sizeof(hdr) = 4 bytes + * at onece, which results in alignment error. + */ + hdr.len = *(uint16_t *)buf; + hdr.ilen = *(uint16_t *)(buf + sizeof(uint16_t)); +#else memcpy(&hdr, buf, sizeof(hdr)); +#endif DPRINTFN(20, "total_len %#jx len %jx ilen %#jx", total_len,