From 1f21afc098c12d61f8b73900794ac5b5fd82e85f Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Mon, 11 Jan 2010 19:41:50 +0000 Subject: [PATCH] [NTOS]: Bring back a simplified GPF handler just for V8086 opcode detection and V8086 exit, to see if this resolves testbot booting. svn path=/trunk/; revision=45048 --- reactos/ntoskrnl/ke/i386/ctxswitch.S | 2 +- reactos/ntoskrnl/ke/i386/trap.s | 105 ++++++++++++++++++++++++++- reactos/ntoskrnl/ke/i386/v86vdm.c | 2 + 3 files changed, 107 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/ctxswitch.S b/reactos/ntoskrnl/ke/i386/ctxswitch.S index 16d14372ba9..0c27f45ffc5 100644 --- a/reactos/ntoskrnl/ke/i386/ctxswitch.S +++ b/reactos/ntoskrnl/ke/i386/ctxswitch.S @@ -885,5 +885,5 @@ _Ki386SetupAndExitToV86Mode@4: mov esp, eax add esp, (12 + KTRAP_FRAME_LENGTH + NPX_FRAME_LENGTH) popad - ret + ret 4 diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 405d1f36f88..57f83e4cc93 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -585,7 +585,110 @@ GENERATE_TRAP_HANDLER KiTrap9, 1 GENERATE_TRAP_HANDLER KiTrap10, 0 GENERATE_TRAP_HANDLER KiTrap11, 0 GENERATE_TRAP_HANDLER KiTrap12, 0 -GENERATE_TRAP_HANDLER KiTrap13, 0 + +//GENERATE_TRAP_HANDLER KiTrap13, 0 + +.func KiTrap13 +TRAP_FIXUPS kitd_a, kitd_t, DoFixupV86, DoNotFixupAbios +_KiTrap13: + + /* It this a V86 GPF? */ + test dword ptr [esp+12], EFLAGS_V86_MASK + jz NotV86 + + /* Enter V86 Trap */ + V86_TRAP_PROLOG kitd_a, kitd_v + + /* Make sure that this is a V86 process */ + mov ecx, PCR[KPCR_CURRENT_THREAD] + mov ecx, [ecx+KTHREAD_APCSTATE_PROCESS] + cmp dword ptr [ecx+EPROCESS_VDM_OBJECTS], 0 + jz ShouldNotGetHere + +RaiseIrql: + + /* Go to APC level */ + mov ecx, APC_LEVEL + call @KfRaiseIrql@4 + + /* Save old IRQL and enable interrupts */ + push eax + sti + + /* Handle the opcode */ + mov ecx, ebp + call @Ki386HandleOpcodeV86@4 + + /* Check if this was VDM */ + test al, 0xFF + jz ShouldNotGetHere + +NoReflect: + + /* Lower IRQL and disable interrupts */ + pop ecx + call @KfLowerIrql@4 + cli + + /* Check if this was a V86 trap */ + test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK + jz NotV86Trap + + /* Exit the V86 Trap */ + V86_TRAP_EPILOG + +NotV86Trap: + + /* Either this wasn't V86, or it was, but an APC interrupted us */ + jmp _Kei386EoiHelper@0 + +NotV86: + /* Enter trap */ + TRAP_PROLOG kitd_a, kitd_t + + /* Check if this was from kernel-mode */ + test dword ptr [ebp+KTRAP_FRAME_CS], MODE_MASK + jnz ShouldNotGetHere + + /* Get the opcode and trap frame */ +KmodeGpf: + mov eax, [ebp+KTRAP_FRAME_EIP] + mov eax, [eax] + mov edx, [ebp+KTRAP_FRAME_EBP] + + /* Was it IRETD? */ + cmp al, 0xCF + jne ShouldNotGetHere + + /* Get error code */ + lea edx, [ebp+KTRAP_FRAME_ESP] + mov ax, [ebp+KTRAP_FRAME_ERROR_CODE] + and ax, ~RPL_MASK + + /* Get CS */ + mov cx, word ptr [edx+4] + and cx, ~RPL_MASK + cmp cx, ax + jnz ShouldNotGetHere + + /* This should be a Ki386CallBios return */ + mov eax, offset @Ki386BiosCallReturnAddress@4 + cmp eax, [edx] + jne ShouldNotGetHere + mov eax, [edx+4] + cmp ax, KGDT_R0_CODE + RPL_MASK + jne ShouldNotGetHere + + /* Jump to return address */ + mov ecx, ebp + jmp @Ki386BiosCallReturnAddress@4 + +_Ki16BitStackException: +ShouldNotGetHere: + /* FIXME */ + UNHANDLED_PATH "Other GPF stuff" +.endfunc + GENERATE_TRAP_HANDLER KiTrap14, 0 GENERATE_TRAP_HANDLER KiTrap0F, 1 GENERATE_TRAP_HANDLER KiTrap16, 1 diff --git a/reactos/ntoskrnl/ke/i386/v86vdm.c b/reactos/ntoskrnl/ke/i386/v86vdm.c index 6fcf72a6756..83372a4188b 100644 --- a/reactos/ntoskrnl/ke/i386/v86vdm.c +++ b/reactos/ntoskrnl/ke/i386/v86vdm.c @@ -623,7 +623,9 @@ Ke386CallBios(IN ULONG Int, Tss->IoMapBase = (USHORT)IOPM_OFFSET; /* Switch stacks and work the magic */ + DPRINT1("Entering V86 mode\n"); Ki386SetupAndExitToV86Mode(VdmTeb); + DPRINT1("Left V86 mode\n"); /* Restore IOPM */ RtlCopyMemory(&Tss->IoMaps[0].IoMap, Ki386IopmSaveArea, PAGE_SIZE * 2);