update for HEAD-2003091401
[reactos.git] / ntoskrnl / ke / i386 / irq.c
index c098e71..29e6635 100644 (file)
@@ -35,7 +35,8 @@
 
 /* INCLUDES ****************************************************************/
 
-#include <ddk/ntddk.h>
+#define NTOS_MODE_KERNEL
+#include <ntos.h>
 #include <roscfg.h>
 #include <internal/ke.h>
 #include <internal/ps.h>
@@ -269,14 +270,12 @@ typedef struct _KIRQ_TRAPFRAME
    ULONG Eflags;
 } KIRQ_TRAPFRAME, *PKIRQ_TRAPFRAME;
 
-#ifdef DBG
-
 VOID
 KeIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame,
   PKTRAP_FRAME TrapFrame)
 {
    TrapFrame->Fs     = IrqTrapFrame->Fs;
-   TrapFrame->Fs     = IrqTrapFrame->Es;
+   TrapFrame->Es     = IrqTrapFrame->Es;
    TrapFrame->Ds     = IrqTrapFrame->Ds;
    TrapFrame->Eax    = IrqTrapFrame->Eax;
    TrapFrame->Ecx    = IrqTrapFrame->Ecx;
@@ -291,7 +290,25 @@ KeIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame,
    TrapFrame->Eflags = IrqTrapFrame->Eflags;
 }
 
-#endif
+VOID
+KeTrapFrameToIRQTrapFrame(PKTRAP_FRAME TrapFrame,
+  PKIRQ_TRAPFRAME IrqTrapFrame)
+{
+   IrqTrapFrame->Fs     = TrapFrame->Fs;
+   IrqTrapFrame->Es     = TrapFrame->Es;
+   IrqTrapFrame->Ds     = TrapFrame->Ds;
+   IrqTrapFrame->Eax    = TrapFrame->Eax;
+   IrqTrapFrame->Ecx    = TrapFrame->Ecx;
+   IrqTrapFrame->Edx    = TrapFrame->Edx;
+   IrqTrapFrame->Ebx    = TrapFrame->Ebx;
+   IrqTrapFrame->Esp    = TrapFrame->Esp;
+   IrqTrapFrame->Ebp    = TrapFrame->Ebp;
+   IrqTrapFrame->Esi    = TrapFrame->Esi;
+   IrqTrapFrame->Edi    = TrapFrame->Edi;
+   IrqTrapFrame->Eip    = TrapFrame->Eip;
+   IrqTrapFrame->Cs     = TrapFrame->Cs;
+   IrqTrapFrame->Eflags = TrapFrame->Eflags;
+}
 
 #ifdef MP
 
@@ -448,6 +465,9 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe)
  */
 {
    KIRQL old_level;
+   KTRAP_FRAME KernelTrapFrame;
+   PKTHREAD CurrentThread;
+   PKTRAP_FRAME OldTrapFrame=NULL;
 
    /*
     * At this point we have interrupts disabled, nothing has been done to
@@ -465,6 +485,7 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe)
        return;
      }
 
+
    /*
     * Enable interrupts
     * NOTE: Only higher priority interrupts will get through
@@ -497,6 +518,34 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe)
     */
    __asm__("cli\n\t");
    HalEndSystemInterrupt (old_level, 0);
+
+   if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS)
+     {
+       CurrentThread = KeGetCurrentThread();
+       if (CurrentThread!=NULL && CurrentThread->Alerted[1])
+         {
+           DPRINT("PID: %d, TID: %d CS %04x/%04x\n", 
+                 ((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId,
+                 ((PETHREAD)CurrentThread)->Cid.UniqueThread,
+                 Trapframe->Cs, 
+                 CurrentThread->TrapFrame ? CurrentThread->TrapFrame->Cs : 0);
+          if (CurrentThread->TrapFrame == NULL)
+            {
+              OldTrapFrame = CurrentThread->TrapFrame;
+              KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
+              CurrentThread->TrapFrame = &KernelTrapFrame;
+            }
+          
+           KiDeliverNormalApc();
+           
+          assert(KeGetCurrentThread() == CurrentThread);
+           if (CurrentThread->TrapFrame == &KernelTrapFrame)
+            {
+               KeTrapFrameToIRQTrapFrame(&KernelTrapFrame, Trapframe);
+              CurrentThread->TrapFrame = OldTrapFrame;
+            }
+        }
+     }
 }
 
 #endif /* MP */
@@ -523,6 +572,9 @@ KeDumpIrqList(VOID)
      }
 }
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 KeConnectInterrupt(PKINTERRUPT InterruptObject)
 {
@@ -588,6 +640,9 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject)
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 KeDisconnectInterrupt(PKINTERRUPT InterruptObject)
 /*
@@ -614,6 +669,9 @@ KeDisconnectInterrupt(PKINTERRUPT InterruptObject)
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS
 STDCALL
 KeInitializeInterrupt(PKINTERRUPT InterruptObject,
@@ -640,6 +698,9 @@ KeInitializeInterrupt(PKINTERRUPT InterruptObject,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 IoConnectInterrupt(PKINTERRUPT* InterruptObject,
                   PKSERVICE_ROUTINE ServiceRoutine,
@@ -739,6 +800,9 @@ IoConnectInterrupt(PKINTERRUPT* InterruptObject,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
 /*