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=53665&r1=53664&r2=53665&view=diff
==============================================================================
--- 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?rev=53665&r1=53664&r2=53665&view=diff
==============================================================================
--- 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


Reply via email to