VirtualBox

忽略:
時間撮記:
2013-8-12 上午11:16:55 (12 年 以前)
作者:
vboxsync
svn:sync-xref-src-repo-rev:
87874
訊息:

VMM: More debugging related stuff.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/VMM/VMMR3/EMHM.cpp

    r47619 r47671  
    167167 * @param   pVCpu               Pointer to the cross context CPU structure for
    168168 *                              the calling EMT.
     169 * @param   fFlags              Combinations of EM_ONE_INS_FLAGS_XXX.
    169170 * @thread  EMT.
    170171 */
    171 VMMR3_INT_DECL(VBOXSTRICTRC) EMR3HmSingleInstruction(PVM pVM, PVMCPU pVCpu)
     172VMMR3_INT_DECL(VBOXSTRICTRC) EMR3HmSingleInstruction(PVM pVM, PVMCPU pVCpu, uint32_t fFlags)
    172173{
    173     if (!HMR3CanExecuteGuest(pVM, pVCpu->em.s.pCtx))
     174    PCPUMCTX pCtx = pVCpu->em.s.pCtx;
     175    Assert(!(fFlags & ~EM_ONE_INS_FLAGS_MASK));
     176
     177    if (!HMR3CanExecuteGuest(pVM, pCtx))
    174178        return VINF_EM_RESCHEDULE;
    175179
    176     /*
    177      * Service necessary FFs before going into HM.
    178      */
    179     PCPUMCTX pCtx = pVCpu->em.s.pCtx;
    180     if (    VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_PRE_RAW_MASK)
    181         ||  VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
    182     {
    183         VBOXSTRICTRC rcStrict = emR3HmForcedActions(pVM, pVCpu, pCtx);
    184         if (rcStrict != VINF_SUCCESS)
    185         {
    186             Log(("EMR3HmSingleInstruction: FFs before -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     180    uint64_t const uOldRip = pCtx->rip;
     181    for (;;)
     182    {
     183        /*
     184         * Service necessary FFs before going into HM.
     185         */
     186        if (   VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_PRE_RAW_MASK)
     187            || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
     188        {
     189            VBOXSTRICTRC rcStrict = emR3HmForcedActions(pVM, pVCpu, pCtx);
     190            if (rcStrict != VINF_SUCCESS)
     191            {
     192                Log(("EMR3HmSingleInstruction: FFs before -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     193                return rcStrict;
     194            }
     195        }
     196
     197        /*
     198         * Go execute it.
     199         */
     200        bool fOld = HMSetSingleInstruction(pVCpu, true);
     201        VBOXSTRICTRC rcStrict = VMMR3HmRunGC(pVM, pVCpu);
     202        HMSetSingleInstruction(pVCpu, fOld);
     203        LogFlow(("EMR3HmSingleInstruction: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     204
     205        /*
     206         * Handle high priority FFs and informational status codes.  We don't do
     207         * normal FF processing the caller or the next call can deal with them.
     208         */
     209        VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_RESUME_GUEST_MASK);
     210        if (   VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_POST_MASK)
     211            || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_MASK))
     212        {
     213            rcStrict = emR3HighPriorityPostForcedActions(pVM, pVCpu, VBOXSTRICTRC_TODO(rcStrict));
     214            LogFlow(("EMR3HmSingleInstruction: FFs after -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     215        }
     216
     217        if (rcStrict != VINF_SUCCESS && (rcStrict < VINF_EM_FIRST || rcStrict > VINF_EM_LAST))
     218        {
     219            rcStrict = emR3HmHandleRC(pVM, pVCpu, pCtx, VBOXSTRICTRC_TODO(rcStrict));
     220            Log(("EMR3HmSingleInstruction: emR3HmHandleRC -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     221        }
     222
     223        /*
     224         * Done?
     225         */
     226        if (   (rcStrict != VINF_SUCCESS && rcStrict != VINF_EM_DBG_STEPPED)
     227            || !(fFlags & EM_ONE_INS_FLAGS_RIP_CHANGE)
     228            || pCtx->rip != uOldRip)
     229        {
     230            if (rcStrict == VINF_SUCCESS && pCtx->rip != uOldRip)
     231                rcStrict = VINF_EM_DBG_STEPPED;
     232            Log(("EMR3HmSingleInstruction: returns %Rrc (rip %llx -> %llx)\n", VBOXSTRICTRC_VAL(rcStrict), uOldRip, pCtx->rip));
    187233            return rcStrict;
    188234        }
    189235    }
    190 
    191     /*
    192      * Go execute it.
    193      */
    194     bool fOld = HMSetSingleInstruction(pVCpu, true);
    195     VBOXSTRICTRC rcStrict = VMMR3HmRunGC(pVM, pVCpu);
    196     HMSetSingleInstruction(pVCpu, fOld);
    197     LogFlow(("EMR3HmSingleInstruction: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    198 
    199     /*
    200      * Handle high priority FFs and informational status codes.  We don't do
    201      * normal FF processing the caller or the next call can deal with them.
    202      */
    203     VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_RESUME_GUEST_MASK);
    204     if (    VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_POST_MASK)
    205         ||  VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_MASK))
    206     {
    207         rcStrict = emR3HighPriorityPostForcedActions(pVM, pVCpu, VBOXSTRICTRC_TODO(rcStrict));
    208         LogFlow(("EMR3HmSingleInstruction: FFs after -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    209     }
    210 
    211     if (rcStrict != VINF_SUCCESS && (rcStrict < VINF_EM_FIRST || rcStrict > VINF_EM_LAST))
    212     {
    213         rcStrict = emR3HmHandleRC(pVM, pVCpu, pCtx, VBOXSTRICTRC_TODO(rcStrict));
    214         Log(("EMR3HmSingleInstruction: emR3HmHandleRC -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    215     }
    216 
    217     return rcStrict;
    218236}
    219237
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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