From fc17a969381c2d75578bab7f6d7f73080112bcdf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 22 Dec 2010 14:26:36 +0000 Subject: [PATCH] [NTOS] - 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/include/internal/i386/asmmacro.S b/reactos/ntoskrnl/include/internal/i386/asmmacro.S index 2a64a938320..d84872a7b7a 100644 --- a/reactos/ntoskrnl/include/internal/i386/asmmacro.S +++ b/reactos/ntoskrnl/include/internal/i386/asmmacro.S @@ -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))