VirtualBox

Changeset 98030 in vbox


Ignore:
Timestamp:
Jan 9, 2023 11:01:06 AM (23 months ago)
Author:
vboxsync
Message:

IEM/retf: Fixed imm16 parameter pop values above 255. bugref:10282

File:
1 edited

Legend:

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

    r97705 r98030  
    22422242    VBOXSTRICTRC    rcStrict;
    22432243    RTCPTRUNION     uPtrFrame;
    2244     uint64_t        uNewRsp;
     2244    RTUINT64U       NewRsp;
    22452245    uint64_t        uNewRip;
    22462246    uint16_t        uNewCs;
     
    22542254    rcStrict = iemMemStackPopBeginSpecial(pVCpu, cbRetPtr,
    22552255                                          enmEffOpSize == IEMMODE_16BIT ? 1 : enmEffOpSize == IEMMODE_32BIT ? 3 : 7,
    2256                                           &uPtrFrame.pv, &uNewRsp);
     2256                                          &uPtrFrame.pv, &NewRsp.u);
    22572257    if (rcStrict != VINF_SUCCESS)
    22582258        return rcStrict;
     
    22942294
    22952295        /* commit the operation. */
    2296         pVCpu->cpum.GstCtx.rsp           = uNewRsp;
     2296        if (cbPop)
     2297            iemRegAddToRspEx(pVCpu, &NewRsp, cbPop);
     2298        pVCpu->cpum.GstCtx.rsp           = NewRsp.u;
    22972299        pVCpu->cpum.GstCtx.rip           = uNewRip;
    22982300        pVCpu->cpum.GstCtx.cs.Sel        = uNewCs;
     
    23002302        pVCpu->cpum.GstCtx.cs.fFlags     = CPUMSELREG_FLAGS_VALID;
    23012303        pVCpu->cpum.GstCtx.cs.u64Base    = (uint32_t)uNewCs << 4;
    2302         if (cbPop)
    2303             iemRegAddToRsp(pVCpu, cbPop);
    23042304        return iemRegFinishClearingRF(pVCpu);
    23052305    }
     
    23792379    {
    23802380        /* Read the outer stack pointer stored *after* the parameters. */
    2381         rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop /*off*/, cbRetPtr, &uPtrFrame.pv, uNewRsp);
     2381        rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop /*off*/, cbRetPtr, &uPtrFrame.pv, NewRsp.u);
    23822382        if (rcStrict != VINF_SUCCESS)
    23832383            return rcStrict;
    23842384
    23852385        uint16_t uNewOuterSs;
    2386         uint64_t uNewOuterRsp;
     2386        RTUINT64U NewOuterRsp;
    23872387        if (enmEffOpSize == IEMMODE_16BIT)
    23882388        {
    2389             uNewOuterRsp = uPtrFrame.pu16[0];
    2390             uNewOuterSs  = uPtrFrame.pu16[1];
     2389            NewOuterRsp.u = uPtrFrame.pu16[0];
     2390            uNewOuterSs   = uPtrFrame.pu16[1];
    23912391        }
    23922392        else if (enmEffOpSize == IEMMODE_32BIT)
    23932393        {
    2394             uNewOuterRsp = uPtrFrame.pu32[0];
    2395             uNewOuterSs  = uPtrFrame.pu16[2];
     2394            NewOuterRsp.u = uPtrFrame.pu32[0];
     2395            uNewOuterSs   = uPtrFrame.pu16[2];
    23962396        }
    23972397        else
    23982398        {
    2399             uNewOuterRsp = uPtrFrame.pu64[0];
    2400             uNewOuterSs  = uPtrFrame.pu16[4];
     2399            NewOuterRsp.u = uPtrFrame.pu64[0];
     2400            uNewOuterSs   = uPtrFrame.pu16[4];
    24012401        }
    24022402        rcStrict = iemMemStackPopDoneSpecial(pVCpu, uPtrFrame.pv);
     
    24152415            {
    24162416                Log(("retf %04x:%08RX64 %04x:%08RX64 -> invalid stack selector, #GP\n",
    2417                      uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
     2417                     uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u));
    24182418                return iemRaiseGeneralProtectionFault0(pVCpu);
    24192419            }
     
    24322432        if ((uNewCs & X86_SEL_RPL) != (uNewOuterSs & X86_SEL_RPL))
    24332433        {
    2434             Log(("retf %04x:%08RX64 %04x:%08RX64 - SS.RPL != CS.RPL -> #GP(SS)\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
     2434            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS.RPL != CS.RPL -> #GP(SS)\n", uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u));
    24352435            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    24362436        }
     
    24422442        {
    24432443            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS not a writable data segment (u1DescType=%u u4Type=%#x) -> #GP(SS).\n",
    2444                  uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, DescSs.Legacy.Gen.u1DescType, DescSs.Legacy.Gen.u4Type));
     2444                 uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u, DescSs.Legacy.Gen.u1DescType, DescSs.Legacy.Gen.u4Type));
    24452445            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    24462446        }
     
    24522452        {
    24532453            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS has both L & D set -> #GP(SS).\n",
    2454                  uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
     2454                 uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u));
    24552455            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    24562456        }
     
    24602460        {
    24612461            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS.DPL(%u) != CS.RPL (%u) -> #GP(SS).\n",
    2462                  uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, DescSs.Legacy.Gen.u2Dpl, uNewCs & X86_SEL_RPL));
     2462                 uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u, DescSs.Legacy.Gen.u2Dpl, uNewCs & X86_SEL_RPL));
    24632463            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    24642464        }
     
    24672467        if (!DescSs.Legacy.Gen.u1Present)
    24682468        {
    2469             Log(("retf %04x:%08RX64 %04x:%08RX64 - SS not present -> #NP(SS).\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
     2469            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS not present -> #NP(SS).\n", uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u));
    24702470            return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCs);
    24712471        }
     
    24842484            if (!IEM_IS_CANONICAL(uNewRip))
    24852485            {
    2486                 Log(("retf %04x:%08RX64 %04x:%08RX64 - not canonical -> #GP.\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
     2486                Log(("retf %04x:%08RX64 %04x:%08RX64 - not canonical -> #GP.\n", uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u));
    24872487                return iemRaiseNotCanonical(pVCpu);
    24882488            }
     
    24942494            {
    24952495                Log(("retf %04x:%08RX64 %04x:%08RX64 - out of bounds (%#x)-> #GP(CS).\n",
    2496                      uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, cbLimitCs));
     2496                     uNewCs, uNewRip, uNewOuterSs, NewOuterRsp.u, cbLimitCs));
    24972497                /** @todo Intel says this is \#GP(0)! */
    24982498                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
     
    25362536        pVCpu->cpum.GstCtx.cs.u32Limit       = cbLimitCs;
    25372537        pVCpu->cpum.GstCtx.cs.u64Base        = u64Base;
    2538         pVCpu->iem.s.enmCpuMode     = iemCalcCpuMode(pVCpu);
     2538        pVCpu->iem.s.enmCpuMode              = iemCalcCpuMode(pVCpu);
    25392539        pVCpu->cpum.GstCtx.ss.Sel            = uNewOuterSs;
    25402540        pVCpu->cpum.GstCtx.ss.ValidSel       = uNewOuterSs;
     
    25462546        else
    25472547            pVCpu->cpum.GstCtx.ss.u64Base    = X86DESC_BASE(&DescSs.Legacy);
     2548        if (cbPop)
     2549            iemRegAddToRspEx(pVCpu, &NewOuterRsp, cbPop);
    25482550        if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    2549             pVCpu->cpum.GstCtx.rsp           = uNewOuterRsp;
     2551            pVCpu->cpum.GstCtx.rsp           = NewOuterRsp.u;
    25502552        else if (pVCpu->cpum.GstCtx.ss.Attr.n.u1DefBig)
    2551             pVCpu->cpum.GstCtx.rsp           = (uint32_t)uNewOuterRsp;
     2553            pVCpu->cpum.GstCtx.rsp           = (uint32_t)NewOuterRsp.u;
    25522554        else
    2553             pVCpu->cpum.GstCtx.sp            = (uint16_t)uNewOuterRsp;
    2554 
    2555         pVCpu->iem.s.uCpl           = (uNewCs & X86_SEL_RPL);
     2555            pVCpu->cpum.GstCtx.sp            = (uint16_t)NewOuterRsp.u;
     2556
     2557        pVCpu->iem.s.uCpl                    = (uNewCs & X86_SEL_RPL);
    25562558        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pVCpu->cpum.GstCtx.ds);
    25572559        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pVCpu->cpum.GstCtx.es);
     
    25612563        /** @todo check if the hidden bits are loaded correctly for 64-bit
    25622564         *        mode. */
    2563 
    2564         if (cbPop)
    2565             iemRegAddToRsp(pVCpu, cbPop);
    25662565    }
    25672566    /*
     
    26122611
    26132612        /* commit */
     2613        if (cbPop)
     2614            iemRegAddToRspEx(pVCpu, &NewRsp, cbPop);
    26142615        if (!pVCpu->cpum.GstCtx.ss.Attr.n.u1DefBig)
    2615             pVCpu->cpum.GstCtx.sp        = (uint16_t)uNewRsp;
     2616            pVCpu->cpum.GstCtx.sp        = (uint16_t)NewRsp.u;
    26162617        else
    2617             pVCpu->cpum.GstCtx.rsp       = uNewRsp;
     2618            pVCpu->cpum.GstCtx.rsp       = NewRsp.u;
    26182619        if (enmEffOpSize == IEMMODE_16BIT)
    26192620            pVCpu->cpum.GstCtx.rip       = uNewRip & UINT16_MAX; /** @todo Testcase: When exactly does this occur? With call it happens prior to the limit check according to Intel... */
     
    26282629        /** @todo check if the hidden bits are loaded correctly for 64-bit
    26292630         *        mode.  */
    2630         pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pVCpu);
    2631         if (cbPop)
    2632             iemRegAddToRsp(pVCpu, cbPop);
     2631        pVCpu->iem.s.enmCpuMode          = iemCalcCpuMode(pVCpu);
    26332632    }
    26342633
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