/* INCLUDES ****************************************************************/
-#include <ddk/ntddk.h>
+#define NTOS_MODE_KERNEL
+#include <ntos.h>
#include <roscfg.h>
#include <internal/ke.h>
#include <internal/ps.h>
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;
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
*/
{
KIRQL old_level;
+ KTRAP_FRAME KernelTrapFrame;
+ PKTHREAD CurrentThread;
+ PKTRAP_FRAME OldTrapFrame=NULL;
/*
* At this point we have interrupts disabled, nothing has been done to
return;
}
+
/*
* Enable interrupts
* NOTE: Only higher priority interrupts will get through
*/
__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 */
}
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
KeConnectInterrupt(PKINTERRUPT InterruptObject)
{
}
+/*
+ * @implemented
+ */
VOID STDCALL
KeDisconnectInterrupt(PKINTERRUPT InterruptObject)
/*
}
+/*
+ * @implemented
+ */
NTSTATUS
STDCALL
KeInitializeInterrupt(PKINTERRUPT InterruptObject,
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
IoConnectInterrupt(PKINTERRUPT* InterruptObject,
PKSERVICE_ROUTINE ServiceRoutine,
}
+/*
+ * @implemented
+ */
VOID STDCALL
IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
/*