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