[ros-diffs] [sir_richard] 47672: [HAL]: Implement system bus (and ISA) vector/interrupt translation.

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Mon Jun 7 22:34:41 CEST 2010


Author: sir_richard
Date: Mon Jun  7 22:34:41 2010
New Revision: 47672

URL: http://svn.reactos.org/svn/reactos?rev=47672&view=rev
Log:
[HAL]: Implement system bus (and ISA) vector/interrupt translation.

Modified:
    trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c

Modified: trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c?rev=47672&r1=47671&r2=47672&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/legacy/bus/sysbus.c [iso-8859-1] Mon Jun  7 22:34:41 2010
@@ -31,6 +31,35 @@
 
 ULONG
 NTAPI
+HalpGetRootInterruptVector(IN ULONG BusInterruptLevel,
+                           IN ULONG BusInterruptVector,
+                           OUT PKIRQL Irql,
+                           OUT PKAFFINITY Affinity)
+{
+    ULONG SystemVector;
+    
+    /* Get the system vector */
+    SystemVector = PRIMARY_VECTOR_BASE + BusInterruptLevel;
+    
+    /* Validate it */
+    if ((SystemVector < PRIMARY_VECTOR_BASE) || (SystemVector > PRIMARY_VECTOR_BASE + 27))
+    {
+        /* Invalid vector */
+        DPRINT1("Vector %lx is too low or too high!\n", SystemVector);
+        return 0;
+    }
+    
+    /* Return the IRQL and affinity */
+    *Irql = (PRIMARY_VECTOR_BASE + 27) - SystemVector;
+    *Affinity = HalpDefaultInterruptAffinity;
+    ASSERT(HalpDefaultInterruptAffinity);
+    
+    /* Return the vector */
+    return SystemVector;
+}
+
+ULONG
+NTAPI
 HalpGetSystemInterruptVector(IN PBUS_HANDLER BusHandler,
                              IN PBUS_HANDLER RootHandler,
                              IN ULONG BusInterruptLevel,
@@ -38,10 +67,17 @@
                              OUT PKIRQL Irql,
                              OUT PKAFFINITY Affinity)
 {
+    ULONG Vector;
+    
     /* Get the root vector */
-    DPRINT1("SYSTEM GetVector\n");
-    while (TRUE);
-    return 0;
+    Vector = HalpGetRootInterruptVector(BusInterruptLevel,
+                                        BusInterruptVector,
+                                        Irql,
+                                        Affinity);
+    
+    /* Check if the vector is owned by the HAL and fail if it is */
+    if (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) DPRINT1("Vector %lx is ALREADY IN USE!\n", Vector);
+    return (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) ? 0 : Vector;
 }
 
 /* EOF */




More information about the Ros-diffs mailing list