1 #ifndef _INTRIN_INTERNAL_ 2 #define _INTRIN_INTERNAL_ 3 4 FORCEINLINE 5 VOID 6 KeSetCurrentIrql(KIRQL Irql) 7 { 8 __writecr8(Irql); 9 } 10 11 FORCEINLINE 12 PKGDTENTRY64 13 KiGetGdtEntry(PVOID pGdt, USHORT Selector) 14 { 15 return (PKGDTENTRY64)((ULONG64)pGdt + (Selector & ~RPL_MASK)); 16 } 17 18 FORCEINLINE 19 PVOID 20 KiGetGdtDescriptorBase(PKGDTENTRY Entry) 21 { 22 return (PVOID)((ULONG64)Entry->BaseLow | 23 (ULONG64)Entry->Bytes.BaseMiddle << 16 | 24 (ULONG64)Entry->Bytes.BaseHigh << 24 | 25 (ULONG64)Entry->BaseUpper << 32); 26 } 27 28 FORCEINLINE 29 VOID 30 KiSetGdtDescriptorBase(PKGDTENTRY Entry, ULONG64 Base) 31 { 32 Entry->BaseLow = Base & 0xffff; 33 Entry->Bits.BaseMiddle = (Base >> 16) & 0xff; 34 Entry->Bits.BaseHigh = (Base >> 24) & 0xff; 35 Entry->BaseUpper = Base >> 32; 36 } 37 38 FORCEINLINE 39 VOID 40 KiSetGdtDescriptorLimit(PKGDTENTRY Entry, ULONG Limit) 41 { 42 Entry->LimitLow = Limit & 0xffff; 43 Entry->Bits.LimitHigh = Limit >> 16; 44 } 45 46 FORCEINLINE 47 VOID 48 KiInitGdtEntry(PKGDTENTRY64 Entry, ULONG64 Base, ULONG Size, UCHAR Type, UCHAR Dpl) 49 { 50 KiSetGdtDescriptorBase(Entry, Base); 51 KiSetGdtDescriptorLimit(Entry, Size - 1); 52 Entry->Bits.Type = Type; 53 Entry->Bits.Dpl = Dpl; 54 Entry->Bits.Present = 1; 55 Entry->Bits.System = 0; 56 Entry->Bits.LongMode = 0; 57 Entry->Bits.DefaultBig = 0; 58 Entry->Bits.Granularity = 0; 59 Entry->MustBeZero = 0; 60 } 61 62 #if defined(__GNUC__) 63 64 static __inline__ __attribute__((always_inline)) void __lgdt(void *Source) 65 { 66 __asm__ __volatile__("lgdt %0" : : "m"(*(short*)Source)); 67 } 68 69 static __inline__ __attribute__((always_inline)) void __sgdt(void *Destination) 70 { 71 __asm__ __volatile__("sgdt %0" : : "m"(*(short*)Destination) : "memory"); 72 } 73 74 static __inline__ __attribute__((always_inline)) void __lldt(unsigned short Value) 75 { 76 __asm__ __volatile__("lldt %0" : : "rm"(Value)); 77 } 78 79 static __inline__ __attribute__((always_inline)) void __sldt(void *Destination) 80 { 81 __asm__ __volatile__("sldt %0" : : "m"(*(short*)Destination) : "memory"); 82 } 83 84 static __inline__ __attribute__((always_inline)) void __ltr(unsigned short Source) 85 { 86 __asm__ __volatile__("ltr %0" : : "rm"(Source)); 87 } 88 89 static __inline__ __attribute__((always_inline)) void __str(unsigned short *Destination) 90 { 91 __asm__ __volatile__("str %0" : : "m"(*Destination) : "memory"); 92 } 93 94 static __inline__ __attribute__((always_inline)) void __swapgs(void) 95 { 96 __asm__ __volatile__("swapgs" : : : "memory"); 97 } 98 99 #elif defined(_MSC_VER) 100 101 void __lgdt(void *Source); 102 103 void __sgdt(void *Destination); 104 105 void __lldt(unsigned short Value); 106 107 void __sldt(void *Destination); 108 109 void __ltr(unsigned short Source); 110 111 void __str(unsigned short *Destination); 112 113 void __swapgs(void); 114 115 #else 116 #error Unknown compiler for inline assembler 117 #endif 118 119 #endif 120 121 /* EOF */ 122