VirtualBox

Changeset 92745 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 3, 2021 8:38:46 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
148656
Message:

VMM/IEM,DBGF: Hook INT3 emulation IEM up with DBGF to make breakpoints work a little bit.

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

Legend:

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

    r89924 r92745  
    530530 * @param   pRegFrame   Pointer to the register frame for the trap.
    531531 */
    532 VMM_INT_DECL(int) DBGFTrap03Handler(PVMCC pVM, PVMCPUCC pVCpu, PCPUMCTXCORE pRegFrame)
     532VMM_INT_DECL(VBOXSTRICTRC) DBGFTrap03Handler(PVMCC pVM, PVMCPUCC pVCpu, PCPUMCTXCORE pRegFrame)
    533533{
    534534#if defined(IN_RING0)
     
    552552
    553553        LogFlowFunc(("GCPtrBp=%RGv idxL1=%u u32L1Entry=%#x\n", GCPtrBp, idxL1, u32L1Entry));
    554         rc = VINF_EM_RAW_GUEST_TRAP;
    555554        if (u32L1Entry != DBGF_BP_INT3_L1_ENTRY_TYPE_NULL)
    556555        {
     
    576575                        rc = dbgfBpHit(pVM, pVCpu, pRegFrame, hBp, pBp, pBpR0);
    577576#endif
    578                     /* else: Genuine guest trap. */
     577                    else
     578                        rc = VINF_EM_RAW_GUEST_TRAP; /* Genuine guest trap. */
    579579                }
    580580                else /* Invalid breakpoint handle or not an int3 breakpoint. */
     
    587587                rc = VERR_DBGF_BP_L1_LOOKUP_FAILED;
    588588        }
    589         /* else: Genuine guest trap. */
     589        else
     590            rc = VINF_EM_RAW_GUEST_TRAP; /* Genuine guest trap. */
    590591
    591592        return rc;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r92626 r92745  
    28312831{
    28322832    Assert(pVCpu->iem.s.cXcptRecursions == 0);
     2833
     2834    /*
     2835     * We must check if this INT3 might belong to DBGF before raising a #BP.
     2836     */
     2837    if (u8Int == 3)
     2838    {
     2839        PVMCC pVM = pVCpu->CTX_SUFF(pVM);
     2840        if (pVM->dbgf.ro.cEnabledInt3Breakpoints == 0)
     2841        { /* likely: No vbox debugger breakpoints */ }
     2842        else
     2843        {
     2844            VBOXSTRICTRC rcStrict = DBGFTrap03Handler(pVM, pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx));
     2845            Log(("iemCImpl_int: DBGFTrap03Handler -> %Rrc\n", VBOXSTRICTRC_VAL(rcStrict) ));
     2846            if (rcStrict != VINF_EM_RAW_GUEST_TRAP)
     2847                return iemSetPassUpStatus(pVCpu, rcStrict);
     2848        }
     2849    }
    28332850    return iemRaiseXcptOrInt(pVCpu,
    28342851                             cbInstr,
  • trunk/src/VBox/VMM/VMMAll/VMXAllTemplate.cpp.h

    r92626 r92745  
    1065210652    AssertRCReturn(rc, rc);
    1065310653
     10654    VBOXSTRICTRC rcStrict;
    1065410655    if (!pVmxTransient->fIsNestedGuest)
    10655         rc = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx));
     10656        rcStrict = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx));
    1065610657    else
    10657         rc = VINF_EM_RAW_GUEST_TRAP;
    10658 
    10659     if (rc == VINF_EM_RAW_GUEST_TRAP)
     10658        rcStrict = VINF_EM_RAW_GUEST_TRAP;
     10659
     10660    if (rcStrict == VINF_EM_RAW_GUEST_TRAP)
    1066010661    {
    1066110662        vmxHCSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),
    1066210663                               pVmxTransient->cbExitInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */);
    10663         rc = VINF_SUCCESS;
    10664     }
    10665 
    10666     Assert(rc == VINF_SUCCESS || rc == VINF_EM_DBG_BREAKPOINT);
    10667     return rc;
     10664        rcStrict = VINF_SUCCESS;
     10665    }
     10666
     10667    Assert(rcStrict == VINF_SUCCESS || rcStrict == VINF_EM_DBG_BREAKPOINT);
     10668    return rcStrict;
    1066810669}
    1066910670
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r92626 r92745  
    75117511
    75127512    PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    7513     int rc = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
     7513    VBOXSTRICTRC rc = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(pCtx));
    75147514    if (rc == VINF_EM_RAW_GUEST_TRAP)
    75157515    {
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r92626 r92745  
    1410514105    AssertRCReturn(rc, rc);
    1410614106
     14107    VBOXSTRICTRC rcStrict;
    1410714108    if (!pVmxTransient->fIsNestedGuest)
    14108         rc = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx));
     14109        rcStrict = DBGFTrap03Handler(pVCpu->CTX_SUFF(pVM), pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx));
    1410914110    else
    14110         rc = VINF_EM_RAW_GUEST_TRAP;
    14111 
    14112     if (rc == VINF_EM_RAW_GUEST_TRAP)
     14111        rcStrict = VINF_EM_RAW_GUEST_TRAP;
     14112
     14113    if (rcStrict == VINF_EM_RAW_GUEST_TRAP)
    1411314114    {
    1411414115        hmR0VmxSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_INT_INFO(pVmxTransient->uExitIntInfo),
    1411514116                               pVmxTransient->cbExitInstr, pVmxTransient->uExitIntErrorCode, 0 /* GCPtrFaultAddress */);
    14116         rc = VINF_SUCCESS;
    14117     }
    14118 
    14119     Assert(rc == VINF_SUCCESS || rc == VINF_EM_DBG_BREAKPOINT);
    14120     return rc;
     14117        rcStrict = VINF_SUCCESS;
     14118    }
     14119
     14120    Assert(rcStrict == VINF_SUCCESS || rcStrict == VINF_EM_DBG_BREAKPOINT);
     14121    return rcStrict;
    1412114122}
    1412214123
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