- Update KTHREAD and KUSER_SHARED_DATA to latest versions. This should make 2K3 drive...
[reactos.git] / reactos / ntoskrnl / ke / i386 / fpu.c
index 901885c..1a0447d 100644 (file)
@@ -326,6 +326,7 @@ KiGetFpuState(PKTHREAD Thread)
 {
     PFX_SAVE_AREA FxSaveArea = NULL;
     KIRQL OldIrql;
+    ULONG Cr0;
 
     KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
     if (Thread->NpxState & NPX_STATE_VALID)
@@ -334,16 +335,19 @@ KiGetFpuState(PKTHREAD Thread)
         if (Thread->NpxState & NPX_STATE_DIRTY)
         {
             ASSERT(KeGetCurrentPrcb()->NpxThread == Thread);
-            ASSERT((Ke386GetCr0() & X86_CR0_TS) == 0);
 
+            Cr0 = Ke386GetCr0();
+            asm volatile("clts");
             if (FxsrSupport)
                 asm volatile("fxsave %0" : : "m"(FxSaveArea->U.FxArea));
             else
             {
-                KeGetCurrentPrcb()->NpxThread = NULL;
                 asm volatile("fnsave %0" : : "m"(FxSaveArea->U.FnArea));
-                Ke386SetCr0(Ke386GetCr0() | X86_CR0_TS); /* FPU state has to be reloaded because fnsave changes it. */
+                /* FPU state has to be reloaded because fnsave changes it. */
+                Cr0 |= X86_CR0_TS;
+                KeGetCurrentPrcb()->NpxThread = NULL;
             }
+            Ke386SetCr0(Cr0);
             Thread->NpxState = NPX_STATE_VALID;
         }
     }
@@ -567,7 +571,7 @@ KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save)
 #error Unknown compiler for inline assembler
 #endif
 
-    KeGetCurrentThread()->NpxIrql = KeGetCurrentIrql();
+    KeGetCurrentThread()->DispatcherHeader.NpxIrql = KeGetCurrentIrql();
 
     return STATUS_SUCCESS;
 }
@@ -578,7 +582,7 @@ KeRestoreFloatingPointState(IN PKFLOATING_SAVE Save)
 {
     PFNSAVE_FORMAT FpState = *((PVOID *) Save);
 
-    if (KeGetCurrentThread()->NpxIrql != KeGetCurrentIrql())
+    if (KeGetCurrentThread()->DispatcherHeader.NpxIrql != KeGetCurrentIrql())
     {
         KEBUGCHECK(UNDEFINED_BUG_CODE);
     }