VirtualBox

Changeset 65180 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jan 6, 2017 10:39:45 AM (8 years ago)
Author:
vboxsync
Message:

IEM: In RETF and IRET, update SP or RSP depending on stack size.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r65179 r65180  
    24562456        pCtx->cs.u64Base        = u64Base;
    24572457        pVCpu->iem.s.enmCpuMode     = iemCalcCpuMode(pCtx);
    2458         pCtx->rsp               = uNewOuterRsp;
    24592458        pCtx->ss.Sel            = uNewOuterSs;
    24602459        pCtx->ss.ValidSel       = uNewOuterSs;
     
    24662465        else
    24672466            pCtx->ss.u64Base    = X86DESC_BASE(&DescSs.Legacy);
     2467        if (!pCtx->ss.Attr.n.u1DefBig)
     2468            pCtx->sp            = (uint16_t)uNewOuterRsp;
     2469        else
     2470            pCtx->rsp           = uNewOuterRsp;
    24682471
    24692472        pVCpu->iem.s.uCpl           = (uNewCs & X86_SEL_RPL);
     
    25292532
    25302533        /* commit */
    2531         pCtx->rsp           = uNewRsp;
     2534        if (!pCtx->ss.Attr.n.u1DefBig)
     2535            pCtx->sp        = (uint16_t)uNewRsp;
     2536        else
     2537            pCtx->rsp       = uNewRsp;
    25322538        if (enmEffOpSize == IEMMODE_16BIT)
    25332539            pCtx->rip       = uNewRip & UINT16_MAX; /** @todo Testcase: When exactly does this occur? With call it happens prior to the limit check according to Intel... */
     
    34043410        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
    34053411        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    3406         if (!pCtx->ss.Attr.n.u1DefBig)
    3407             pCtx->sp        = (uint16_t)uNewESP;
    3408         else
    3409             pCtx->rsp       = uNewESP;
     3412
    34103413        pCtx->ss.Sel        = uNewSS;
    34113414        pCtx->ss.ValidSel   = uNewSS;
     
    34143417        pCtx->ss.u32Limit   = cbLimitSs;
    34153418        pCtx->ss.u64Base    = X86DESC_BASE(&DescSS.Legacy);
     3419        if (!pCtx->ss.Attr.n.u1DefBig)
     3420            pCtx->sp        = (uint16_t)uNewESP;
     3421        else
     3422            pCtx->rsp       = uNewESP;
    34163423
    34173424        pVCpu->iem.s.uCpl       = uNewCs & X86_SEL_RPL;
     
    34773484        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
    34783485        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    3479         pCtx->rsp           = uNewRsp;
     3486        if (!pCtx->ss.Attr.n.u1DefBig)
     3487            pCtx->sp        = (uint16_t)uNewRsp;
     3488        else
     3489            pCtx->rsp       = uNewRsp;
    34803490        /* Done! */
    34813491    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette