X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fke%2Fi386%2Ffpu.c;h=b38eacfa8ba7463665df7fa358b10a7d0016ca92;hp=44472db4df39390631b57cd5f93660e1e5a14b3e;hb=HEAD;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/ntoskrnl/ke/i386/fpu.c b/ntoskrnl/ke/i386/fpu.c index 44472db..b38eacf 100644 --- a/ntoskrnl/ke/i386/fpu.c +++ b/ntoskrnl/ke/i386/fpu.c @@ -1,4 +1,5 @@ -/* +/* $Id$ + * * ReactOS kernel * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team * @@ -72,3 +73,35 @@ KiCheckFPU(VOID) __asm__(".byte 0xDB, 0xE4\n\t"); HardwareMathSupport = 1; } + +/* This is a rather naive implementation of Ke(Save/Restore)FloatingPointState + which will not work for WDM drivers. Please feel free to improve */ + +#define FPU_STATE_SIZE 108 + +NTSTATUS STDCALL +KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save) +{ + VOID **FpState = (VOID **) Save; + + *FpState = ExAllocatePool(PagedPool, FPU_STATE_SIZE); + if (NULL == *FpState) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + __asm__("fsave %0\n\t" : /* no output */ : "m" (*FpState)); + + return STATUS_SUCCESS; +} + +NTSTATUS STDCALL +KeRestoreFloatingPointState(IN PKFLOATING_SAVE Save) +{ + VOID **FpState = (VOID **) Save; + + __asm__("frstor %0\n\t" : /* no output */ : "m" (*FpState)); + ExFreePool(*FpState); + + return STATUS_SUCCESS; +}