1 #ifndef _INTRIN_INTERNAL_
2 #define _INTRIN_INTERNAL_
12 #define Ke386SetInterruptDescriptorTable(X) \
13 __asm__("lidt %0\n\t" \
17 #define Ke386GetInterruptDescriptorTable(X) \
18 __asm__("sidt %0\n\t" \
22 #define Ke386SetGlobalDescriptorTable(X) \
23 __asm__("lgdt %0\n\t" \
27 #define Ke386GetGlobalDescriptorTable(X) \
28 __asm__("sgdt %0\n\t" \
32 #define Ke386GetLocalDescriptorTable(X) \
33 __asm__("sldt %0\n\t" \
37 #define Ke386SetLocalDescriptorTable(X) \
38 __asm__("lldt %w0\n\t" \
42 #define Ke386SetTr(X) __asm__ __volatile__("ltr %%ax" : :"a" (X));
44 #define Ke386GetTr(X) \
45 __asm__("str %0\n\t" \
49 #define Ke386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
50 #define Ke386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
52 #define _Ke386GetSeg(N) ({ \
54 __asm__("movl %%" #N ",%0\n\t" :"=r" (__d)); \
58 #define _Ke386SetSeg(N,X) __asm__ __volatile__("movl %0,%%" #N : :"r" (X));
60 #define _Ke386GetDr(N) ({ \
62 __asm__("movl %%dr" #N ",%0\n\t" :"=r" (__d)); \
66 #define _Ke386SetDr(N,X) __asm__ __volatile__("movl %0,%%dr" #N : :"r" (X));
69 static inline void Ki386Cpuid(ULONG Op
, PULONG Eax
, PULONG Ebx
, PULONG Ecx
, PULONG Edx
)
72 : "=a" (*Eax
), "=b" (*Ebx
), "=c" (*Ecx
), "=d" (*Edx
)
76 #define Ke386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
77 #define Ke386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
79 #define Ke386HaltProcessor() __asm__("hlt\n\t");
81 #define Ke386FnInit() __asm__("fninit\n\t");
87 #define Ke386SetCr2(X) __asm__ __volatile__("movl %0,%%cr2" : :"r" (X));
92 #define Ke386GetDr0() _Ke386GetDr(0)
93 #define Ke386GetDr1() _Ke386GetDr(1)
94 #define Ke386SetDr0(X) _Ke386SetDr(0,X)
95 #define Ke386SetDr1(X) _Ke386SetDr(1,X)
96 #define Ke386GetDr2() _Ke386GetDr(2)
97 #define Ke386SetDr2(X) _Ke386SetDr(2,X)
98 #define Ke386GetDr3() _Ke386GetDr(3)
99 #define Ke386SetDr3(X) _Ke386SetDr(3,X)
100 #define Ke386GetDr4() _Ke386GetDr(4)
101 #define Ke386SetDr4(X) _Ke386SetDr(4,X)
102 #define Ke386GetDr6() _Ke386GetDr(6)
103 #define Ke386SetDr6(X) _Ke386SetDr(6,X)
104 #define Ke386GetDr7() _Ke386GetDr(7)
105 #define Ke386SetDr7(X) _Ke386SetDr(7,X)
110 #define Ke386GetSs() _Ke386GetSeg(ss)
111 #define Ke386GetFs() _Ke386GetSeg(fs)
112 #define Ke386SetFs(X) _Ke386SetSeg(fs, X)
113 #define Ke386SetDs(X) _Ke386SetSeg(ds, X)
114 #define Ke386SetEs(X) _Ke386SetSeg(es, X)
116 #elif defined(_MSC_VER)
120 Ke386Wrmsr(IN ULONG Register
,
131 Ke386Rdmsr(IN ULONG Register
,
142 Ki386Cpuid(IN ULONG Operation
,
148 __asm mov eax
, Operation
;
150 __asm mov
[Var1
], eax
;
151 __asm mov
[Var2
], ebx
;
152 __asm mov
[Var3
], ecx
;
153 __asm mov
[Var4
], edx
;
165 Ke386HaltProcessor(VOID
)
172 Ke386GetInterruptDescriptorTable(OUT KDESCRIPTOR Descriptor
)
174 __asm sidt Descriptor
;
179 Ke386SetInterruptDescriptorTable(IN KDESCRIPTOR Descriptor
)
181 __asm lidt Descriptor
;
186 Ke386GetGlobalDescriptorTable(OUT KDESCRIPTOR Descriptor
)
188 __asm sgdt Descriptor
;
193 Ke386SetGlobalDescriptorTable(IN KDESCRIPTOR Descriptor
)
195 __asm lgdt Descriptor
;
200 Ke386GetLocalDescriptorTable(OUT USHORT Descriptor
)
202 __asm sldt Descriptor
;
207 Ke386SetLocalDescriptorTable(IN USHORT Descriptor
)
209 __asm lldt Descriptor
;
214 Ke386SaveFlags(IN ULONG Flags
)
222 Ke386RestoreFlags(IN ULONG Flags
)
230 Ke386SetTr(IN USHORT Tr
)
237 Ke386GetTr(IN USHORT Tr
)
247 Ke386SetCr2(IN ULONG Value
)
249 __asm mov eax
, Value
;
300 Ke386SetDr0(IN ULONG Value
)
302 __asm mov eax
, Value
;
308 Ke386SetDr1(IN ULONG Value
)
310 __asm mov eax
, Value
;
316 Ke386SetDr2(IN ULONG Value
)
318 __asm mov eax
, Value
;
324 Ke386SetDr3(IN ULONG Value
)
326 __asm mov eax
, Value
;
332 Ke386SetDr6(IN ULONG Value
)
334 __asm mov eax
, Value
;
340 Ke386SetDr7(IN ULONG Value
)
342 __asm mov eax
, Value
;
379 Ke386SetSs(IN USHORT Value
)
387 Ke386SetFs(IN USHORT Value
)
395 Ke386SetDs(IN USHORT Value
)
403 Ke386SetEs(IN USHORT Value
)
410 #error Unknown compiler for inline assembler