diff --git a/reactos/hal/halx86/apic/apic.c b/reactos/hal/halx86/apic/apic.c index 7b151be49ff..27f5e3de706 100644 --- a/reactos/hal/halx86/apic/apic.c +++ b/reactos/hal/halx86/apic/apic.c @@ -609,17 +609,22 @@ HalBeginSystemInterrupt( return TRUE; } +void HackEoi(void); + VOID NTAPI HalEndSystemInterrupt( IN KIRQL OldIrql, IN PKTRAP_FRAME TrapFrame) { + /* Write 0 to the EndOfInterruptRegister */ + //ApicWrite(APIC_EOI, 0); + + // HACK! + HackEoi(); + /* Restore the old IRQL */ ApicSetCurrentIrql(OldIrql); - - /* Write 0 to the EndOfInterruptRegister */ - ApicWrite(APIC_EOI, 0); } diff --git a/reactos/hal/halx86/apic/apictrap.S b/reactos/hal/halx86/apic/apictrap.S index 3a4c1cde641..2bf34d86315 100644 --- a/reactos/hal/halx86/apic/apictrap.S +++ b/reactos/hal/halx86/apic/apictrap.S @@ -27,6 +27,18 @@ PUBLIC _ApicSpuriousService TRAP_ENTRY HalpTrap0D, 0 TRAP_ENTRY HalpApcInterrupt, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY HalpDispatchInterrupt, KI_PUSH_FAKE_ERROR_CODE + +// VBox APIC needs an iret more or less directly following the EOI +PUBLIC _HackEoi +_HackEoi: + pushfd + push cs + push offset OnlyOnePersonKnowsHowToHackAroundVBoxBugsAndThatIsNotYou // !! + mov dword ptr ds:[HEX(0FFFE00B0)], 0 + iretd +OnlyOnePersonKnowsHowToHackAroundVBoxBugsAndThatIsNotYou: + ret + #endif TRAP_ENTRY HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE