VirtualBox

忽略:
時間撮記:
2013-8-6 上午03:58:21 (11 年 以前)
作者:
vboxsync
訊息:

IEM: Bunch of fixes, mostly DOS related.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r47429 r47548  
    10311031    /* Fetch the descriptor. */
    10321032    IEMSELDESC Desc;
    1033     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel);
     1033    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP);
    10341034    if (rcStrict != VINF_SUCCESS)
    10351035        return rcStrict;
     
    12081208    /* Fetch the descriptor. */
    12091209    IEMSELDESC Desc;
    1210     rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel);
     1210    rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP);
    12111211    if (rcStrict != VINF_SUCCESS)
    12121212        return rcStrict;
     
    14341434    /* Fetch the descriptor. */
    14351435    IEMSELDESC DescCs;
    1436     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCs, uNewCs);
     1436    rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCs, uNewCs, X86_XCPT_GP);
    14371437    if (rcStrict != VINF_SUCCESS)
    14381438        return rcStrict;
     
    15351535        {
    15361536            /* Fetch the descriptor for the new stack segment. */
    1537             rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSs, uNewOuterSs);
     1537            rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSs, uNewOuterSs, X86_XCPT_GP);
    15381538            if (rcStrict != VINF_SUCCESS)
    15391539                return rcStrict;
     
    20122012     * iret throws an exception if VME isn't enabled.
    20132013     */
    2014     if (   pCtx->eflags.Bits.u1VM
     2014    if (   Efl.Bits.u1VM
     2015        && Efl.Bits.u2IOPL != 3
    20152016        && !(pCtx->cr4 & X86_CR4_VME))
    20162017        return iemRaiseGeneralProtectionFault0(pIemCpu);
     
    20332034            return rcStrict;
    20342035        uNewEip    = uFrame.pu32[0];
     2036        if (uNewEip > UINT16_MAX)
     2037            return iemRaiseGeneralProtectionFault0(pIemCpu);
     2038
    20352039        uNewCs     = (uint16_t)uFrame.pu32[1];
    20362040        uNewFlags  = uFrame.pu32[2];
     
    21372141 * @param   uNewFlags       The new EFLAGS.
    21382142 * @param   uNewRsp         The RSP after the initial IRET frame.
     2143 *
     2144 * @note    This can only be a 32-bit iret du to the X86_EFL_VM position.
    21392145 */
    21402146IEM_CIMPL_DEF_5(iemCImpl_iret_prot_v8086, PCPUMCTX, pCtx, uint32_t, uNewEip, uint16_t, uNewCs,
     
    21792185    pCtx->rip      = uNewEip;
    21802186    pCtx->rsp      = uNewEsp;
    2181     pCtx->rflags.u = uNewFlags;
     2187    uNewFlags &= X86_EFL_LIVE_MASK;
     2188    uNewFlags |= X86_EFL_RA1_MASK;
     2189    IEMMISC_SET_EFL(pIemCpu, pCtx, uNewFlags);
    21822190    pIemCpu->uCpl  = 3;
    21832191
     
    22692277
    22702278    IEMSELDESC DescCS;
    2271     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs);
     2279    rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs, X86_XCPT_GP);
    22722280    if (rcStrict != VINF_SUCCESS)
    22732281    {
     
    23452353
    23462354        IEMSELDESC DescSS;
    2347         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS);
     2355        rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS, X86_XCPT_GP); /** @todo Correct exception? */
    23482356        if (rcStrict != VINF_SUCCESS)
    23492357        {
     
    24312439        pCtx->ss.u64Base    = X86DESC_BASE(&DescSS.Legacy);
    24322440
    2433         uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF  | X86_EFL_SF
     2441        uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF
    24342442                             | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_NT;
    24352443        if (enmEffOpSize != IEMMODE_16BIT)
     
    24872495        X86EFLAGS NewEfl;
    24882496        NewEfl.u = IEMMISC_GET_EFL(pIemCpu, pCtx);
    2489         uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF  | X86_EFL_SF
     2497        uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF
    24902498                             | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_NT;
    24912499        if (enmEffOpSize != IEMMODE_16BIT)
     
    25872595
    25882596    IEMSELDESC DescCS;
    2589     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs);
     2597    rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs, X86_XCPT_GP);
    25902598    if (rcStrict != VINF_SUCCESS)
    25912599    {
     
    26432651    else
    26442652    {
    2645         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSs);
     2653        rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSs, X86_XCPT_GP); /** @todo Correct exception? */
    26462654        if (rcStrict != VINF_SUCCESS)
    26472655        {
     
    27612769    }
    27622770
    2763     uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF  | X86_EFL_SF
     2771    uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF
    27642772                         | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_NT;
    27652773    if (enmEffOpSize != IEMMODE_16BIT)
     
    27972805     * Call a mode specific worker.
    27982806     */
    2799     if (   pIemCpu->enmCpuMode == IEMMODE_16BIT
    2800         && IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     2807    if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    28012808        return IEM_CIMPL_CALL_1(iemCImpl_iret_real_v8086, enmEffOpSize);
    28022809    if (IEM_IS_LONG_MODE(pIemCpu))
     
    30883095    /* Fetch the descriptor. */
    30893096    IEMSELDESC Desc;
    3090     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel);
     3097    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP); /** @todo Correct exception? */
    30913098    if (rcStrict != VINF_SUCCESS)
    30923099        return rcStrict;
     
    34893496     */
    34903497    IEMSELDESC Desc;
    3491     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewLdt);
     3498    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewLdt, X86_XCPT_GP); /** @todo Correct exception? */
    34923499    if (rcStrict != VINF_SUCCESS)
    34933500        return rcStrict;
     
    35863593     */
    35873594    IEMSELDESC Desc;
    3588     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewTr);
     3595    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewTr, X86_XCPT_GP); /** @todo Correct exception? */
    35893596    if (rcStrict != VINF_SUCCESS)
    35903597        return rcStrict;
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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