Author: tkreuzer Date: Fri Sep 9 21:10:07 2011 New Revision: 53665
URL: http://svn.reactos.org/svn/reactos?rev=53665&view=rev Log: [HAL] Add a hack to work around a bug in VBox: The APIC emulation requires an iret instruction following closely after writing the EOI register. Since we return from kernel mode traps with a jmp (yes you can return from an interrupt with a jmp!) the EOI is never triggered, making VBox believe we are still serving the interrupt and keeping the PPR on high level, preventing following interrupts. A small asm stub now does the work of both writing the EOI and doing an iret.
Modified: trunk/reactos/hal/halx86/apic/apic.c trunk/reactos/hal/halx86/apic/apictrap.S
Modified: trunk/reactos/hal/halx86/apic/apic.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/apic/apic.c?rev=... ============================================================================== --- trunk/reactos/hal/halx86/apic/apic.c [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/apic/apic.c [iso-8859-1] Fri Sep 9 21:10:07 2011 @@ -609,17 +609,22 @@ 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); }
Modified: trunk/reactos/hal/halx86/apic/apictrap.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/apic/apictrap.S?... ============================================================================== --- trunk/reactos/hal/halx86/apic/apictrap.S [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/apic/apictrap.S [iso-8859-1] Fri Sep 9 21:10:07 2011 @@ -27,6 +27,18 @@ 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