VirtualBox

Ignore:
Timestamp:
Sep 12, 2014 1:41:08 PM (10 years ago)
Author:
vboxsync
Message:

IEM: Implemented expand-down limit checks (2 out of 3).

File:
1 edited

Legend:

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

    r52669 r52724  
    31243124        Assert(enmTaskSwitch == IEMTASKSWITCH_INT_XCPT);
    31253125        uint32_t cbLimitSS = X86DESC_LIMIT_G(&DescSS.Legacy);
    3126         if (DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_DOWN)
    3127             IEM_RETURN_ASPECT_NOT_IMPLEMENTED_LOG(("Expand down segments\n")); /** @todo Implement expand down segment support. */
     3126        uint8_t const cbStackFrame = fIsNewTSS386 ? 4 : 2;
    31283127
    31293128        /* Check that there is sufficient space on the stack. */
    3130         uint8_t const cbStackFrame = fIsNewTSS386 ? 4 : 2;
    3131         if (   pCtx->esp - 1 > cbLimitSS
    3132             || pCtx->esp < cbStackFrame)
     3129        ///@todo: Factor out segment limit checking for normal/expand down segments into a separate function
     3130        if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_DOWN))
    31333131        {
    3134             /** @todo Intel says #SS(EXT) for INT/XCPT, I couldn't figure out AMD yet. */
    3135             Log(("iemTaskSwitch: SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #SS\n", pCtx->ss.Sel, pCtx->esp,
    3136                  cbStackFrame));
    3137             return iemRaiseStackSelectorNotPresentWithErr(pIemCpu, uExt);
     3132            if (   pCtx->esp - 1 > cbLimitSS
     3133                || pCtx->esp < cbStackFrame)
     3134            {
     3135                /** @todo Intel says #SS(EXT) for INT/XCPT, I couldn't figure out AMD yet. */
     3136                Log(("iemTaskSwitch: SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #SS\n", pCtx->ss.Sel, pCtx->esp,
     3137                     cbStackFrame));
     3138                return iemRaiseStackSelectorNotPresentWithErr(pIemCpu, uExt);
     3139            }
    31383140        }
     3141        else
     3142        {
     3143            if (   pCtx->esp - 1 > (DescSS.Legacy.Gen.u4Type & X86_DESC_DB ? UINT32_MAX : UINT32_C(0xffff))
     3144                || pCtx->esp - cbStackFrame < cbLimitSS + UINT32_C(1))
     3145            {
     3146                Log(("iemTaskSwitch: SS=%#x ESP=%#x cbStackFrame=%#x (expand down) is out of bounds -> #SS\n", pCtx->ss.Sel, pCtx->esp,
     3147                     cbStackFrame));
     3148                return iemRaiseStackSelectorNotPresentWithErr(pIemCpu, uExt);
     3149            }
     3150        }
     3151
    31393152
    31403153        if (fIsNewTSS386)
     
    34153428        /* Check that there is sufficient space for the stack frame. */
    34163429        uint32_t cbLimitSS = X86DESC_LIMIT_G(&DescSS.Legacy);
    3417         if (DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_DOWN)
    3418         {
    3419             IEM_RETURN_ASPECT_NOT_IMPLEMENTED_LOG(("Expand down segments\n")); /** @todo Implement expand down segment support. */
    3420         }
    3421 
    34223430        uint8_t const cbStackFrame = !(fEfl & X86_EFL_VM)
    34233431                                   ? (fFlags & IEM_XCPT_FLAGS_ERR ? 12 : 10) << f32BitGate
    34243432                                   : (fFlags & IEM_XCPT_FLAGS_ERR ? 20 : 18) << f32BitGate;
    3425         if (   uNewEsp - 1 > cbLimitSS
    3426             || uNewEsp < cbStackFrame)
     3433
     3434        if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_DOWN))
    34273435        {
    3428             Log(("RaiseXcptOrIntInProtMode: %#x - SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #GP\n",
    3429                  u8Vector, NewSS, uNewEsp, cbStackFrame));
    3430             return iemRaiseSelectorBoundsBySelector(pIemCpu, NewSS);
     3436            if (   uNewEsp - 1 > cbLimitSS
     3437                || uNewEsp < cbStackFrame)
     3438            {
     3439                Log(("RaiseXcptOrIntInProtMode: %#x - SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #GP\n",
     3440                     u8Vector, NewSS, uNewEsp, cbStackFrame));
     3441                return iemRaiseSelectorBoundsBySelector(pIemCpu, NewSS);
     3442            }
     3443        }
     3444        else
     3445        {
     3446            if (   uNewEsp - 1 > (DescSS.Legacy.Gen.u4Type & X86_DESC_DB ? UINT32_MAX : UINT32_C(0xffff))
     3447                || uNewEsp - cbStackFrame < cbLimitSS + UINT32_C(1))
     3448            {
     3449                Log(("RaiseXcptOrIntInProtMode: %#x - SS=%#x ESP=%#x cbStackFrame=%#x (expand down) is out of bounds -> #GP\n",
     3450                     u8Vector, NewSS, uNewEsp, cbStackFrame));
     3451                return iemRaiseSelectorBoundsBySelector(pIemCpu, NewSS);
     3452            }
    34313453        }
    34323454
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