[NTOS:KE] Move related FPU instrunctions to internal intrinsic file
authorGeorge Bișoc <george.bisoc@reactos.org>
Tue, 25 Jan 2022 12:16:41 +0000 (13:16 +0100)
committerGeorge Bișoc <george.bisoc@reactos.org>
Tue, 24 May 2022 16:39:45 +0000 (18:39 +0200)
ntoskrnl/include/internal/i386/intrin_i.h

index 4bdd870..d937057 100644 (file)
@@ -45,7 +45,6 @@ Ke386FxSave(IN PFX_SAVE_AREA SaveArea)
     asm volatile ("fxsave (%0)" : : "r"(SaveArea));
 }
 
-
 FORCEINLINE
 VOID
 Ke386FnSave(IN PFLOATING_SAVE_AREA SaveArea)
@@ -68,6 +67,28 @@ Ke386SaveFpuState(IN PFX_SAVE_AREA SaveArea)
     }
 }
 
+FORCEINLINE
+VOID
+Ke386RestoreFpuState(_In_ PFX_SAVE_AREA SaveArea)
+{
+    extern ULONG KeI386FxsrPresent;
+    if (KeI386FxsrPresent)
+    {
+        __asm__ __volatile__ ("fxrstor %0\n" : : "m"(*SaveArea));
+    }
+    else
+    {
+        __asm__ __volatile__ ("frstor %0\n\t" : "=m" (*SaveArea));
+    }
+}
+
+FORCEINLINE
+VOID
+Ke386ClearFpExceptions(VOID)
+{
+    __asm__ __volatile__ ("fnclex");
+}
+
 FORCEINLINE
 VOID
 __sldt(PVOID Descriptor)
@@ -163,6 +184,14 @@ __fxrstor(IN PFX_SAVE_AREA SaveArea)
     __asm fxrstor [eax]
 }
 
+FORCEINLINE
+VOID
+__frstor(_In_ PFX_SAVE_AREA SaveArea)
+{
+    __asm mov eax, SaveArea
+    __asm frstor [eax]
+}
+
 FORCEINLINE
 VOID
 __fnsave(OUT PFLOATING_SAVE_AREA SaveArea)
@@ -314,17 +343,36 @@ Ke386SaveFpuState(IN PVOID SaveArea)
     }
 }
 
+FORCEINLINE
+VOID
+Ke386RestoreFpuState(_In_ PVOID SaveArea)
+{
+    if (KeI386FxsrPresent)
+    {
+        __fxrstor((PFX_SAVE_AREA)SaveArea);
+    }
+    else
+    {
+        __frstor((PFX_SAVE_AREA)SaveArea);
+    }
+}
+
+FORCEINLINE
+VOID
+Ke386ClearFpExceptions(VOID)
+{
+    __asm fnclex;
+}
+
 #define Ke386FnSave __fnsave
 #define Ke386FxSave __fxsave
 // The name suggest, that the original author didn't understand what frstor means
 #define Ke386FxStore __fxrstor
 
-
 #else
 #error Unknown compiler for inline assembler
 #endif
 
-
 #define Ke386GetGlobalDescriptorTable __sgdt
 #define Ke386SetGlobalDescriptorTable __lgdt
 #define Ke386GetLocalDescriptorTable __sldt
@@ -333,5 +381,4 @@ Ke386SaveFpuState(IN PVOID SaveArea)
 } // extern "C"
 #endif
 
-
 /* EOF */