[NTOS]: Switch to a slightly (perhaps, hopefully?) safer version of V86 entry/exit to see if this fixes the buildbot boot (suffice it to say, the original code works fine on my test machine, but since half the developers seem to be using GCC 4.4 and the others GCC 4.1, I wouldn't be surprised if there's compiler subtleties involved).

svn path=/trunk/; revision=45046
This commit is contained in:
Sir Richard 2010-01-11 18:26:46 +00:00
parent f81a3c4918
commit 0feb759f62
4 changed files with 26 additions and 10 deletions

View file

@ -411,6 +411,12 @@ KiEoiHelper(
VOID VOID
FASTCALL FASTCALL
Ki386BiosCallReturnAddress(
IN PKTRAP_FRAME TrapFrame
);
ULONG_PTR
FASTCALL
KiExitV86Mode( KiExitV86Mode(
IN PKTRAP_FRAME TrapFrame IN PKTRAP_FRAME TrapFrame
); );
@ -442,7 +448,6 @@ extern VOID NTAPI ExpInterlockedPopEntrySListFault(VOID);
extern VOID __cdecl CopyParams(VOID); extern VOID __cdecl CopyParams(VOID);
extern VOID __cdecl ReadBatch(VOID); extern VOID __cdecl ReadBatch(VOID);
extern VOID __cdecl FrRestore(VOID); extern VOID __cdecl FrRestore(VOID);
extern VOID Ki386BiosCallReturnAddress(VOID);
PFX_SAVE_AREA PFX_SAVE_AREA
FORCEINLINE FORCEINLINE

View file

@ -871,6 +871,19 @@ _Ki386SetupAndExitToV86Mode@4:
/* Enter V8086 mode */ /* Enter V8086 mode */
pushad pushad
call @KiEnterV86Mode@0 sub esp, (12 + KTRAP_FRAME_LENGTH + NPX_FRAME_LENGTH)
mov ecx, esp
call @KiEnterV86Mode@4
jmp $
.endfunc .endfunc
.globl @Ki386BiosCallReturnAddress@4
@Ki386BiosCallReturnAddress@4:
/* Exit V8086 mode */
call @KiExitV86Mode@4
mov esp, eax
add esp, (12 + KTRAP_FRAME_LENGTH + NPX_FRAME_LENGTH)
popad
ret

View file

@ -1255,11 +1255,11 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame)
* Why? Because part of the trap frame actually corresponds to the IRET * Why? Because part of the trap frame actually corresponds to the IRET
* stack during the trap exit! * stack during the trap exit!
*/ */
if ((TrapFrame->HardwareEsp == (ULONG)KiExitV86Mode) && if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) &&
(TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK)))
{ {
/* Exit the V86 trap! */ /* Exit the V86 trap! */
KiExitV86Mode(TrapFrame); Ki386BiosCallReturnAddress(TrapFrame);
} }
else else
{ {

View file

@ -429,7 +429,7 @@ Ki386HandleOpcodeV86(IN PKTRAP_FRAME TrapFrame)
return KiVdmHandleOpcode(TrapFrame, 1); return KiVdmHandleOpcode(TrapFrame, 1);
} }
VOID ULONG_PTR
FASTCALL FASTCALL
KiExitV86Mode(IN PKTRAP_FRAME TrapFrame) KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
{ {
@ -468,17 +468,15 @@ KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
/* Enable interrupts and get back to protected mode */ /* Enable interrupts and get back to protected mode */
_enable(); _enable();
KiV86TrapReturn(TrapFrame->Edi); return TrapFrame->Edi;
} }
VOID VOID
FASTCALL FASTCALL
KiEnterV86Mode(VOID) KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame)
{ {
PKTHREAD Thread; PKTHREAD Thread;
PKGDTENTRY GdtEntry; PKGDTENTRY GdtEntry;
KV8086_STACK_FRAME StackFrameBuffer;
PKV8086_STACK_FRAME StackFrame = &StackFrameBuffer;
PKTRAP_FRAME TrapFrame = &StackFrame->TrapFrame; PKTRAP_FRAME TrapFrame = &StackFrame->TrapFrame;
PKV86_FRAME V86Frame = &StackFrame->V86Frame; PKV86_FRAME V86Frame = &StackFrame->V86Frame;
PFX_SAVE_AREA NpxFrame = &StackFrame->NpxArea; PFX_SAVE_AREA NpxFrame = &StackFrame->NpxArea;
@ -497,7 +495,7 @@ KiEnterV86Mode(VOID)
V86Frame->PcrTeb = KeGetPcr()->Tib.Self; V86Frame->PcrTeb = KeGetPcr()->Tib.Self;
/* Save return EIP */ /* Save return EIP */
TrapFrame->Eip = (ULONG_PTR)KiExitV86Mode; TrapFrame->Eip = (ULONG_PTR)Ki386BiosCallReturnAddress;
/* Save our stack (after the frames) */ /* Save our stack (after the frames) */
TrapFrame->Esi = (ULONG_PTR)V86Frame; TrapFrame->Esi = (ULONG_PTR)V86Frame;