From ff9641a734adc7cf7cb4d0ff2685132824533221 Mon Sep 17 00:00:00 2001 From: Gregor Anich Date: Thu, 6 Oct 2005 20:34:20 +0000 Subject: [PATCH] Fix KiGetFpuState() - Thanks to Hartmut for finding this bug and testing the patch. svn path=/trunk/; revision=18300 --- reactos/ntoskrnl/ke/i386/fpu.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/fpu.c b/reactos/ntoskrnl/ke/i386/fpu.c index 901885c990d..43e83ae02d4 100644 --- a/reactos/ntoskrnl/ke/i386/fpu.c +++ b/reactos/ntoskrnl/ke/i386/fpu.c @@ -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; } }