mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +00:00
[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
This commit is contained in:
parent
0feb759f62
commit
1f21afc098
3 changed files with 107 additions and 2 deletions
|
@ -885,5 +885,5 @@ _Ki386SetupAndExitToV86Mode@4:
|
||||||
mov esp, eax
|
mov esp, eax
|
||||||
add esp, (12 + KTRAP_FRAME_LENGTH + NPX_FRAME_LENGTH)
|
add esp, (12 + KTRAP_FRAME_LENGTH + NPX_FRAME_LENGTH)
|
||||||
popad
|
popad
|
||||||
ret
|
ret 4
|
||||||
|
|
||||||
|
|
|
@ -585,7 +585,110 @@ GENERATE_TRAP_HANDLER KiTrap9, 1
|
||||||
GENERATE_TRAP_HANDLER KiTrap10, 0
|
GENERATE_TRAP_HANDLER KiTrap10, 0
|
||||||
GENERATE_TRAP_HANDLER KiTrap11, 0
|
GENERATE_TRAP_HANDLER KiTrap11, 0
|
||||||
GENERATE_TRAP_HANDLER KiTrap12, 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 KiTrap14, 0
|
||||||
GENERATE_TRAP_HANDLER KiTrap0F, 1
|
GENERATE_TRAP_HANDLER KiTrap0F, 1
|
||||||
GENERATE_TRAP_HANDLER KiTrap16, 1
|
GENERATE_TRAP_HANDLER KiTrap16, 1
|
||||||
|
|
|
@ -623,7 +623,9 @@ Ke386CallBios(IN ULONG Int,
|
||||||
Tss->IoMapBase = (USHORT)IOPM_OFFSET;
|
Tss->IoMapBase = (USHORT)IOPM_OFFSET;
|
||||||
|
|
||||||
/* Switch stacks and work the magic */
|
/* Switch stacks and work the magic */
|
||||||
|
DPRINT1("Entering V86 mode\n");
|
||||||
Ki386SetupAndExitToV86Mode(VdmTeb);
|
Ki386SetupAndExitToV86Mode(VdmTeb);
|
||||||
|
DPRINT1("Left V86 mode\n");
|
||||||
|
|
||||||
/* Restore IOPM */
|
/* Restore IOPM */
|
||||||
RtlCopyMemory(&Tss->IoMaps[0].IoMap, Ki386IopmSaveArea, PAGE_SIZE * 2);
|
RtlCopyMemory(&Tss->IoMaps[0].IoMap, Ki386IopmSaveArea, PAGE_SIZE * 2);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue