VOID KiFastCallEntry(VOID);
VOID KiFastCallEntryWithSingleStep(VOID);
+extern PVOID FrRestore;
+VOID FASTCALL Ke386LoadFpuState(IN PFX_SAVE_AREA SaveArea);
+
/* GLOBALS ********************************************************************/
UCHAR KiTrapPrefixTable[] =
};
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
-#if DBG && !defined(_WINKD_)
+#if DBG && defined(_M_IX86) && !defined(_WINKD_)
PKDBG_PRESERVICEHOOK KeWin32PreServiceHook = NULL;
PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook = NULL;
#endif
SaveArea->Cr0NpxState |= CR0_TS;
/* Only valid if it happened during a restore */
- //if ((PVOID)TrapFrame->Eip == FrRestore)
+ if ((PVOID)TrapFrame->Eip == FrRestore)
{
/* It did, so just skip the instruction */
- //TrapFrame->Eip += 3; /* sizeof(FRSTOR) */
- //KiEoiHelper(TrapFrame);
+ TrapFrame->Eip += 3; /* Size of FRSTOR instruction */
+ KiEoiHelper(TrapFrame);
}
}
/* User or kernel trap -- get ready to issue an exception */
- //if (Thread->NpxState == NPX_STATE_NOT_LOADED)
+ if (Thread->NpxState == NPX_STATE_NOT_LOADED)
{
/* Update CR0 */
Cr0 = __readcr0();
KiEnterTrap(TrapFrame);
/* Try to handle NPX delay load */
- while (TRUE)
+ for (;;)
{
/* Get the current thread */
Thread = KeGetCurrentThread();
NpxSaveArea = KiGetThreadNpxArea(NpxThread);
/* Save FPU state */
- DPRINT("FIXME: Save FPU state: %p\n", NpxSaveArea);
- //Ke386SaveFpuState(NpxSaveArea);
+ Ke386SaveFpuState(NpxSaveArea);
/* Update NPX state */
NpxThread->NpxState = NPX_STATE_NOT_LOADED;
}
/* Load FPU state */
- //Ke386LoadFpuState(SaveArea);
+ Ke386LoadFpuState(SaveArea);
/* Update NPX state */
Thread->NpxState = NPX_STATE_LOADED;
{
/*
* If it's incorrectly set, then maybe the state is actually still valid
- * but we could've lock track of that due to a BIOS call.
+ * but we could have lost track of that due to a BIOS call.
* Make sure MP is still set, which should verify the theory.
*/
if (Cr0 & CR0_MP)
(PVOID)Cr2,
KiUserTrap(TrapFrame),
TrapFrame);
- if (NT_SUCCESS(Status)) KiEoiHelper(TrapFrame);
+ if (NT_SUCCESS(Status))
+ {
+#ifdef _WINKD_
+ /* Check whether the kernel debugger has owed breakpoints to be inserted */
+ KdSetOwedBreakpoints();
+#endif
+ /* We succeeded, return */
+ KiEoiHelper(TrapFrame);
+ }
/* Check for syscall fault */
#if 0