@@ -48,6 +48,7 @@ namespace hw {
4848 static const uintptr_t IA32_APIC_BASE_MSR = 0x1B ;
4949 static const uintptr_t IA32_APIC_BASE_MSR_ENABLE = 0x800 ;
5050 static const uintptr_t BOOTLOADER_LOCATION = 0x80000 ;
51+ static const uint8_t SPURIOUS_INTR = IRQ_manager::INTR_LINES-1 ;
5152
5253 // every CPU has a local APIC
5354 apic lapic;
@@ -123,7 +124,6 @@ namespace hw {
123124
124125 // start receiving interrupts (0x100), set spurious vector
125126 // note: spurious IRQ must have 4 last bits set (0x?F)
126- const uint8_t SPURIOUS_INTR = IRQ_manager::INTR_LINES-1 ;
127127 lapic.enable_intr (SPURIOUS_INTR);
128128
129129 // acknowledge any outstanding interrupts
@@ -213,14 +213,14 @@ namespace hw {
213213 for (uint8_t i = 0 ; i < 8 ; i++)
214214 if (lapic.regs ->isr [i].reg )
215215 return 32 * i + __builtin_ffs (lapic.regs ->isr [i].reg ) - 1 ;
216- return 0 ;
216+ return 255 ;
217217 }
218218 uint8_t APIC::get_irr ()
219219 {
220220 for (uint8_t i = 0 ; i < 8 ; i++)
221221 if (lapic.regs ->irr [i].reg )
222222 return 32 * i + __builtin_ffs (lapic.regs ->irr [i].reg ) - 1 ;
223- return 0 ;
223+ return 255 ;
224224 }
225225
226226 void APIC::eoi ()
@@ -282,6 +282,16 @@ namespace hw {
282282 }
283283 void APIC::disable_irq (uint8_t irq)
284284 {
285+ auto & overrides = ACPI::get_overrides ();
286+ for (auto & redir : overrides)
287+ {
288+ // NOTE: @bus_source is the IOAPIC number
289+ if (redir.irq_source == irq)
290+ {
291+ IOAPIC::disable (redir.global_intr );
292+ return ;
293+ }
294+ }
285295 IOAPIC::disable (irq);
286296 }
287297 void APIC::setup_subs ()
0 commit comments