[NTOS]
authorAleksey Bragin <aleksey@reactos.org>
Wed, 22 Dec 2010 14:26:36 +0000 (14:26 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Wed, 22 Dec 2010 14:26:36 +0000 (14:26 +0000)
- Always initialize TrapFrame segment selectors in KiEnterTrap, because further C code relies on at least TrapFrame->SegFs being correct. Running Arwinss on VirtualBox exposed this bug.
I wouldn't find solution for this bug without Timo's great help!

svn path=/trunk/; revision=50095

reactos/ntoskrnl/include/internal/i386/asmmacro.S

index 2a64a93..d84872a 100644 (file)
@@ -135,7 +135,17 @@ MACRO(KiEnterTrap, Flags)
     endif
 
     /* Save segment registers? */
-    if (NOT (Flags AND KI_DONT_SAVE_SEGS))
+    if (Flags AND KI_DONT_SAVE_SEGS)
+
+        /* Initialize TrapFrame segment registers with sane values */
+        mov eax, 0x23
+        mov ecx, fs
+        mov [esp - FrameSize + KTRAP_FRAME_DS], eax
+        mov [esp - FrameSize + KTRAP_FRAME_ES], eax
+        mov [esp - FrameSize + KTRAP_FRAME_FS], ecx
+        mov dword ptr [esp - FrameSize + KTRAP_FRAME_GS], 0
+
+    else
 
         /* Check for V86 mode */
         test byte ptr [esp + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK / HEX(10000))