Page MenuHomeFreeBSD

D56006.diff
No OneTemporary

D56006.diff

diff --git a/sys/x86/x86/io_apic.c b/sys/x86/x86/io_apic.c
--- a/sys/x86/x86/io_apic.c
+++ b/sys/x86/x86/io_apic.c
@@ -85,6 +85,7 @@
u_int io_activehi:1;
u_int io_edgetrigger:1;
u_int io_masked:1;
+ u_int io_valid:1;
int io_bus:4;
uint32_t io_lowreg;
u_int io_remap_cookie;
@@ -193,7 +194,7 @@
ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(src->io_intpin),
low1);
low1 = src->io_lowreg;
- if (src->io_masked != 0)
+ if (src->io_masked != 0 || src->io_valid == 0)
low1 |= IOART_INTMSET;
ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(src->io_intpin),
low1);
@@ -268,7 +269,9 @@
mtx_lock_spin(&icu_lock);
if (intpin->io_masked) {
- flags = intpin->io_lowreg & ~IOART_INTMASK;
+ flags = intpin->io_lowreg;
+ if (intpin->io_valid)
+ flags &= ~IOART_INTMASK;
ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin),
flags);
intpin->io_masked = 0;
@@ -375,7 +378,7 @@
low |= IOART_INTAHI;
else
low |= IOART_INTALO;
- if (intpin->io_masked)
+ if (intpin->io_masked || !intpin->io_valid)
low |= IOART_INTMSET;
switch (intpin->io_irq) {
case IRQ_EXTINT:
@@ -697,11 +700,13 @@
intpin->io_activehi = 1;
intpin->io_edgetrigger = 1;
intpin->io_masked = 1;
+ intpin->io_valid = 1;
} else {
intpin->io_bus = APIC_BUS_PCI;
intpin->io_activehi = 0;
intpin->io_edgetrigger = 0;
intpin->io_masked = 1;
+ intpin->io_valid = 1;
}
/*
@@ -796,6 +801,7 @@
io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN;
io->io_pins[pin].io_irq = IRQ_NMI;
io->io_pins[pin].io_masked = 0;
+ io->io_pins[pin].io_valid = 1;
io->io_pins[pin].io_edgetrigger = 1;
io->io_pins[pin].io_activehi = 1;
if (bootverbose)
@@ -817,6 +823,7 @@
io->io_pins[pin].io_bus = APIC_BUS_UNKNOWN;
io->io_pins[pin].io_irq = IRQ_SMI;
io->io_pins[pin].io_masked = 0;
+ io->io_pins[pin].io_valid = 1;
io->io_pins[pin].io_edgetrigger = 1;
io->io_pins[pin].io_activehi = 1;
if (bootverbose)
@@ -841,6 +848,7 @@
io->io_pins[pin].io_masked = 0;
else
io->io_pins[pin].io_masked = 1;
+ io->io_pins[pin].io_valid = 1;
io->io_pins[pin].io_edgetrigger = 1;
io->io_pins[pin].io_activehi = 1;
if (bootverbose)

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 22, 4:24 AM (58 m, 57 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30097767
Default Alt Text
D56006.diff (2 KB)

Event Timeline