[HAL]
[reactos.git] / reactos / hal / halx86 / mp / mpsirql.c
index 9c13f46..de87b14 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
- * FILE:            ntoskrnl/hal/x86/mpsirql.c
+ * FILE:            hal/halx86/mp/mpsirql.c
  * PURPOSE:         Implements IRQLs for multiprocessor systems
  * PROGRAMMERS:     David Welch (welch@cwcom.net)
  *                  Casper S. Hornstrup (chorns@users.sourceforge.net)
 
 /* INCLUDES *****************************************************************/
 
-#include <ddk/ntddk.h>
-#include <internal/ke.h>
-#include <internal/ps.h>
-#include <ntos/minmax.h>
-#include <halirq.h>
 #include <hal.h>
-#include <mps.h>
-#include <apic.h>
-#include <ioapic.h>
-
 #define NDEBUG
-#include <internal/debug.h>
+#include <debug.h>
 
-/* GLOBALS ******************************************************************/;
+/* GLOBALS ******************************************************************/
 
 
 /* FUNCTIONS ****************************************************************/
 
-KIRQL STDCALL KeGetCurrentIrql (VOID)
+#undef KeGetCurrentIrql
+KIRQL NTAPI KeGetCurrentIrql (VOID)
 /*
  * PURPOSE: Returns the current irq level
  * RETURNS: The current irq level
@@ -38,23 +30,24 @@ KIRQL STDCALL KeGetCurrentIrql (VOID)
   KIRQL irql;
   ULONG Flags;
 
-  Ki386SaveFlags(Flags);
-  Ki386DisableInterrupts();
+  Flags = __readeflags();
+  _disable();
 
-  irql = Ki386ReadFsByte(offsetof(KPCR, Irql));
+  irql = __readfsbyte(FIELD_OFFSET(KPCR, Irql));
   if (irql > HIGH_LEVEL)
     {
       DPRINT1 ("CurrentIrql %x\n", irql);
-      KEBUGCHECK (0);
+      ASSERT(FALSE);
     }
-  if (Flags & X86_EFLAGS_IF)
+  if (Flags & EFLAGS_INTERRUPT_MASK)
     {
-      Ki386EnableInterrupts();
+      _enable();
     }
   return irql;
 }
 
 
+#undef KeSetCurrentIrql
 VOID KeSetCurrentIrql (KIRQL NewIrql)
 /*
  * PURPOSE: Sets the current irq level without taking any action
@@ -64,40 +57,42 @@ VOID KeSetCurrentIrql (KIRQL NewIrql)
   if (NewIrql > HIGH_LEVEL)
   {
     DPRINT1 ("NewIrql %x\n", NewIrql);
-    KEBUGCHECK (0);
+    ASSERT(FALSE);
   }
-  Ki386SaveFlags(Flags);
-  Ki386DisableInterrupts();
-  Ki386WriteFsByte(offsetof(KPCR, Irql), NewIrql);
-  if (Flags & X86_EFLAGS_IF)
+  Flags = __readeflags();
+  _disable();
+  __writefsbyte(FIELD_OFFSET(KPCR, Irql), NewIrql);
+  if (Flags & EFLAGS_INTERRUPT_MASK)
     {
-      Ki386EnableInterrupts();
+      _enable();
     }
 }
 
 VOID 
-HalpLowerIrql(KIRQL NewIrql, BOOL FromHalEndSystemInterrupt)
+HalpLowerIrql(KIRQL NewIrql, BOOLEAN FromHalEndSystemInterrupt)
 {
   ULONG Flags;
+  UCHAR DpcRequested;
   if (NewIrql >= DISPATCH_LEVEL)
     {
       KeSetCurrentIrql (NewIrql);
       APICWrite(APIC_TPR, IRQL2TPR (NewIrql) & APIC_TPR_PRI);
       return;
     }
-  Ki386SaveFlags(Flags);
+  Flags = __readeflags();
   if (KeGetCurrentIrql() > APC_LEVEL)
     {
       KeSetCurrentIrql (DISPATCH_LEVEL);
       APICWrite(APIC_TPR, IRQL2TPR (DISPATCH_LEVEL) & APIC_TPR_PRI);
-      if (FromHalEndSystemInterrupt || Ki386ReadFsByte(offsetof(KPCR, HalReserved[HAL_DPC_REQUEST])))
+      DpcRequested = __readfsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_DPC_REQUEST]));
+      if (FromHalEndSystemInterrupt || DpcRequested)
         {
-          Ki386WriteFsByte(offsetof(KPCR, HalReserved[HAL_DPC_REQUEST]), 0);
-          Ki386EnableInterrupts();
+          __writefsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_DPC_REQUEST]), 0);
+          _enable();
           KiDispatchInterrupt();
-          if (!(Flags & X86_EFLAGS_IF))
+          if (!(Flags & EFLAGS_INTERRUPT_MASK))
             {
-              Ki386DisableInterrupts();
+              _disable();
             }
        }
       KeSetCurrentIrql (APC_LEVEL);
@@ -109,11 +104,11 @@ HalpLowerIrql(KIRQL NewIrql, BOOL FromHalEndSystemInterrupt)
   if (KeGetCurrentThread () != NULL && 
       KeGetCurrentThread ()->ApcState.KernelApcPending)
     {
-      Ki386EnableInterrupts();
+      _enable();
       KiDeliverApc(KernelMode, NULL, NULL);
-      if (!(Flags & X86_EFLAGS_IF))
+      if (!(Flags & EFLAGS_INTERRUPT_MASK))
         {
-          Ki386DisableInterrupts();
+          _disable();
         }
     }
   KeSetCurrentIrql (PASSIVE_LEVEL);
@@ -143,7 +138,7 @@ KfLowerIrql (KIRQL  NewIrql)
   if (NewIrql > oldIrql)
     {
       DPRINT1 ("NewIrql %x CurrentIrql %x\n", NewIrql, oldIrql);
-      KEBUGCHECK (0);
+      ASSERT(FALSE);
     }
   HalpLowerIrql (NewIrql, FALSE);
 }
@@ -164,8 +159,8 @@ KfLowerIrql (KIRQL  NewIrql)
  *
  * NOTES
  */
