1 #ifndef _INTRIN_INTERNAL_
2 #define _INTRIN_INTERNAL_
6 #define Ke386SetGlobalDescriptorTable(X) \
7 __asm__("lgdt %0\n\t" \
11 #define Ke386GetGlobalDescriptorTable(X) \
12 __asm__("sgdt %0\n\t" \
19 Ke386SaveFpuState(IN PFX_SAVE_AREA SaveArea
)
21 extern ULONG KeI386FxsrPresent
;
22 if (KeI386FxsrPresent
)
24 __asm__
__volatile__ ("fxsave %0\n" : : "m"(SaveArea
));
28 __asm__
__volatile__ ("fnsave %0\n wait\n" : : "m"(SaveArea
));
34 Ke386LoadFpuState(IN PFX_SAVE_AREA SaveArea
)
36 extern ULONG KeI386FxsrPresent
;
37 if (KeI386FxsrPresent
)
39 __asm__
__volatile__ ("fxrstor %0\n" : "=m"(SaveArea
) : );
43 __asm__
__volatile__ (".globl _FrRestore\n _FrRestore: \n frstor %0\n wait\n" : "=m"(SaveArea
) : );
49 Ke386GetLocalDescriptorTable()
59 #define Ke386SetLocalDescriptorTable(X) \
60 __asm__("lldt %w0\n\t" \
64 #define Ke386SetTr(X) __asm__ __volatile__("ltr %%ax" : :"a" (X));
76 #define _Ke386GetSeg(N) ({ \
78 __asm__("movl %%" #N ",%0\n\t" :"=r" (__d)); \
82 #define _Ke386SetSeg(N,X) __asm__ __volatile__("movl %0,%%" #N : :"r" (X));
84 #define Ke386FnInit() __asm__("fninit\n\t");
85 #define Ke386ClearDirectionFlag() __asm__ __volatile__ ("cld")
91 #define Ke386SetCr2(X) __asm__ __volatile__("movl %0,%%cr2" : :"r" (X));
96 #define Ke386GetSs() _Ke386GetSeg(ss)
97 #define Ke386GetFs() _Ke386GetSeg(fs)
98 #define Ke386GetDs() _Ke386GetSeg(ds)
99 #define Ke386GetEs() _Ke386GetSeg(es)
100 #define Ke386GetGs() _Ke386GetSeg(gs)
101 #define Ke386SetFs(X) _Ke386SetSeg(fs, X)
102 #define Ke386SetDs(X) _Ke386SetSeg(ds, X)
103 #define Ke386SetEs(X) _Ke386SetSeg(es, X)
104 #define Ke386SetSs(X) _Ke386SetSeg(ss, X)
105 #define Ke386SetGs(X) _Ke386SetSeg(gs, X)
107 #elif defined(_MSC_VER)
118 Ke386GetGlobalDescriptorTable(OUT PVOID Descriptor
)
120 __asm sgdt
[Descriptor
];
125 Ke386SetGlobalDescriptorTable(IN PVOID Descriptor
)
127 __asm lgdt
[Descriptor
];
132 Ke386GetLocalDescriptorTable(VOID
)
139 Ke386SetLocalDescriptorTable(IN USHORT Descriptor
)
141 __asm lldt Descriptor
;
146 Ke386SetTr(IN USHORT Tr
)
163 Ke386SetCr2(IN ULONG Value
)
165 __asm mov eax
, Value
;
202 Ke386SetSs(IN USHORT Value
)
210 Ke386SetFs(IN USHORT Value
)
218 Ke386SetDs(IN USHORT Value
)
226 Ke386SetEs(IN USHORT Value
)
234 Ke386SetGs(IN USHORT Value
)
241 #error Unknown compiler for inline assembler