#ifndef _INTRIN_INTERNAL_
#define _INTRIN_INTERNAL_
-VOID
FORCEINLINE
+VOID
KeSetCurrentIrql(KIRQL Irql)
{
__writecr8(Irql);
}
-PKGDTENTRY64
FORCEINLINE
+PKGDTENTRY64
KiGetGdtEntry(PVOID pGdt, USHORT Selector)
{
return (PKGDTENTRY64)((ULONG64)pGdt + (Selector & ~RPL_MASK));
}
-PVOID
FORCEINLINE
+PVOID
KiGetGdtDescriptorBase(PKGDTENTRY Entry)
{
return (PVOID)((ULONG64)Entry->BaseLow |
(ULONG64)Entry->BaseUpper << 32);
}
-VOID
FORCEINLINE
+VOID
KiSetGdtDescriptorBase(PKGDTENTRY Entry, ULONG64 Base)
{
Entry->BaseLow = Base & 0xffff;
Entry->BaseUpper = Base >> 32;
}
-VOID
FORCEINLINE
+VOID
KiSetGdtDescriptorLimit(PKGDTENTRY Entry, ULONG Limit)
{
Entry->LimitLow = Limit & 0xffff;
Entry->Bits.LimitHigh = Limit >> 16;
}
-VOID
FORCEINLINE
+VOID
KiInitGdtEntry(PKGDTENTRY64 Entry, ULONG64 Base, ULONG Size, UCHAR Type, UCHAR Dpl)
{
KiSetGdtDescriptorBase(Entry, Base);
__asm__ __volatile__("sldt %0" : : "m"(*(short*)Destination) : "memory");
}
-static __inline__ __attribute__((always_inline)) void __ldmxcsr(unsigned long *Source)
-{
- __asm__ __volatile__("ldmxcsr %0" : : "m"(*Source));
-}
-
-static __inline__ __attribute__((always_inline)) void __stmxcsr(unsigned long *Destination)
-{
- __asm__ __volatile__("stmxcsr %0" : : "m"(*Destination) : "memory");
-}
-
static __inline__ __attribute__((always_inline)) void __ltr(unsigned short Source)
{
__asm__ __volatile__("ltr %0" : : "rm"(Source));
__asm__ __volatile__("str %0" : : "m"(*Destination) : "memory");
}
+static __inline__ __attribute__((always_inline)) void __swapgs(void)
+{
+ __asm__ __volatile__("swapgs" : : : "memory");
+}
#elif defined(_MSC_VER)
void __str(unsigned short *Destination);
+void __swapgs(void);
#else
#error Unknown compiler for inline assembler