update for HEAD-2003091401
[reactos.git] / ntoskrnl / ke / i386 / fpu.c
index 44472db..b38eacf 100644 (file)
@@ -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;
+}