@@ -465,17 +465,20 @@ ULONG_PTR
465
465
FASTCALL
466
466
KiExitV86Mode (IN PKTRAP_FRAME TrapFrame )
467
467
{
468
+ ULONG_PTR StackFrameUnaligned ;
468
469
PKV8086_STACK_FRAME StackFrame ;
469
470
PKTHREAD Thread ;
470
471
PKTRAP_FRAME PmTrapFrame ;
471
472
PKV86_FRAME V86Frame ;
472
473
PFX_SAVE_AREA NpxFrame ;
473
474
474
475
/* Get the stack frame back */
475
- StackFrame = CONTAINING_RECORD (TrapFrame -> Esi , KV8086_STACK_FRAME , V86Frame );
476
+ StackFrameUnaligned = TrapFrame -> Esi ;
477
+ StackFrame = (PKV8086_STACK_FRAME )(ROUND_UP (StackFrameUnaligned - 4 , 16 ) + 4 );
476
478
PmTrapFrame = & StackFrame -> TrapFrame ;
477
479
V86Frame = & StackFrame -> V86Frame ;
478
480
NpxFrame = & StackFrame -> NpxArea ;
481
+ ASSERT ((ULONG_PTR )NpxFrame % 16 == 0 );
479
482
480
483
/* Copy the FPU frame back */
481
484
Thread = KeGetCurrentThread ();
@@ -493,18 +496,21 @@ KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
493
496
494
497
/* Enable interrupts and return a pointer to the trap frame */
495
498
_enable ();
496
- return ( ULONG ) PmTrapFrame ;
499
+ return StackFrameUnaligned ;
497
500
}
498
501
499
502
VOID
500
503
FASTCALL
501
- KiEnterV86Mode (IN PKV8086_STACK_FRAME StackFrame )
504
+ KiEnterV86Mode (IN ULONG_PTR StackFrameUnaligned )
502
505
{
503
506
PKTHREAD Thread ;
507
+ PKV8086_STACK_FRAME StackFrame = (PKV8086_STACK_FRAME )(ROUND_UP (StackFrameUnaligned - 4 , 16 ) + 4 );
504
508
PKTRAP_FRAME TrapFrame = & StackFrame -> TrapFrame ;
505
509
PKV86_FRAME V86Frame = & StackFrame -> V86Frame ;
506
510
PFX_SAVE_AREA NpxFrame = & StackFrame -> NpxArea ;
507
511
512
+ ASSERT ((ULONG_PTR )NpxFrame % 16 == 0 );
513
+
508
514
/* Build fake user-mode trap frame */
509
515
TrapFrame -> SegCs = KGDT_R0_CODE | RPL_MASK ;
510
516
TrapFrame -> SegEs = TrapFrame -> SegDs = TrapFrame -> SegFs = TrapFrame -> SegGs = 0 ;
@@ -522,7 +528,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame)
522
528
TrapFrame -> Eip = (ULONG_PTR )Ki386BiosCallReturnAddress ;
523
529
524
530
/* Save our stack (after the frames) */
525
- TrapFrame -> Esi = ( ULONG_PTR ) V86Frame ;
531
+ TrapFrame -> Esi = StackFrameUnaligned ;
526
532
TrapFrame -> Edi = (ULONG_PTR )_AddressOfReturnAddress () + 4 ;
527
533
528
534
/* Sanitize EFlags and enable interrupts */
0 commit comments