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.
svn path=/trunk/; revision=53665
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);
}
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