-
-VOID STDCALL
+#undef KeLowerIrql
+VOID NTAPI
 KeLowerIrql (KIRQL NewIrql)
 {
   KfLowerIrql (NewIrql);
@@ -195,15 +190,15 @@ KfRaiseIrql (KIRQL        NewIrql)
   KIRQL OldIrql;
   ULONG Flags;
  
-  Ki386SaveFlags(Flags);
-  Ki386DisableInterrupts();
+  Flags = __readeflags();
+  _disable();
 
   OldIrql = KeGetCurrentIrql ();
 
   if (NewIrql < OldIrql)
     {
       DPRINT1 ("CurrentIrql %x NewIrql %x\n", KeGetCurrentIrql (), NewIrql);
-      KEBUGCHECK (0);
+      ASSERT(FALSE);
     }
 
 
@@ -212,9 +207,9 @@ KfRaiseIrql (KIRQL  NewIrql)
       APICWrite (APIC_TPR, IRQL2TPR(NewIrql) & APIC_TPR_PRI);
     }
   KeSetCurrentIrql (NewIrql);
-  if (Flags & X86_EFLAGS_IF)
+  if (Flags & EFLAGS_INTERRUPT_MASK)
     {
-      Ki386EnableInterrupts();
+      _enable();
     }
 
   return OldIrql;
@@ -238,7 +233,8 @@ KfRaiseIrql (KIRQL  NewIrql)
  * NOTES
  *     Calls KfRaiseIrql
  */
