+
+/* 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;
+}