From c41cbd1d2633276d3a5be03510de85f7564161ee Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 24 Nov 2010 20:03:01 +0000 Subject: [PATCH] [NTOS] Add some missing intrinsics for MSVC svn path=/branches/cmake-bringup/; revision=49787 --- ntoskrnl/include/internal/i386/intrin_i.h | 48 +++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/ntoskrnl/include/internal/i386/intrin_i.h b/ntoskrnl/include/internal/i386/intrin_i.h index 6cb2a7cbf0a..3a2664ba5b4 100644 --- a/ntoskrnl/include/internal/i386/intrin_i.h +++ b/ntoskrnl/include/internal/i386/intrin_i.h @@ -144,6 +144,32 @@ __sgdt(OUT PVOID Descriptor) sgdt [eax] } } + +FORCEINLINE +VOID +__fxsave(OUT PFX_SAVE_AREA SaveArea) +{ + __asm mov eax, SaveArea + __asm fxsave [eax] +} + +FORCEINLINE +VOID +__fxrstor(IN PFX_SAVE_AREA SaveArea) +{ + __asm mov eax, SaveArea + __asm fxrstor [eax] +} + +FORCEINLINE +VOID +__fnsave(OUT PFLOATING_SAVE_AREA SaveArea) +{ + __asm mov eax, SaveArea + __asm fnsave [eax] + __asm wait; +} + #define Ke386GetGlobalDescriptorTable __sgdt FORCEINLINE @@ -268,6 +294,28 @@ Ke386SetGs(IN USHORT Value) __asm mov gs, ax; } +extern ULONG KeI386FxsrPresent; + +FORCEINLINE +VOID +Ke386SaveFpuState(IN PVOID SaveArea) +{ + if (KeI386FxsrPresent) + { + __fxsave(SaveArea); + } + else + { + __fnsave(SaveArea); + } +} + +#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