#include <asm.inc>
#include <ks386.inc>
-EXTERN _GdtRegister:DWORD
-EXTERN _IdtRegister:DWORD
-EXTERN _BootAppGdtRegister:DWORD
-EXTERN _BootAppIdtRegister:DWORD
+EXTERN _GdtRegister:FWORD
+EXTERN _IdtRegister:FWORD
+EXTERN _BootAppGdtRegister:FWORD
+EXTERN _BootAppIdtRegister:FWORD
EXTERN _BootApp32Stack:DWORD
EXTERN _BootApp32EntryRoutine:DWORD
EXTERN _BootApp32Parameters:DWORD
mov ebx, esp
/* Save current GDT/IDT, then load new one */
- sgdt fword ptr _GdtRegister
- sidt fword ptr _IdtRegister
- lgdt fword ptr _BootAppGdtRegister
- lidt fword ptr _BootAppIdtRegister
+ sgdt _GdtRegister
+ sidt _IdtRegister
+ lgdt _BootAppGdtRegister
+ lidt _BootAppIdtRegister
/* Load the new stack */
xor ebp, ebp
mov esp, ebx
/* Restore old GDT/IDT */
- lgdt fword ptr _GdtRegister
- lidt fword ptr _IdtRegister
+ lgdt _GdtRegister
+ lidt _IdtRegister
/* Retore old segments */
pop ds
pop ebp
/* All done */
- retn
+ ret
END
__asm__ __volatile__("sidt %0" : : "m"(*(short*)Destination) : "memory");
}
+__INTRIN_INLINE void _sgdt(void *Destination)
+{
+ __asm__ __volatile__("sgdt %0" : : "m"(*(short*)Destination) : "memory");
+}
+
/*** Misc operations ***/
__INTRIN_INLINE void _mm_pause(void)
#pragma intrinsic(__wbinvd)
#pragma intrinsic(__lidt)
#pragma intrinsic(__sidt)
+#if (_MSC_VER >= 1800)
+#pragma intrinsic(_sgdt)
+#else
+__forceinline
+void _sgdt(void *Destination)
+{
+ __asm
+ {
+ mov eax, Destination
+ sgdt [eax]
+ }
+}
+#endif
#pragma intrinsic(_mm_pause)
#endif
#if defined(_M_ARM)