-VOID STDCALL
+#undef KeRaiseIrql
+VOID NTAPI
 KeRaiseIrql (KIRQL     NewIrql,
        PKIRQL  OldIrql)
 {
@@ -263,7 +259,7 @@ KeRaiseIrql (KIRQL  NewIrql,
  *     Calls KfRaiseIrql
  */
 
-KIRQL STDCALL
+KIRQL NTAPI
 KeRaiseIrqlToDpcLevel (VOID)
 {
   return KfRaiseIrql (DISPATCH_LEVEL);
@@ -287,16 +283,16 @@ KeRaiseIrqlToDpcLevel (VOID)
  *     Calls KfRaiseIrql
  */
 
-KIRQL STDCALL
+KIRQL NTAPI
 KeRaiseIrqlToSynchLevel (VOID)
 {
   return KfRaiseIrql (CLOCK2_LEVEL);
 }
 
 
-BOOLEAN STDCALL
-HalBeginSystemInterrupt (ULONG Vector,
-                        KIRQL Irql,
+BOOLEAN NTAPI
+HalBeginSystemInterrupt (KIRQL Irql,
+                        UCHAR Vector,
                         PKIRQL OldIrql)
 {
   ULONG Flags;
@@ -305,14 +301,14 @@ HalBeginSystemInterrupt (ULONG Vector,
   if (KeGetCurrentIrql () >= Irql)
   {
     DPRINT1("current irql %d, new irql %d\n", KeGetCurrentIrql(), Irql);
-    KEBUGCHECK(0);
+    ASSERT(FALSE);
   }
 
-  Ki386SaveFlags(Flags);
-  if (Flags & X86_EFLAGS_IF)
+  Flags = __readeflags();
+  if (Flags & EFLAGS_INTERRUPT_MASK)
   {
      DPRINT1("HalBeginSystemInterrupt was called with interrupt's enabled\n");
-     KEBUGCHECK(0);
+     ASSERT(FALSE);
   }
   APICWrite (APIC_TPR, IRQL2TPR (Irql) & APIC_TPR_PRI);
   *OldIrql = KeGetCurrentIrql ();
@@ -321,28 +317,29 @@ HalBeginSystemInterrupt (ULONG Vector,
 }
 
 
-VOID STDCALL
+VOID NTAPI
 HalEndSystemInterrupt (KIRQL Irql,
-                      ULONG Unknown2)
+                       IN PKTRAP_FRAME TrapFrame)
 /*
  * FUNCTION: Finish a system interrupt and restore the specified irq level.
  */
 {
   ULONG Flags;
-  Ki386SaveFlags(Flags);
+  Flags = __readeflags();
 
-  if (Flags & X86_EFLAGS_IF)
+  if (Flags & EFLAGS_INTERRUPT_MASK)
   {
      DPRINT1("HalEndSystemInterrupt was called with interrupt's enabled\n");
-     KEBUGCHECK(0);
+     ASSERT(FALSE);
   }
   APICSendEOI();
   HalpLowerIrql (Irql, TRUE);
 }
   
-BOOLEAN STDCALL
-HalDisableSystemInterrupt (ULONG Vector,
-                          KIRQL Irql)
+VOID
+NTAPI
+HalDisableSystemInterrupt(UCHAR Vector,
+                         KIRQL Irql)
 {
   ULONG irq;
 
@@ -352,18 +349,19 @@ HalDisableSystemInterrupt (ULONG Vector,
       Vector >= FIRST_DEVICE_VECTOR + NUMBER_DEVICE_VECTORS)  
   {
     DPRINT1("Not a device interrupt, vector=%x\n", Vector);
-    return FALSE;
+    ASSERT(FALSE);
+    return;
   }
 
   irq = VECTOR2IRQ (Vector);
   IOAPICMaskIrq (irq);
 
-  return TRUE;  
+  return;  
 }
 
 
-BOOLEAN STDCALL
-HalEnableSystemInterrupt (ULONG Vector,
+BOOLEAN NTAPI
+HalEnableSystemInterrupt (UCHAR Vector,
                          KIRQL Irql,
                          KINTERRUPT_MODE InterruptMode)
 {
@@ -390,14 +388,21 @@ HalRequestSoftwareInterrupt(IN KIRQL Request)
   switch (Request)
   {
     case APC_LEVEL:
-      Ki386WriteFsByte(offsetof(KPCR, HalReserved[HAL_APC_REQUEST]), 1);
+      __writefsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_APC_REQUEST]), 1);
       break;
 
     case DISPATCH_LEVEL:
-      Ki386WriteFsByte(offsetof(KPCR, HalReserved[HAL_DPC_REQUEST]), 1);
+      __writefsbyte(FIELD_OFFSET(KIPCR, HalReserved[HAL_DPC_REQUEST]), 1);
       break;
       
     default:
-      KEBUGCHECK(0);
+      ASSERT(FALSE);
   }
 }
+
+VOID FASTCALL
+HalClearSoftwareInterrupt(
+  IN KIRQL Request)
+{
+  UNIMPLEMENTED;
+}