[ros-diffs] [tkreuzer] 55014: [HAL] - Implement IrqlToSoftVector() macro and use it in HalRequestSoftwareInterrupt, so that on amd64 the correct interrupt is triggered. - Really start at the lowest vector for ...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Fri Jan 20 16:32:45 UTC 2012


Author: tkreuzer
Date: Fri Jan 20 16:32:43 2012
New Revision: 55014

URL: http://svn.reactos.org/svn/reactos?rev=55014&view=rev
Log:
[HAL]
- Implement IrqlToSoftVector() macro and use it in HalRequestSoftwareInterrupt, so that on amd64 the correct interrupt is triggered.
- Really start at the lowest vector for the IRQL in HalpAllocateSystemInterrupt
- Small code refactoring

Modified:
    trunk/reactos/hal/halx86/apic/apic.c
    trunk/reactos/hal/halx86/apic/apic.h

Modified: trunk/reactos/hal/halx86/apic/apic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/apic/apic.c?rev=55014&r1=55013&r2=55014&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/apic/apic.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/apic/apic.c [iso-8859-1] Fri Jan 20 16:32:43 2012
@@ -186,7 +186,7 @@
 
 VOID
 FORCEINLINE
-ApicRaiseIrql(KIRQL Irql)
+ApicSetIrql(KIRQL Irql)
 {
 #ifdef _M_AMD64
     __writecr8(Irql);
@@ -197,14 +197,13 @@
     ApicWrite(APIC_TPR, IrqlToTpr(Irql));
 #endif
 }
-
+#define ApicRaiseIrql ApicSetIrql
+
+#ifdef APIC_LAZY_IRQL
 VOID
 FORCEINLINE
 ApicLowerIrql(KIRQL Irql)
 {
-#ifdef _M_AMD64
-    __writecr8(Irql);
-#elif defined(APIC_LAZY_IRQL)
     __writefsbyte(FIELD_OFFSET(KPCR, Irql), Irql);
 
     /* Is the new Irql lower than set in the TPR? */
@@ -216,11 +215,10 @@
         /* Need to lower it back */
         ApicWrite(APIC_TPR, IrqlToTpr(Irql));
     }
+}
 #else
-    /* Convert IRQL and write the TPR */
-    ApicWrite(APIC_TPR, IrqlToTpr(Irql));
-#endif
-}
+#define ApicLowerIrql ApicSetIrql
+#endif
 
 UCHAR
 FASTCALL
@@ -394,7 +392,7 @@
     ApicWrite(APIC_ERRLVTR, LvtEntry.Long);
 
     /* Set the IRQL from the PCR */
-    ApicWrite(APIC_TPR, IrqlToTpr(KeGetPcr()->Irql));
+    ApicSetIrql(KeGetPcr()->Irql);
 #ifdef APIC_LAZY_IRQL
     /* Save the new hard IRQL in the IRR field */
     KeGetPcr()->IRR = KeGetPcr()->Irql;
@@ -410,8 +408,8 @@
     IOAPIC_REDIRECTION_REGISTER ReDirReg;
     IN UCHAR Vector;
 
-    /* Start with low vector */
-    Vector = IrqlToTpr(Irql);
+    /* Start with lowest vector */
+    Vector = IrqlToTpr(Irql) & 0xF0;
 
     /* Find an empty vector */
     while (HalpVectorToIndex[Vector] != 0xFF)
@@ -653,7 +651,7 @@
 HalRequestSoftwareInterrupt(IN KIRQL Irql)
 {
     /* Convert irql to vector and request an interrupt */
-    ApicRequestInterrupt(IrqlToTpr(Irql), APIC_TGM_Edge);
+    ApicRequestInterrupt(IrqlToSoftVector(Irql), APIC_TGM_Edge);
 }
 
 VOID

Modified: trunk/reactos/hal/halx86/apic/apic.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/apic/apic.h?rev=55014&r1=55013&r2=55014&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/apic/apic.h [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/apic/apic.h [iso-8859-1] Fri Jan 20 16:32:43 2012
@@ -14,6 +14,7 @@
 #define APIC_PROFILE_VECTOR  0xFD // IRQL 31
 #define APIC_NMI_VECTOR      0xFF
 #define IrqlToTpr(Irql) (Irql << 4)
+#define IrqlToSoftVector(Irql) ((Irql << 4)|0xf)
 #define TprToIrql(Tpr) ((KIRQL)(Tpr >> 4))
 #define CLOCK2_LEVEL CLOCK_LEVEL
 #else
@@ -31,6 +32,7 @@
 #define APIC_PROFILE_VECTOR  0xFD // IRQL 31
 #define APIC_NMI_VECTOR      0xFF
 #define IrqlToTpr(Irql) (HalpIRQLtoTPR[Irql])
+#define IrqlToSoftVector(Irql) IrqlToTpr(Irql)
 #define TprToIrql(Tpr)  (HalVectorToIRQL[Tpr >> 4])
 #endif
 




More information about the Ros-diffs mailing list