VirtualBox

Changeset 87776 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Feb 17, 2021 12:21:16 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142832
Message:

dbgf.h,VMM/DBGF: A bit of cleanup on the public breakpoint structure and associated helpers, add new flags to indicate whether the breakpoint should hit before or after the instruction was executed, bugref:9837

File:
1 edited

Legend:

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

    r87594 r87776  
    169169    if (pBpOwnerR0)
    170170    {
    171         VBOXSTRICTRC rcStrict = pBpOwnerR0->pfnBpHitR0(pVM, pVCpu->idCpu, pBpR0->pvUserR0, hBp, &pBp->Pub);
     171        VBOXSTRICTRC rcStrict = VINF_SUCCESS;
     172
     173        if (DBGF_BP_PUB_IS_EXEC_BEFORE(&pBp->Pub))
     174            rcStrict = pBpOwnerR0->pfnBpHitR0(pVM, pVCpu->idCpu, pBpR0->pvUserR0, hBp, &pBp->Pub, DBGF_BP_F_HIT_EXEC_BEFORE);
    172175        if (rcStrict == VINF_SUCCESS)
    173176        {
     
    181184                abInstr[0] = pBp->Pub.u.Int3.bOrg;
    182185                rcStrict = IEMExecOneWithPrefetchedByPC(pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), GCPtrInstr, &abInstr[0], sizeof(abInstr));
    183                 rc = VBOXSTRICTRC_VAL(rcStrict);
     186                if (   rcStrict == VINF_SUCCESS
     187                    && DBGF_BP_PUB_IS_EXEC_AFTER(&pBp->Pub))
     188                {
     189                    rcStrict = pBpOwnerR0->pfnBpHitR0(pVM, pVCpu->idCpu, pBpR0->pvUserR0, hBp, &pBp->Pub, DBGF_BP_F_HIT_EXEC_AFTER);
     190                    if (rcStrict == VINF_SUCCESS)
     191                        rc = VINF_SUCCESS;
     192                    else if (   rcStrict == VINF_DBGF_BP_HALT
     193                             || rcStrict == VINF_DBGF_R3_BP_OWNER_DEFER)
     194                    {
     195                        pVCpu->dbgf.s.hBpActive = hBp;
     196                        if (rcStrict == VINF_DBGF_R3_BP_OWNER_DEFER)
     197                            pVCpu->dbgf.s.fBpInvokeOwnerCallback = true;
     198                        else
     199                            pVCpu->dbgf.s.fBpInvokeOwnerCallback = false;
     200                    }
     201                    else /* Guru meditation. */
     202                        rc = VERR_DBGF_BP_OWNER_CALLBACK_WRONG_STATUS;
     203                }
     204                else
     205                    rc = VBOXSTRICTRC_VAL(rcStrict);
    184206            }
    185207        }
     
    249271#endif
    250272            if (   pBp
    251                 && DBGF_BP_PUB_GET_TYPE(pBp->Pub.fFlagsAndType) == DBGFBPTYPE_INT3)
     273                && DBGF_BP_PUB_GET_TYPE(&pBp->Pub) == DBGFBPTYPE_INT3)
    252274#ifdef IN_RING3
    253275                return dbgfBpHit(pVM, pVCpu, pRegFrame, hBp, pBp);
     
    379401#endif
    380402                if (   pBp
    381                     && DBGF_BP_PUB_GET_TYPE(pBp->Pub.fFlagsAndType) == DBGFBPTYPE_INT3)
     403                    && DBGF_BP_PUB_GET_TYPE(&pBp->Pub) == DBGFBPTYPE_INT3)
    382404                {
    383405                    if (pBp->Pub.u.Int3.GCPtr == (RTGCUINTPTR)GCPtrBp)
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