Module Name:    src
Committed By:   martin
Date:           Tue Nov 21 11:01:02 UTC 2017

Modified Files:
        src/sys/arch/amd64/include [netbsd-8]: i82093reg.h
        src/sys/arch/i386/include [netbsd-8]: i82093reg.h
        src/sys/arch/x86/x86 [netbsd-8]: ioapic.c

Log Message:
Pull up following revision(s) (requested by nakayama in ticket #359):
        sys/arch/amd64/include/i82093reg.h: revision 1.9
        sys/arch/x86/x86/ioapic.c: revision 1.54
        sys/arch/i386/include/i82093reg.h: revision 1.11
Don't write a 1 to the read only RIRR bit in the IOAPIC redirection
register to fix "tlp0: filter setup and transmit timeout" observed
on Hyper-V VMs with the Legacy Network Adapter.
>From OpenBSD via PR kern/49323:
 https://marc.info/?l=openbsd-cvs&m=146718035432599&w=2
Modified files:
sys/arch/amd64/amd64: ioapic.c
sys/arch/amd64/include: i82093reg.h
Log message:
Don't write a 1 to the RIRR bit in the IOAPIC redirection register. This bit
is R/O, and although it should not matter what value is written there,
Hyper-V's emulated IOAPIC interprets a write of 1 in some unexpected way and
subsequently blocks interrupt delivery. This primarily manifests itself as
de(4) timeouts when using Hyper-V VMs with the "Legacy Network Adapter"
interface.
Tested both amd64 and i386 on Client Hyper-V on Windows 10.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.8.2.1 src/sys/arch/amd64/include/i82093reg.h
cvs rdiff -u -r1.10 -r1.10.2.1 src/sys/arch/i386/include/i82093reg.h
cvs rdiff -u -r1.52 -r1.52.10.1 src/sys/arch/x86/x86/ioapic.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/arch/amd64/include/i82093reg.h
diff -u src/sys/arch/amd64/include/i82093reg.h:1.8 src/sys/arch/amd64/include/i82093reg.h:1.8.2.1
--- src/sys/arch/amd64/include/i82093reg.h:1.8	Tue May 23 08:54:38 2017
+++ src/sys/arch/amd64/include/i82093reg.h	Tue Nov 21 11:01:02 2017
@@ -1,4 +1,4 @@
-/*	 $NetBSD: i82093reg.h,v 1.8 2017/05/23 08:54:38 nonaka Exp $ */
+/*	 $NetBSD: i82093reg.h,v 1.8.2.1 2017/11/21 11:01:02 martin Exp $ */
 
 #include <x86/i82093reg.h>
 
@@ -57,6 +57,7 @@
 	movq	IOAPIC_SC_DATA(%rdi),%r15			;\
 	movl	(%r15),%esi					;\
 	orl	$IOAPIC_REDLO_MASK,%esi				;\
+	andl	$~IOAPIC_REDLO_RIRR,%esi			;\
 	movl	%esi,(%r15)					;\
 	movq	IS_PIC(%r14),%rdi				;\
 	ioapic_asm_unlock(num)
@@ -73,7 +74,7 @@
 	movq	IOAPIC_SC_DATA(%rdi),%r13			;\
 	movl	%esi, (%r15)					;\
 	movl	(%r13),%r12d					;\
-	andl	$~IOAPIC_REDLO_MASK,%r12d			;\
+	andl	$~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%r12d	;\
 	movl	%esi,(%r15)					;\
 	movl	%r12d,(%r13)					;\
 	movq	IS_PIC(%r14),%rdi				;\

Index: src/sys/arch/i386/include/i82093reg.h
diff -u src/sys/arch/i386/include/i82093reg.h:1.10 src/sys/arch/i386/include/i82093reg.h:1.10.2.1
--- src/sys/arch/i386/include/i82093reg.h:1.10	Tue May 23 08:54:39 2017
+++ src/sys/arch/i386/include/i82093reg.h	Tue Nov 21 11:01:02 2017
@@ -1,4 +1,4 @@
-/*	 $NetBSD: i82093reg.h,v 1.10 2017/05/23 08:54:39 nonaka Exp $ */
+/*	 $NetBSD: i82093reg.h,v 1.10.2.1 2017/11/21 11:01:02 martin Exp $ */
 
 #include <x86/i82093reg.h>
 
@@ -48,6 +48,7 @@
 	movl	IOAPIC_SC_DATA(%edi),%ebx			;\
 	movl	(%ebx),%esi					;\
 	orl	$IOAPIC_REDLO_MASK,%esi				;\
+	andl	$~IOAPIC_REDLO_RIRR,%esi			;\
 	movl	%esi,(%ebx)					;\
 	movl	IS_PIC(%ebp),%edi				;\
 	ioapic_asm_unlock(num)
@@ -71,7 +72,7 @@
 	movl	IOAPIC_SC_DATA(%edi),%eax			;\
 	movl	%esi, (%ebx)					;\
 	movl	(%eax),%edx					;\
-	andl	$~IOAPIC_REDLO_MASK,%edx			;\
+	andl	$~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%edx	;\
 	movl	%esi, (%ebx)					;\
 	movl	%edx,(%eax)					;\
 	movl	IS_PIC(%ebp),%edi				;\

Index: src/sys/arch/x86/x86/ioapic.c
diff -u src/sys/arch/x86/x86/ioapic.c:1.52 src/sys/arch/x86/x86/ioapic.c:1.52.10.1
--- src/sys/arch/x86/x86/ioapic.c:1.52	Mon Jul 27 15:45:20 2015
+++ src/sys/arch/x86/x86/ioapic.c	Tue Nov 21 11:01:02 2017
@@ -1,4 +1,4 @@
-/* 	$NetBSD: ioapic.c,v 1.52 2015/07/27 15:45:20 msaitoh Exp $	*/
+/* 	$NetBSD: ioapic.c,v 1.52.10.1 2017/11/21 11:01:02 martin Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2009 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.52 2015/07/27 15:45:20 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.52.10.1 2017/11/21 11:01:02 martin Exp $");
 
 #include "opt_ddb.h"
 
@@ -508,6 +508,7 @@ ioapic_hwmask(struct pic *pic, int pin)
 	flags = ioapic_lock(sc);
 	redlo = ioapic_read_ul(sc, IOAPIC_REDLO(pin));
 	redlo |= IOAPIC_REDLO_MASK;
+	redlo &= ~IOAPIC_REDLO_RIRR;
 	ioapic_write_ul(sc, IOAPIC_REDLO(pin), redlo);
 	ioapic_unlock(sc, flags);
 }
@@ -548,7 +549,7 @@ ioapic_hwunmask(struct pic *pic, int pin
 
 	flags = ioapic_lock(sc);
 	redlo = ioapic_read_ul(sc, IOAPIC_REDLO(pin));
-	redlo &= ~IOAPIC_REDLO_MASK;
+	redlo &= ~(IOAPIC_REDLO_MASK | IOAPIC_REDLO_RIRR);
 	ioapic_write_ul(sc, IOAPIC_REDLO(pin), redlo);
 	ioapic_unlock(sc, flags);
 }

Reply via email to