https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d88cd0eefc3da16e37270…
commit d88cd0eefc3da16e37270372df7b4fb39723e54f
Author: George Bișoc <george.bisoc(a)reactos.org>
AuthorDate: Tue Jan 25 13:16:41 2022 +0100
Commit: George Bișoc <george.bisoc(a)reactos.org>
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 */