VirtualBox

Changeset 59073 in vbox


Ignore:
Timestamp:
Dec 10, 2015 12:48:03 PM (9 years ago)
Author:
vboxsync
Message:

VMM: VINF_EM_DBG_EVENT and DBGFEventGenericWithArg implementation.

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/err.h

    r58658 r59073  
    118118 * resolved there it will enter guru meditation. */
    119119#define VINF_EM_DBG_HYPER_ASSERTION         1103
     120/** Generic debug event, suspend the VM for debugging. */
     121#define VINF_EM_DBG_EVENT                   1104
    120122/** Indicating that the VM should be suspended for debugging because
    121123 * the developer wants to inspect the VM state. */
  • trunk/include/VBox/err.mac

    r56637 r59073  
    2828%define VINF_EM_DBG_HYPER_BREAKPOINT    1102
    2929%define VINF_EM_DBG_HYPER_ASSERTION    1103
     30%define VINF_EM_DBG_EVENT    1104
    3031%define VINF_EM_DBG_STOP    1105
    3132%define VINF_EM_DBG_STEPPED    1106
  • trunk/include/VBox/vmm/dbgf.h

    r59072 r59073  
    488488            RTUINT                  iBp;
    489489        } Bp;
     490
     491        /** Generic debug event. */
     492        struct DBGFEVENTGENERIC
     493        {
     494            /** Argument. */
     495            uint64_t                uArg;
     496        } Generic;
     497
    490498        /** Padding for ensuring that the structure is 8 byte aligned. */
    491499        uint64_t        au64Padding[4];
     
    832840VMM_INT_DECL(bool)          DBGFIsStepping(PVMCPU pVCpu);
    833841VMM_INT_DECL(VBOXSTRICTRC)  DBGFBpCheckIo(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, RTIOPORT uIoPort, uint8_t cbValue);
    834 VMM_INT_DECL(VBOXSTRICTRC)  DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg);
     842VMM_INT_DECL(VBOXSTRICTRC)  DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg,
     843                                                    DBGFEVENTCTX enmCtx);
    835844
    836845
  • trunk/include/VBox/vmm/pgm.h

    r58126 r59073  
    526526    (   (a_rcStrict) == VINF_SUCCESS \
    527527     || (a_rcStrict) == VINF_EM_DBG_STOP \
     528     || (a_rcStrict) == VINF_EM_DBG_EVENT \
    528529     || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \
    529530    )
     
    536537     || (a_rcStrict) == VINF_EM_HALT \
    537538     || (a_rcStrict) == VINF_EM_DBG_STOP \
     539     || (a_rcStrict) == VINF_EM_DBG_EVENT \
    538540     || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \
    539541    )
     
    548550     || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR_GDT_FAULT \
    549551     || (a_rcStrict) == VINF_EM_DBG_STOP \
     552     || (a_rcStrict) == VINF_EM_DBG_EVENT \
    550553     || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \
    551554    )
  • trunk/src/VBox/VMM/VMMAll/DBGFAll.cpp

    r58998 r59073  
    2626#include <VBox/err.h>
    2727#include <iprt/assert.h>
     28#include <iprt/asm.h>
    2829
    2930
     
    262263
    263264
    264 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg)
    265 {
     265/**
     266 * Checks if the specified generic event is enabled or not.
     267 *
     268 * @returns true / false.
     269 * @param   pVM                 The cross context VM structure.
     270 * @param   enmEvent            The generic event being raised.
     271 * @param   uEventArg           The argument of that event.
     272 */
     273DECLINLINE(bool) dbgfEventIsGenericWithArgEnabled(PVM pVM, DBGFEVENTTYPE enmEvent, uint64_t uEventArg)
     274{
     275    if (DBGF_IS_EVENT_ENABLED(pVM, enmEvent))
     276    {
     277        switch (enmEvent)
     278        {
     279            case DBGFEVENT_INTERRUPT_HARDWARE:
     280                AssertReturn(uEventArg < 256, false);
     281                return ASMBitTest(pVM->dbgf.s.bmHardIntBreakpoints, (uint32_t)uEventArg);
     282
     283            case DBGFEVENT_INTERRUPT_SOFTWARE:
     284                AssertReturn(uEventArg < 256, false);
     285                return ASMBitTest(pVM->dbgf.s.bmSoftIntBreakpoints, (uint32_t)uEventArg);
     286
     287            default:
     288                return true;
     289
     290        }
     291    }
     292    return false;
     293}
     294
     295
     296/**
     297 * Raises a generic debug event if enabled and not being ignored.
     298 *
     299 * @returns Strict VBox status code.
     300 * @retval  VINF_EM_DBG_EVENT if the event was raised and the caller should
     301 *          return ASAP to the debugger (via EM).
     302 * @retval  VINF_SUCCESS if the event was disabled or ignored.
     303 *
     304 * @param   pVM                 The cross context VM structure.
     305 * @param   pVCpu               The cross context virtual CPU structure.
     306 * @param   enmEvent            The generic event being raised.
     307 * @param   uEventArg           The argument of that event.
     308 * @param   enmCtx              The context in which this event is being raised.
     309 *
     310 * @thread  EMT(pVCpu)
     311 */
     312VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg,
     313                                                   DBGFEVENTCTX enmCtx)
     314{
     315    /*
     316     * Is it enabled.
     317     */
     318    if (dbgfEventIsGenericWithArgEnabled(pVM, enmEvent, uEventArg))
     319    {
     320        /*
     321         * Any events on the stack. Should the incoming event be ignored?
     322         */
     323        uint64_t const rip = CPUMGetGuestRIP(pVCpu);
     324        uint32_t i = pVCpu->dbgf.s.cEvents;
     325        if (i > 0)
     326        {
     327            while (i-- > 0)
     328            {
     329                if (   pVCpu->dbgf.s.aEvents[i].Event.enmType   == enmEvent
     330                    && pVCpu->dbgf.s.aEvents[i].enmState        == DBGFEVENTSTATE_IGNORE
     331                    && pVCpu->dbgf.s.aEvents[i].rip             == rip)
     332                {
     333                    pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_RESTORABLE;
     334                    return VINF_SUCCESS;
     335                }
     336                Assert(pVCpu->dbgf.s.aEvents[i].enmState != DBGFEVENTSTATE_CURRENT);
     337            }
     338
     339            /*
     340             * Trim the event stack.
     341             */
     342            i = pVCpu->dbgf.s.cEvents;
     343            while (i-- > 0)
     344            {
     345                if (   pVCpu->dbgf.s.aEvents[i].rip == rip
     346                    && (   pVCpu->dbgf.s.aEvents[i].enmState == DBGFEVENTSTATE_RESTORABLE
     347                        || pVCpu->dbgf.s.aEvents[i].enmState == DBGFEVENTSTATE_IGNORE) )
     348                    pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_IGNORE;
     349                else
     350                {
     351                    if (i + 1 != pVCpu->dbgf.s.cEvents)
     352                        memmove(&pVCpu->dbgf.s.aEvents[i], &pVCpu->dbgf.s.aEvents[i + 1],
     353                                (pVCpu->dbgf.s.cEvents - i) * sizeof(pVCpu->dbgf.s.aEvents));
     354                    pVCpu->dbgf.s.cEvents--;
     355                }
     356            }
     357
     358            i = pVCpu->dbgf.s.cEvents;
     359            AssertStmt(i < RT_ELEMENTS(pVCpu->dbgf.s.aEvents), i = RT_ELEMENTS(pVCpu->dbgf.s.aEvents) - 1);
     360        }
     361
     362        /*
     363         * Push the event.
     364         */
     365        pVCpu->dbgf.s.aEvents[i].enmState               = DBGFEVENTSTATE_CURRENT;
     366        pVCpu->dbgf.s.aEvents[i].rip                    = rip;
     367        pVCpu->dbgf.s.aEvents[i].Event.enmType          = enmEvent;
     368        pVCpu->dbgf.s.aEvents[i].Event.enmCtx           = enmCtx;
     369        pVCpu->dbgf.s.aEvents[i].Event.u.Generic.uArg   = uEventArg;
     370        pVCpu->dbgf.s.cEvents = i + 1;
     371
     372        return VINF_EM_DBG_EVENT;
     373    }
     374
    266375    return VINF_SUCCESS;
    267376}
    268377
    269 
  • trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp

    r58123 r59073  
    20292029                  || rcStrict == VINF_IOM_R3_MMIO_READ_WRITE
    20302030                  || rcStrict == VINF_EM_DBG_STOP
     2031                  || rcStrict == VINF_EM_DBG_EVENT
    20312032                  || rcStrict == VINF_EM_DBG_BREAKPOINT
    20322033                  || rcStrict == VINF_EM_OFF
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r58170 r59073  
    7979     || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR  \
    8080     || (a_rcStrict) == VINF_EM_DBG_STOP \
     81     || (a_rcStrict) == VINF_EM_DBG_EVENT \
    8182     || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \
    8283     || (a_rcStrict) == VINF_EM_OFF \
     
    124125     || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR \
    125126     || (a_rcStrict) == VINF_EM_DBG_STOP \
     127     || (a_rcStrict) == VINF_EM_DBG_EVENT \
    126128     || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \
    127129    )
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r59004 r59073  
    96889688        && DBGF_IS_EVENT_ENABLED(pVM, enmEvent1))
    96899689    {
    9690         VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg);
     9690        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg, DBGFEVENTCTX_HM);
    96919691        if (rcStrict != VINF_SUCCESS)
    96929692            return rcStrict;
     
    96959695             && DBGF_IS_EVENT_ENABLED(pVM, enmEvent2))
    96969696    {
    9697         VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg);
     9697        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg, DBGFEVENTCTX_HM);
    96989698        if (rcStrict != VINF_SUCCESS)
    96999699            return rcStrict;
  • trunk/src/VBox/VMM/VMMR3/DBGF.cpp

    r58938 r59073  
    748748                    case VINF_EM_DBG_STEP:
    749749                    case VINF_EM_DBG_STOP:
     750                    case VINF_EM_DBG_EVENT:
    750751                        AssertMsgFailed(("rc=%Rrc\n", rc));
    751752                        break;
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r58123 r59073  
    850850                break;
    851851
     852            case VINF_EM_DBG_EVENT:
     853                rc = DBGFR3EventHandlePending(pVM, pVCpu);
     854                break;
     855
    852856            case VINF_EM_DBG_HYPER_STEPPED:
    853857                rc = DBGFR3Event(pVM, DBGFEVENT_STEPPED_HYPER);
     
    894898                case VINF_EM_DBG_STEP:
    895899                case VINF_EM_DBG_STOP:
     900                case VINF_EM_DBG_EVENT:
    896901                case VINF_EM_DBG_STEPPED:
    897902                case VINF_EM_DBG_BREAKPOINT:
     
    23572362                case VINF_EM_DBG_STEPPED:
    23582363                case VINF_EM_DBG_STOP:
     2364                case VINF_EM_DBG_EVENT:
    23592365                case VINF_EM_DBG_BREAKPOINT:
    23602366                case VINF_EM_DBG_STEP:
  • trunk/src/VBox/VMM/include/EMHandleRCTmpl.h

    r58658 r59073  
    341341        case VINF_EM_DBG_HYPER_ASSERTION:
    342342        case VINF_EM_DBG_STOP:
     343        case VINF_EM_DBG_EVENT:
    343344            break;
    344345
Note: See TracChangeset for help on using the changeset viewer.

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