https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d88cd0eefc3da16e37270372df7b4fb39723e54f

commit d88cd0eefc3da16e37270372df7b4fb39723e54f
Author:     George Bișoc <[email protected]>
AuthorDate: Tue Jan 25 13:16:41 2022 +0100
Commit:     George Bișoc <[email protected]>
CommitDate: Tue May 24 18:39:45 2022 +0200

    [NTOS:KE] Move related FPU instrunctions to internal intrinsic file
---
 ntoskrnl/include/internal/i386/intrin_i.h | 55 ++++++++++++++++++++++++++++---
 1 file changed, 51 insertions(+), 4 deletions(-)

diff --git a/ntoskrnl/include/internal/i386/intrin_i.h 
b/ntoskrnl/include/internal/i386/intrin_i.h
index 4bdd8707449..d937057fd0c 100644
--- a/ntoskrnl/include/internal/i386/intrin_i.h
+++ b/ntoskrnl/include/internal/i386/intrin_i.h
@@ -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 */

Reply via email to