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