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.
This commit is contained in:
parent
59808eaabc
commit
eafc5bd35a
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: i82093reg.h,v 1.8 2017/05/23 08:54:38 nonaka Exp $ */
|
||||
/* $NetBSD: i82093reg.h,v 1.9 2017/11/13 11:45:54 nakayama 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 ;\
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: i82093reg.h,v 1.10 2017/05/23 08:54:39 nonaka Exp $ */
|
||||
/* $NetBSD: i82093reg.h,v 1.11 2017/11/13 11:45:54 nakayama 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 ;\
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ioapic.c,v 1.53 2017/11/04 14:56:48 cherry Exp $ */
|
||||
/* $NetBSD: ioapic.c,v 1.54 2017/11/13 11:45:54 nakayama 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.53 2017/11/04 14:56:48 cherry Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: ioapic.c,v 1.54 2017/11/13 11:45:54 nakayama 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user