* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
* Timo Kreuzer (timo.kreuzer@reactos.org)
*/
-
+
// Arguments for idt
#define INT_32_DPL0 HEX(08E00)
#define INT_32_DPL3 HEX(0EE00)
#else
#define LOCK
#define ACQUIRE_SPINLOCK(x, y)
-#define RELEASE_SPINLOCK(x)
+#define RELEASE_SPINLOCK(x)
#endif
//
// @remark None.
//
MACRO(idt, Handler, Bits)
- .long \Handler
- .short \Bits
+ .long VAL(Handler)
+ .short VAL(Bits)
.short KGDT_R0_CODE
ENDM
mov [esp + KTRAP_FRAME_EAX], eax
/* Does the caller want nonvolatiles only? */
- if ((Flags AND KI_NONVOLATILES_ONLY) == 0)
+ if (NOT (Flags AND KI_NONVOLATILES_ONLY))
/* Otherwise, save the volatiles as well */
mov [esp + KTRAP_FRAME_ECX], ecx
mov [esp + KTRAP_FRAME_EDX], edx
endif
/* Save segment registers? */
- if ((Flags AND KI_DONT_SAVE_SEGS) == 0)
+ if (Flags AND KI_DONT_SAVE_SEGS)
+
+ /* Initialize TrapFrame segment registers with sane values */
+ mov eax, KGDT_R3_DATA OR 3
+ mov ecx, fs
+ mov [esp + KTRAP_FRAME_DS], eax
+ mov [esp + KTRAP_FRAME_ES], eax
+ mov [esp + KTRAP_FRAME_FS], ecx
+ mov dword ptr [esp + KTRAP_FRAME_GS], 0
+
+ else
/* Check for V86 mode */
- test byte ptr [esp + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK >> 16)
+ test byte ptr [esp + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK / HEX(10000))
jz not_v86_trap
/* Restore V8086 segments into Protected Mode segments */
mov es, ax
/* Fast system calls have fs already fixed */
- if ((Flags AND KI_FAST_SYSTEM_CALL) == 0)
+ if (NOT (Flags AND KI_FAST_SYSTEM_CALL))
/* Otherwise fix fs now */
mov ax, KGDT_R0_PCR
mov fs, ax
mov ecx, [esp - OffsetEsp + KTRAP_FRAME_ESP]
/* Keep interrupts disabled until the sti / sysexit */
- and byte ptr [esp - OffsetEsp + KTRAP_FRAME_EFLAGS + 1], ~(EFLAGS_INTERRUPT_MASK >> 8)
+ and byte ptr [esp - OffsetEsp + KTRAP_FRAME_EFLAGS + 1], NOT (EFLAGS_INTERRUPT_MASK / HEX(100))
endif