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,

Reply via email to