[NTOS:KE] Move related FPU instrunctions to internal intrinsic file

This commit is contained in:
George Bișoc
2022-01-25 13:16:41 +01:00
parent 657bc083dc
commit d88cd0eefc

View 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 */