VirtualBox

Changeset 47671 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 12, 2013 11:16:55 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
87874
Message:

VMM: More debugging related stuff.

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

Legend:

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

    r47328 r47671  
    115115
    116116/**
     117 * Checks if any of the hardware breakpoints are armed.
     118 *
     119 * @returns true if armed, false if not.
     120 * @param   pVM         The cross context VM structure.
     121 */
     122VMM_INT_DECL(bool) DBGFBpIsHwArmed(PVM pVM)
     123{
     124    Assert(RT_ELEMENTS(pVM->dbgf.s.aHwBreakpoints) == 4);
     125    return (pVM->dbgf.s.aHwBreakpoints[0].fEnabled && pVM->dbgf.s.aHwBreakpoints[0].enmType == DBGFBPTYPE_REG)
     126        || (pVM->dbgf.s.aHwBreakpoints[1].fEnabled && pVM->dbgf.s.aHwBreakpoints[1].enmType == DBGFBPTYPE_REG)
     127        || (pVM->dbgf.s.aHwBreakpoints[2].fEnabled && pVM->dbgf.s.aHwBreakpoints[2].enmType == DBGFBPTYPE_REG)
     128        || (pVM->dbgf.s.aHwBreakpoints[3].fEnabled && pVM->dbgf.s.aHwBreakpoints[3].enmType == DBGFBPTYPE_REG);
     129}
     130
     131
     132/**
    117133 * Returns the single stepping state for a virtual CPU.
    118134 *
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r47568 r47671  
    89268926     */
    89278927    PVM pVM = IEMCPU_TO_VM(pIemCpu);
    8928     EMRemLock(pVM);
    8929     int rc = REMR3EmulateInstruction(pVM, IEMCPU_TO_VMCPU(pIemCpu));
    8930     AssertRC(rc);
    8931     EMRemUnlock(pVM);
     8928    VBOXSTRICTRC rc = VERR_EM_CANNOT_EXEC_GUEST;
     8929#if 1
     8930    if (   HMIsEnabled(pVM)
     8931        && pIemCpu->cIOReads == 0
     8932        && pIemCpu->cIOWrites == 0)
     8933        do
     8934            rc = EMR3HmSingleInstruction(pVM, IEMCPU_TO_VMCPU(pIemCpu), EM_ONE_INS_FLAGS_RIP_CHANGE);
     8935        while (rc == VINF_SUCCESS);
     8936#endif
     8937    if (   rc == VERR_EM_CANNOT_EXEC_GUEST
     8938        || rc == VINF_IOM_R3_IOPORT_READ
     8939        || rc == VINF_IOM_R3_IOPORT_WRITE
     8940        || rc == VINF_IOM_R3_MMIO_READ
     8941        || rc == VINF_IOM_R3_MMIO_READ_WRITE
     8942        || rc == VINF_IOM_R3_MMIO_WRITE
     8943        )
     8944    {
     8945        EMRemLock(pVM);
     8946        rc = REMR3EmulateInstruction(pVM, IEMCPU_TO_VMCPU(pIemCpu));
     8947        AssertRC(rc);
     8948        EMRemUnlock(pVM);
     8949    }
    89328950
    89338951    /*
     
    95509568     * See if there is an interrupt pending in TRPM and inject it if we can.
    95519569     */
    9552 #ifdef IEM_VERIFICATION_MODE_FULL
     9570#if !defined(IEM_VERIFICATION_MODE_FULL) || !defined(IN_RING3)
     9571# ifdef IEM_VERIFICATION_MODE_FULL
    95539572    pIemCpu->uInjectCpl = UINT8_MAX;
    9554 #endif
     9573# endif
    95559574    if (   pCtx->eflags.Bits.u1IF
    95569575        && TRPMHasTrap(pVCpu)
     
    95669585            TRPMResetTrap(pVCpu);
    95679586    }
     9587#else
     9588    iemExecVerificationModeSetup(pIemCpu);
     9589#endif
    95689590
    95699591    /*
     
    96099631    if (rcStrict == VINF_SUCCESS)
    96109632        rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
     9633
     9634#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
     9635    /*
     9636     * Assert some sanity.
     9637     */
     9638    iemExecVerificationModeCheck(pIemCpu);
     9639#endif
    96119640
    96129641    /*
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r47670 r47671  
    24982498    Assert(!VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));
    24992499
    2500     if (   VM_FF_IS_PENDING(pVM, VM_FF_HM_TO_R3_MASK | VM_FF_REQUEST | VM_FF_PGM_POOL_FLUSH_PENDING | VM_FF_PDM_DMA)
    2501         || VMCPU_FF_IS_PENDING(pVCpu,   VMCPU_FF_HM_TO_R3_MASK | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
    2502                                       | VMCPU_FF_REQUEST))
     2500    if (   VM_FF_IS_PENDING(pVM, !pVCpu->hm.s.fSingleInstruction
     2501                            ? VM_FF_HP_R0_PRE_HM_MASK : VM_FF_HP_R0_PRE_HM_STEP_MASK)
     2502        || VMCPU_FF_IS_PENDING(pVCpu, !pVCpu->hm.s.fSingleInstruction
     2503                               ? VMCPU_FF_HP_R0_PRE_HM_MASK : VMCPU_FF_HP_R0_PRE_HM_STEP_MASK) )
    25032504    {
    25042505        /* Pending PGM C3 sync. */
     
    45844585    PSVMVMCB    pVmcb   = (PSVMVMCB)pVCpu->hm.s.svm.pvVmcb;
    45854586    PVM         pVM     = pVCpu->CTX_SUFF(pVM);
    4586     int rc = DBGFRZTrap01Handler(pVM, pVCpu, CPUMCTX2CORE(pCtx), pVmcb->guest.u64DR6);
     4587    int rc = DBGFRZTrap01Handler(pVM, pVCpu, CPUMCTX2CORE(pCtx), pVmcb->guest.u64DR6, pVCpu->hm.s.fSingleInstruction);
    45874588    if (rc == VINF_EM_RAW_GUEST_TRAP)
    45884589    {
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r47670 r47671  
    57915791    Assert(VMMRZCallRing3IsEnabled(pVCpu));
    57925792
    5793     if (   VM_FF_IS_PENDING(pVM, VM_FF_HM_TO_R3_MASK | VM_FF_REQUEST | VM_FF_PGM_POOL_FLUSH_PENDING | VM_FF_PDM_DMA)
    5794         || VMCPU_FF_IS_PENDING(pVCpu,  VMCPU_FF_HM_TO_R3_MASK | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
    5795                                      | VMCPU_FF_REQUEST | VMCPU_FF_HM_UPDATE_CR3 | VMCPU_FF_HM_UPDATE_PAE_PDPES))
     5793    if (   VM_FF_IS_PENDING(pVM, !pVCpu->hm.s.fSingleInstruction
     5794                            ? VM_FF_HP_R0_PRE_HM_MASK : VM_FF_HP_R0_PRE_HM_STEP_MASK)
     5795        || VMCPU_FF_IS_PENDING(pVCpu, !pVCpu->hm.s.fSingleInstruction
     5796                               ? VMCPU_FF_HP_R0_PRE_HM_MASK : VMCPU_FF_HP_R0_PRE_HM_STEP_MASK) )
    57965797    {
    57975798        /* We need the control registers now, make sure the guest-CPU context is updated. */
     
    96289629    AssertRCReturn(rc, rc);
    96299630
     9631    /* If we sat the trap flag above, we have to clear it. */ /** @todo HM should remember what it does and possibly do this elsewhere! */
     9632    if (   (pVCpu->hm.s.fSingleInstruction || DBGFIsStepping(pVCpu))
     9633        && !(pVCpu->CTX_SUFF(pVM)->hm.s.vmx.msr.vmx_proc_ctls.n.allowed1 & VMX_VMCS_CTRL_PROC_EXEC_MONITOR_TRAP_FLAG))
     9634        pMixedCtx->eflags.Bits.u1TF = 0;
     9635
    96309636    /* Refer Intel spec. Table 27-1. "Exit Qualifications for debug exceptions" for the format. */
    96319637    uint64_t uDR6 = X86_DR6_INIT_VAL;
     
    96339639                     & (X86_DR6_B0 | X86_DR6_B1 | X86_DR6_B2 | X86_DR6_B3 | X86_DR6_BD | X86_DR6_BS));
    96349640
    9635     rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pMixedCtx), uDR6);
     9641    rc = DBGFRZTrap01Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pMixedCtx), uDR6, pVCpu->hm.s.fSingleInstruction);
    96369642    if (rc == VINF_EM_RAW_GUEST_TRAP)
    96379643    {
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r47660 r47671  
    5757#include <VBox/vmm/hm.h>
    5858#include <VBox/vmm/patm.h>
    59 #ifdef IEM_VERIFICATION_MODE
    60 # include <VBox/vmm/iem.h>
    61 #endif
    6259#include "EMInternal.h"
    6360#include <VBox/vmm/vm.h>
     
    819816#endif
    820817                else if (pVCpu->em.s.enmState == EMSTATE_DEBUG_GUEST_HM)
    821                     rc = EMR3HmSingleInstruction(pVM, pVCpu);
     818                    rc = EMR3HmSingleInstruction(pVM, pVCpu, 0 /*fFlags*/);
    822819#ifdef VBOX_WITH_REM
    823820                else if (pVCpu->em.s.enmState == EMSTATE_DEBUG_GUEST_REM)
     
    12611258EMSTATE emR3Reschedule(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
    12621259{
    1263 #ifdef IEM_VERIFICATION_MODE
    1264     return EMSTATE_REM;
    1265 #else
    1266 
    12671260    /*
    12681261     * When forcing raw-mode execution, things are simple.
     
    14721465    /*Assert(PGMPhysIsA20Enabled(pVCpu));*/
    14731466    return EMSTATE_RAW;
    1474 #endif /* !IEM_VERIFICATION_MODE */
    1475 
    14761467}
    14771468
     
    23602351                 */
    23612352                case EMSTATE_RAW:
    2362 #ifndef IEM_VERIFICATION_MODE /* remove later */
    2363 # ifdef VBOX_WITH_RAW_MODE
     2353#ifdef VBOX_WITH_RAW_MODE
    23642354                    rc = emR3RawExecute(pVM, pVCpu, &fFFDone);
    2365 # else
     2355#else
    23662356                    AssertLogRelMsgFailed(("%Rrc\n", rc));
    23672357                    rc = VERR_EM_INTERNAL_ERROR;
    2368 # endif
     2358#endif
    23692359                    break;
    2370 #endif
    23712360
    23722361                /*
     
    23742363                 */
    23752364                case EMSTATE_HM:
    2376 #ifndef IEM_VERIFICATION_MODE /* remove later */
    23772365                    rc = emR3HmExecute(pVM, pVCpu, &fFFDone);
    23782366                    break;
    2379 #endif
    23802367
    23812368                /*
     
    23832370                 */
    23842371                case EMSTATE_REM:
    2385 #ifdef IEM_VERIFICATION_MODE
    2386 # if 1
    2387                     rc = VBOXSTRICTRC_TODO(IEMExecOne(pVCpu)); fFFDone = false;
    2388 # else
    2389                     rc = VBOXSTRICTRC_TODO(REMR3EmulateInstruction(pVM, pVCpu)); fFFDone = false;
    2390                     if (rc == VINF_EM_RESCHEDULE)
    2391                         rc = VINF_SUCCESS;
    2392 # endif
    2393 #else
    23942372                    rc = emR3RemExecute(pVM, pVCpu, &fFFDone);
    2395 #endif
    23962373                    Log2(("EMR3ExecuteVM: emR3RemExecute -> %Rrc\n", rc));
    23972374                    break;
     
    24022379                case EMSTATE_IEM:
    24032380#if 0 /* For testing purposes. */
    2404                     rc = VBOXSTRICTRC_TODO(EMR3HmSingleInstruction(pVM, pVCpu));
     2381                    rc = VBOXSTRICTRC_TODO(EMR3HmSingleInstruction(pVM, pVCpu, EM_ONE_INS_FLAGS_RIP_CHANGE));
    24052382                    if (rc == VINF_EM_DBG_STEPPED || rc == VINF_EM_RESCHEDULE_HM || rc == VINF_EM_RESCHEDULE_REM || rc == VINF_EM_RESCHEDULE_RAW)
    24062383                        rc = VINF_SUCCESS;
  • 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
  • trunk/src/VBox/VMM/VMMRC/TRPMRCHandlers.cpp

    r47660 r47671  
    321321     */
    322322    PGMRZDynMapStartAutoSet(pVCpu);
    323     int rc = DBGFRZTrap01Handler(pVM, pVCpu, pRegFrame, uDr6);
     323    int rc = DBGFRZTrap01Handler(pVM, pVCpu, pRegFrame, uDr6, false /*fAltStepping*/);
    324324    if (rc == VINF_EM_RAW_GUEST_TRAP)
    325325        CPUMSetGuestDR6(pVCpu, CPUMGetGuestDR6(pVCpu) | uDr6);
     326    else if (rc == VINF_EM_DBG_STEPPED)
     327        pRegFrame->eflags.Bits.u1TF = 0;
    326328
    327329    rc = trpmGCExitTrap(pVM, pVCpu, rc, pRegFrame);
     
    368370     * Now leave the rest to the DBGF.
    369371     */
    370     int rc = DBGFRZTrap01Handler(pVM, pVCpu, pRegFrame, uDr6);
     372    int rc = DBGFRZTrap01Handler(pVM, pVCpu, pRegFrame, uDr6, false /*fAltStepping*/);
    371373    AssertStmt(rc != VINF_EM_RAW_GUEST_TRAP, rc = VERR_TRPM_IPE_1);
     374    if (rc == VINF_EM_DBG_STEPPED)
     375        pRegFrame->eflags.Bits.u1TF = 0;
    372376
    373377    Log6(("TRPMGCHyper01: %Rrc (%04x:%08x %RTreg)\n", rc, pRegFrame->cs.Sel, pRegFrame->eip, uDr6));
  • trunk/src/VBox/VMM/VMMRZ/DBGFRZ.cpp

    r47660 r47671  
    3838 *          other codes are passed execution to host context.
    3939 *
    40  * @param   pVM         Pointer to the VM.
    41  * @param   pVCpu       Pointer to the VMCPU.
    42  * @param   pRegFrame   Pointer to the register frame for the trap.
    43  * @param   uDr6        The DR6 hypervisor register value.
     40 * @param   pVM             Pointer to the VM.
     41 * @param   pVCpu           Pointer to the VMCPU.
     42 * @param   pRegFrame       Pointer to the register frame for the trap.
     43 * @param   uDr6            The DR6 hypervisor register value.
     44 * @param   fAltStepping    Alternative stepping indicator.
    4445 */
    45 VMMRZ_INT_DECL(int) DBGFRZTrap01Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCUINTREG uDr6)
     46VMMRZ_INT_DECL(int) DBGFRZTrap01Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCUINTREG uDr6, bool fAltStepping)
    4647{
    4748#ifdef IN_RC
     
    7879     */
    7980    if (    (uDr6 & X86_DR6_BS)
    80         &&  (fInHyper || pVCpu->dbgf.s.fSingleSteppingRaw))
     81        &&  (fInHyper || pVCpu->dbgf.s.fSingleSteppingRaw || fAltStepping))
    8182    {
    8283        pVCpu->dbgf.s.fSingleSteppingRaw = false;
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