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" \
23 #define Ke386SetGlobalDescriptorTable(X) \
24 __asm__("lgdt %0\n\t" \
28 #define Ke386GetGlobalDescriptorTable(X) \
29 __asm__("sgdt %0\n\t" \
34 #define Ke386GetLocalDescriptorTable(X) \
35 __asm__("sldt %0\n\t" \
40 #define Ke386SetLocalDescriptorTable(X) \
41 __asm__("lldt %w0\n\t" \
45 #define Ke386SetTr(X) __asm__ __volatile__("ltr %%ax" : :"a" (X));
47 #define Ke386GetTr(X) \
48 __asm__("str %0\n\t" \
51 #define Ke386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
52 #define Ke386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
54 #define _Ke386GetSeg(N) ({ \
56 __asm__("movl %%" #N ",%0\n\t" :"=r" (__d)); \
60 #define _Ke386SetSeg(N,X) __asm__ __volatile__("movl %0,%%" #N : :"r" (X));
62 #define _Ke386GetDr(N) ({ \
64 __asm__("movl %%dr" #N ",%0\n\t" :"=r" (__d)); \
68 #define _Ke386SetDr(N,X) __asm__ __volatile__("movl %0,%%dr" #N : :"r" (X));
71 static inline void Ki386Cpuid(ULONG Op
, PULONG Eax
, PULONG Ebx
, PULONG Ecx
, PULONG Edx
)
74 : "=a" (*Eax
), "=b" (*Ebx
), "=c" (*Ecx
), "=d" (*Edx
)
78 #define Ke386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
79 #define Ke386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
81 #define Ke386HaltProcessor() __asm__("hlt\n\t");
83 #define Ke386FnInit() __asm__("fninit\n\t");
89 #define Ke386SetCr2(X) __asm__ __volatile__("movl %0,%%cr2" : :"r" (X));
94 #define Ke386GetDr0() _Ke386GetDr(0)
95 #define Ke386GetDr1() _Ke386GetDr(1)
96 #define Ke386SetDr0(X) _Ke386SetDr(0,X)
97 #define Ke386SetDr1(X) _Ke386SetDr(1,X)
98 #define Ke386GetDr2() _Ke386GetDr(2)
99 #define Ke386SetDr2(X) _Ke386SetDr(2,X)
100 #define Ke386GetDr3() _Ke386GetDr(3)
101 #define Ke386SetDr3(X) _Ke386SetDr(3,X)
102 #define Ke386GetDr4() _Ke386GetDr(4)
103 #define Ke386SetDr4(X) _Ke386SetDr(4,X)
104 #define Ke386GetDr6() _Ke386GetDr(6)
105 #define Ke386SetDr6(X) _Ke386SetDr(6,X)
106 #define Ke386GetDr7() _Ke386GetDr(7)
107 #define Ke386SetDr7(X) _Ke386SetDr(7,X)
112 #define Ke386GetSs() _Ke386GetSeg(ss)
113 #define Ke386GetFs() _Ke386GetSeg(fs)
114 #define Ke386SetFs(X) _Ke386SetSeg(fs, X)
115 #define Ke386SetDs(X) _Ke386SetSeg(ds, X)
116 #define Ke386SetEs(X) _Ke386SetSeg(es, X)
118 #elif defined(_MSC_VER)
122 Ke386Wrmsr(IN ULONG Register
,
126 __asm mov ecx
, Register
;
134 Ke386Rdmsr(IN ULONG Register
,
138 __asm mov ecx
, Register
;
146 Ki386Cpuid(IN ULONG Operation
,
152 __asm mov eax
, Operation
;
154 __asm mov
[Var1
], eax
;
155 __asm mov
[Var2
], ebx
;
156 __asm mov
[Var3
], ecx
;
157 __asm mov
[Var4
], edx
;
169 Ke386HaltProcessor(VOID
)
176 Ke386GetInterruptDescriptorTable(OUT KDESCRIPTOR Descriptor
)
178 __asm sidt Descriptor
;
183 Ke386SetInterruptDescriptorTable(IN KDESCRIPTOR Descriptor
)
185 __asm lidt Descriptor
;
190 Ke386GetGlobalDescriptorTable(OUT KDESCRIPTOR Descriptor
)
192 __asm sgdt Descriptor
;
197 Ke386SetGlobalDescriptorTable(IN KDESCRIPTOR Descriptor
)
199 __asm lgdt Descriptor
;
204 Ke386GetLocalDescriptorTable(OUT USHORT Descriptor
)
206 __asm sldt Descriptor
;
211 Ke386SetLocalDescriptorTable(IN USHORT Descriptor
)
213 __asm lldt Descriptor
;
218 Ke386SaveFlags(IN ULONG Flags
)
226 Ke386RestoreFlags(IN ULONG Flags
)
234 Ke386SetTr(IN USHORT Tr
)
241 Ke386GetTr(IN USHORT Tr
)
251 Ke386SetCr2(IN ULONG Value
)
253 __asm mov eax
, Value
;
304 Ke386SetDr0(IN ULONG Value
)
306 __asm mov eax
, Value
;
312 Ke386SetDr1(IN ULONG Value
)
314 __asm mov eax
, Value
;
320 Ke386SetDr2(IN ULONG Value
)
322 __asm mov eax
, Value
;
328 Ke386SetDr3(IN ULONG Value
)
330 __asm mov eax
, Value
;
336 Ke386SetDr6(IN ULONG Value
)
338 __asm mov eax
, Value
;
344 Ke386SetDr7(IN ULONG Value
)
346 __asm mov eax
, Value
;
383 Ke386SetSs(IN USHORT Value
)
391 Ke386SetFs(IN USHORT Value
)
399 Ke386SetDs(IN USHORT Value
)
407 Ke386SetEs(IN USHORT Value
)
414 #error Unknown compiler for inline assembler