1 #ifndef _INTRIN_INTERNAL_
2 #define _INTRIN_INTERNAL_
12 #define Ke386SetGlobalDescriptorTable(X) \
13 __asm__("lgdt %0\n\t" \
17 #define Ke386GetGlobalDescriptorTable(X) \
18 __asm__("sgdt %0\n\t" \
23 #define Ke386GetLocalDescriptorTable(X) \
24 __asm__("sldt %0\n\t" \
29 #define Ke386SetLocalDescriptorTable(X) \
30 __asm__("lldt %w0\n\t" \
34 #define Ke386SetTr(X) __asm__ __volatile__("ltr %%ax" : :"a" (X));
36 #define Ke386GetTr(X) \
37 __asm__("str %0\n\t" \
40 #define _Ke386GetSeg(N) ({ \
42 __asm__("movl %%" #N ",%0\n\t" :"=r" (__d)); \
46 #define _Ke386SetSeg(N,X) __asm__ __volatile__("movl %0,%%" #N : :"r" (X));
48 #define Ke386HaltProcessor() __asm__("hlt\n\t");
50 #define Ke386FnInit() __asm__("fninit\n\t");
56 #define Ke386SetCr2(X) __asm__ __volatile__("movl %0,%%cr2" : :"r" (X));
61 #define Ke386GetSs() _Ke386GetSeg(ss)
62 #define Ke386GetFs() _Ke386GetSeg(fs)
63 #define Ke386SetFs(X) _Ke386SetSeg(fs, X)
64 #define Ke386SetDs(X) _Ke386SetSeg(ds, X)
65 #define Ke386SetEs(X) _Ke386SetSeg(es, X)
66 #define Ke386SetSs(X) _Ke386SetSeg(ss, X)
67 #define Ke386SetGs(X) _Ke386SetSeg(gs, X)
69 #elif defined(_MSC_VER)
80 Ke386HaltProcessor(VOID
)
87 Ke386GetGlobalDescriptorTable(OUT PVOID Descriptor
)
89 __asm sgdt
[Descriptor
];
94 Ke386SetGlobalDescriptorTable(IN PVOID Descriptor
)
96 __asm lgdt
[Descriptor
];
101 Ke386GetLocalDescriptorTable(OUT PUSHORT Descriptor
)
104 __asm sldt _Descriptor
;
105 *Descriptor
= _Descriptor
;
110 Ke386SetLocalDescriptorTable(IN USHORT Descriptor
)
112 __asm lldt Descriptor
;
117 Ke386SetTr(IN USHORT Tr
)
124 Ke386GetTr(OUT PUSHORT Tr
)
136 Ke386SetCr2(IN ULONG Value
)
138 __asm mov eax
, Value
;
175 Ke386SetSs(IN USHORT Value
)
183 Ke386SetFs(IN USHORT Value
)
191 Ke386SetDs(IN USHORT Value
)
199 Ke386SetEs(IN USHORT Value
)
207 Ke386SetGs(IN USHORT Value
)
214 #error Unknown compiler for inline assembler