VirtualBox

Changeset 60888 in vbox


Ignore:
Timestamp:
May 9, 2016 11:58:46 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107100
Message:

IEM: Must not forget to get updated hidden ES selector values for string instructions, as in raw-mode these may be totally out of wack. Adjusted string instruction yielding for verification mode. Fixed nested IEMExecOne calls during verification.

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

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

    r60882 r60888  
    45674567#else
    45684568    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
     4569#endif
     4570    return pSReg;
     4571}
     4572
     4573
     4574/**
     4575 * Ensures that the given hidden segment register is up to date.
     4576 *
     4577 * @returns Hidden register reference.
     4578 * @param   pIemCpu             The per CPU data.
     4579 * @param   pSReg               The segment register.
     4580 */
     4581IEM_STATIC PCPUMSELREG iemSRegUpdateHid(PIEMCPU pIemCpu, PCPUMSELREG pSReg)
     4582{
     4583#ifdef VBOX_WITH_RAW_MODE_NOT_R0
     4584    if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg))
     4585        CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg);
     4586#else
     4587    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
     4588    NOREF(pIemCpu);
    45694589#endif
    45704590    return pSReg;
     
    1044310463 * Performs the post-execution verfication checks.
    1044410464 */
    10445 IEM_STATIC void iemExecVerificationModeCheck(PIEMCPU pIemCpu)
     10465IEM_STATIC VBOXSTRICTRC iemExecVerificationModeCheck(PIEMCPU pIemCpu, VBOXSTRICTRC rcStrictIem)
    1044610466{
    1044710467    if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    10448         return;
     10468        return rcStrictIem;
    1044910469
    1045010470    /*
     
    1050310523        fRem = true;
    1050410524    }
     10525
     10526#  if 1 /* Skip unimplemented instructions for now. */
     10527    if (rcStrictIem == VERR_IEM_INSTR_NOT_IMPLEMENTED)
     10528    {
     10529        pIemCpu->CTX_SUFF(pCtx) = pOrgCtx;
     10530        if (rc == VINF_EM_DBG_STEPPED)
     10531            return VINF_SUCCESS;
     10532        return rc;
     10533    }
     10534#  endif
    1050510535
    1050610536    /*
     
    1072510755            DBGFR3Info(pVM->pUVM, "cpumguest", "verbose", NULL);
    1072610756            RTAssertMsg1(NULL, __LINE__, __FILE__, __FUNCTION__);
    10727             iemVerifyAssertMsg2(pIemCpu);
    1072810757            RTAssertPanic();
     10758            static bool volatile s_fEnterDebugger = true;
     10759            if (s_fEnterDebugger)
     10760                DBGFSTOP(pVM);
     10761
     10762#  if 1 /* Ignore unimplemented instructions for now. */
     10763            if (rcStrictIem == VERR_IEM_INSTR_NOT_IMPLEMENTED)
     10764                rcStrictIem = VINF_SUCCESS;
     10765#  endif
    1072910766        }
    1073010767#  undef CHECK_FIELD
     
    1082210859    }
    1082310860    pIemCpu->CTX_SUFF(pCtx) = pOrgCtx;
     10861
     10862    return rcStrictIem;
    1082410863}
    1082510864
     
    1107511114
    1107611115#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    11077     iemExecVerificationModeSetup(pIemCpu);
     11116    if (++pIemCpu->cVerifyDepth == 1)
     11117        iemExecVerificationModeSetup(pIemCpu);
    1107811118#endif
    1107911119#ifdef LOG_ENABLED
     
    1109311133     * Assert some sanity.
    1109411134     */
    11095     iemExecVerificationModeCheck(pIemCpu);
     11135    if (pIemCpu->cVerifyDepth == 1)
     11136        rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict);
     11137    pIemCpu->cVerifyDepth--;
    1109611138#endif
    1109711139#ifdef IN_RC
     
    1125511297     * Assert some sanity.
    1125611298     */
    11257     iemExecVerificationModeCheck(pIemCpu);
     11299    rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict);
    1125811300#endif
    1125911301
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r60871 r60888  
    6969 */
    7070#ifdef IN_RC
    71 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fEflags) \
     71# define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \
    7272    do { \
    73         if (RT_LIKELY(   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
    74                                                                                 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
    75                       && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK))) \
     73        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
     74                                                                                   : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
     75                          && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \
     76                      || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
    7677        { \
    7778            RTCCUINTREG fSavedFlags = ASMGetFlags(); \
     
    8384            } \
    8485        } \
    85         else return VINF_SUCCESS; \
     86        else \
     87        { \
     88            LogFlow(("%s: Leaving early (outer)! ffcpu=%#x ffvm=%#x\n", \
     89                     __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \
     90            return VINF_SUCCESS; \
     91        } \
    8692    } while (0)
    8793#else
    88 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fEflags) \
     94# define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \
    8995    do { \
    90         if (RT_LIKELY(   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
    91                                                                                 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
    92                       && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK))) \
     96        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
     97                                                                                   : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
     98                          && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \
     99                      || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
    93100        { /* probable */ } \
    94         else return VINF_SUCCESS; \
     101        else  \
     102        { \
     103            LogFlow(("%s: Leaving early (outer)! ffcpu=%#x ffvm=%#x\n", \
     104                     __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \
     105            return VINF_SUCCESS; \
     106        } \
    95107    } while (0)
    96108#endif
    97 
    98109
    99110/** @def IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN
     
    102113 * don't miss out on important stuff that happened while processing a word.
    103114 */
    104 #define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fExitExpr) \
     115#define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fExitExpr) \
    105116    do { \
    106117        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK) \
    107118                          && !VM_FF_IS_PENDING(a_pVM,         VM_FF_HIGH_PRIORITY_POST_REPSTR_MASK)) \
    108                       || (a_fExitExpr))) \
     119                      || (a_fExitExpr) \
     120                      || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
    109121        { /* very likely */ } \
    110         else return VINF_SUCCESS; \
     122        else \
     123        { \
     124            LogFlow(("%s: Leaving early (inner)! ffcpu=%#x ffvm=%#x\n", \
     125                     __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \
     126            return VINF_SUCCESS; \
     127        } \
    111128    } while (0)
    112129
     
    138155
    139156    uint64_t        uSrc2Base;
    140     rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uSrc2Base);
     157    rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
    141158    if (rcStrict != VINF_SUCCESS)
    142159        return rcStrict;
     
    232249                        || !(uEFlags & X86_EFL_ZF))
    233250                        break;
    234                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     251                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    235252                    continue;
    236253                }
     
    271288            || !(uEFlags & X86_EFL_ZF))
    272289            break;
    273         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     290        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    274291    }
    275292
     
    308325
    309326    uint64_t        uSrc2Base;
    310     rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uSrc2Base);
     327    rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
    311328    if (rcStrict != VINF_SUCCESS)
    312329        return rcStrict;
     
    402419                        || (uEFlags & X86_EFL_ZF))
    403420                        break;
    404                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     421                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    405422                    continue;
    406423                }
     
    441458            || (uEFlags & X86_EFL_ZF))
    442459            break;
    443         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     460        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    444461    }
    445462
     
    472489
    473490    uint64_t        uBaseAddr;
    474     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);
     491    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    475492    if (rcStrict != VINF_SUCCESS)
    476493        return rcStrict;
     
    540557                if (!(uVirtAddr & (OP_SIZE - 1)))
    541558                {
    542                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     559                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    543560                    continue;
    544561                }
     
    574591            || !(uEFlags & X86_EFL_ZF))
    575592            break;
    576         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     593        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    577594    }
    578595
     
    605622
    606623    uint64_t        uBaseAddr;
    607     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);
     624    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    608625    if (rcStrict != VINF_SUCCESS)
    609626        return rcStrict;
     
    673690                if (!(uVirtAddr & (OP_SIZE - 1)))
    674691                {
    675                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     692                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    676693                    continue;
    677694                }
     
    706723            || (uEFlags & X86_EFL_ZF))
    707724            break;
    708         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
     725        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
    709726    }
    710727
     
    745762
    746763    uint64_t        uDstBase;
    747     rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uDstBase);
     764    rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uDstBase);
    748765    if (rcStrict != VINF_SUCCESS)
    749766        return rcStrict;
     
    849866                    if (uCounterReg == 0)
    850867                        break;
    851                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     868                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    852869                    continue;
    853870                }
     
    875892            pCtx->ADDR_rCX = --uCounterReg;
    876893            cLeftPage--;
    877             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     894            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
    878895        } while ((int32_t)cLeftPage > 0);
    879896
     
    883900        if (uCounterReg == 0)
    884901            break;
    885         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     902        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    886903    }
    887904
     
    914931
    915932    uint64_t        uBaseAddr;
    916     VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);
     933    VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    917934    if (rcStrict != VINF_SUCCESS)
    918935        return rcStrict;
     
    9891006                if (!(uVirtAddr & (OP_SIZE - 1)))
    9901007                {
    991                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1008                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    9921009                    continue;
    9931010                }
     
    10171034        if (uCounterReg == 0)
    10181035            break;
    1019         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1036        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    10201037    }
    10211038
     
    11071124                if (!(uVirtAddr & (OP_SIZE - 1)))
    11081125                {
    1109                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1126                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    11101127                    continue;
    11111128                }
     
    11441161        if (uCounterReg == 0)
    11451162            break;
    1146         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1163        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    11471164    }
    11481165
     
    13371354
    13381355    uint64_t        uBaseAddr;
    1339     rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);
     1356    rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    13401357    if (rcStrict != VINF_SUCCESS)
    13411358        return rcStrict;
     
    14161433                if (!(uVirtAddr & (OP_SIZE - 1)))
    14171434                {
    1418                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1435                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    14191436                    continue;
    14201437                }
     
    14831500                return rcStrict;
    14841501            }
    1485             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     1502            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
    14861503        } while ((int32_t)cLeftPage > 0);
    14871504
     
    14921509        if (uCounterReg == 0)
    14931510            break;
    1494         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1511        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    14951512    }
    14961513
     
    16711688                if (!(uVirtAddr & (OP_SIZE - 1)))
    16721689                {
    1673                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1690                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    16741691                    continue;
    16751692                }
     
    17151732                return rcStrict;
    17161733            }
    1717             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     1734            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
    17181735        } while ((int32_t)cLeftPage > 0);
    17191736
     
    17241741        if (uCounterReg == 0)
    17251742            break;
    1726         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1743        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
    17271744    }
    17281745
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r60776 r60888  
    16951695
    16961696/** Opcode 0x0f 0x28. */
    1697 FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd);
     1697FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd); // NEXT - win2k
    16981698/** Opcode 0x0f 0x29. */
    1699 FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd);
     1699FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd); // NEXT - win2k
    17001700/** Opcode 0x0f 0x2a. */
    17011701FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r60415 r60888  
    348348     * CPUM doesn't yet reflect. */
    349349    uint8_t                 uInjectCpl;
    350     bool                    afAlignment2[3];
     350    /** To prevent EMR3HmSingleInstruction from triggering endless recursion via
     351     *  emR3ExecuteInstruction and iemExecVerificationModeCheck. */
     352    uint8_t                 cVerifyDepth;
     353    bool                    afAlignment2[2];
    351354    /** Mask of undefined eflags.
    352355     * The verifier will any difference in these flags. */
Note: See TracChangeset for help on using the changeset viewer.

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