VirtualBox

Changeset 73348 in vbox


Ignore:
Timestamp:
Jul 25, 2018 9:25:45 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123962
Message:

DBGF,DBGC,GIMHv: Added some basic windows bug check formatting (DBGFR3FormatBugCheck). Extended DBGFEventGenericWithArgs and DBGFEVENT to hold up to 6 64-bit arguments, so that we can pass all the bug check arguments to the debugger.

Location:
trunk
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/dbgf.h

    r73150 r73348  
    500500        struct DBGFEVENTGENERIC
    501501        {
    502             /** Argument. */
    503             uint64_t                uArg;
     502            /** Number of arguments. */
     503            uint8_t                 cArgs;
     504            /** Alignmnet padding. */
     505            uint8_t                 uPadding[7];
     506            /** Arguments. */
     507            uint64_t                auArgs[6];
    504508        } Generic;
    505509
    506510        /** Padding for ensuring that the structure is 8 byte aligned. */
    507         uint64_t        au64Padding[4];
     511        uint64_t        au64Padding[7];
    508512    } u;
    509513} DBGFEVENT;
     
    532536VMMR3_INT_DECL(void)    DBGFR3PowerOff(PVM pVM);
    533537VMMR3_INT_DECL(void)    DBGFR3Relocate(PVM pVM, RTGCINTPTR offDelta);
     538
    534539VMMR3_INT_DECL(int)     DBGFR3VMMForcedAction(PVM pVM, PVMCPU pVCpu);
    535540VMMR3_INT_DECL(VBOXSTRICTRC)    DBGFR3EventHandlePending(PVM pVM, PVMCPU pVCpu);
     
    541546VMMR3_INT_DECL(int)     DBGFR3EventAssertion(PVM pVM, DBGFEVENTTYPE enmEvent, const char *pszMsg1, const char *pszMsg2);
    542547VMMR3_INT_DECL(int)     DBGFR3EventBreakpoint(PVM pVM, DBGFEVENTTYPE enmEvent);
     548
    543549VMMR3_INT_DECL(int)     DBGFR3PrgStep(PVMCPU pVCpu);
    544550
     
    885891VMM_INT_DECL(bool)          DBGFIsStepping(PVMCPU pVCpu);
    886892VMM_INT_DECL(VBOXSTRICTRC)  DBGFBpCheckIo(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, RTIOPORT uIoPort, uint8_t cbValue);
    887 VMM_INT_DECL(VBOXSTRICTRC)  DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg,
    888                                                     DBGFEVENTCTX enmCtx);
     893VMM_INT_DECL(VBOXSTRICTRC)  DBGFEventGenericWithArgs(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, DBGFEVENTCTX enmCtx,
     894                                                     unsigned cArgs, ...);
    889895
    890896
     
    27072713/** @} */
    27082714
     2715
     2716/** @defgroup grp_dbgf_misc  Misc DBGF interfaces.
     2717 * @{ */
     2718VMMR3DECL(int)               DBGFR3FormatBugCheck(PUVM pUVM, char *pszDetails, size_t cbDetails,
     2719                                                  uint64_t uP0, uint64_t uP1, uint64_t uP2, uint64_t uP3, uint64_t uP4);
     2720/** @} */
    27092721#endif /* IN_RING3 */
    27102722
  • trunk/src/VBox/Debugger/DBGCEmulateCodeView.cpp

    r73097 r73348  
    624624    { DBGFEVENT_MEMORY_UNASSIGNED,      "mmio_unassigned",      NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    625625    { DBGFEVENT_MEMORY_ROM_WRITE,       "rom_write",            NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    626     { DBGFEVENT_BSOD_MSR,               "bsod_msr",             NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
    627     { DBGFEVENT_BSOD_EFI,               "bsod_efi",             NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, 0,                    NULL },
     626    { DBGFEVENT_BSOD_MSR,               "bsod_msr",             NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, DBGCSXEVT_F_BUGCHECK, NULL },
     627    { DBGFEVENT_BSOD_EFI,               "bsod_efi",             NULL,       kDbgcSxEventKind_Plain,     kDbgcEvtState_Disabled, DBGCSXEVT_F_BUGCHECK, NULL },
    628628};
    629629/** Number of entries in g_aDbgcSxEvents.  */
  • trunk/src/VBox/Debugger/DBGCInternal.h

    r73097 r73348  
    424424 * @{ */
    425425#define DBGCSXEVT_F_TAKE_ARG        RT_BIT_32(0)
     426/** Windows bugcheck, should take 5 arguments. */
     427#define DBGCSXEVT_F_BUGCHECK        RT_BIT_32(1)
    426428/** @} */
    427429
  • trunk/src/VBox/Debugger/DBGConsole.cpp

    r72268 r73348  
    815815                {
    816816                    Assert(pEvtDesc->pszDesc);
     817                    Assert(pEvent->u.Generic.cArgs == 1);
    817818                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s no %#llx! (%s)\n",
    818                                                  pEvtDesc->pszDesc, pEvent->u.Generic.uArg, pEvtDesc->pszName);
     819                                                 pEvtDesc->pszDesc, pEvent->u.Generic.auArgs[0], pEvtDesc->pszName);
     820                }
     821                else if (pEvtDesc->fFlags & DBGCSXEVT_F_BUGCHECK)
     822                {
     823                    Assert(pEvent->u.Generic.cArgs >= 5);
     824                    char szDetails[512];
     825                    DBGFR3FormatBugCheck(pDbgc->pUVM, szDetails, sizeof(szDetails), pEvent->u.Generic.auArgs[0],
     826                                         pEvent->u.Generic.auArgs[1], pEvent->u.Generic.auArgs[2],
     827                                         pEvent->u.Generic.auArgs[3], pEvent->u.Generic.auArgs[4]);
     828                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s %s%s!\n%s", pEvtDesc->pszName,
     829                                                 pEvtDesc->pszDesc ? "- " : "", pEvtDesc->pszDesc ? pEvtDesc->pszDesc : "",
     830                                                 szDetails);
    819831                }
    820832                else if (   (pEvtDesc->fFlags & DBGCSXEVT_F_TAKE_ARG)
    821                          || pEvent->u.Generic.uArg != 0)
     833                         || pEvent->u.Generic.cArgs > 1
     834                         || (   pEvent->u.Generic.cArgs == 1
     835                             && pEvent->u.Generic.auArgs[0] != 0))
    822836                {
    823837                    if (pEvtDesc->pszDesc)
    824                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s - %s! arg=%#llx\n",
    825                                                      pEvtDesc->pszName, pEvtDesc->pszDesc, pEvent->u.Generic.uArg);
     838                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s - %s!",
     839                                                     pEvtDesc->pszName, pEvtDesc->pszDesc);
    826840                    else
    827                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s! arg=%#llx\n",
    828                                                      pEvtDesc->pszName, pEvent->u.Generic.uArg);
     841                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s!", pEvtDesc->pszName);
     842                    if (pEvent->u.Generic.cArgs <= 1)
     843                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, " arg=%u%#llx\n", pEvent->u.Generic.auArgs[0]);
     844                    else
     845                    {
     846                        for (uint32_t i = 0; i < pEvent->u.Generic.cArgs; i++)
     847                            rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, " args[%u]=%#llx", i, pEvent->u.Generic.auArgs[i]);
     848                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\n");
     849                    }
    829850                }
    830851                else
  • trunk/src/VBox/Debugger/testcase/tstDBGCStubs.cpp

    r73150 r73348  
    545545}
    546546
     547VMMR3DECL(int) DBGFR3FormatBugCheck(PUVM pUVM, char *pszDetails, size_t cbDetails,
     548                                    uint64_t uP0, uint64_t uP1, uint64_t uP2, uint64_t uP3, uint64_t uP4)
     549{
     550    pszDetails[0] = '\0';
     551    return VERR_INTERNAL_ERROR;
     552}
     553
    547554#include <VBox/vmm/cfgm.h>
    548555VMMR3DECL(int) CFGMR3ValidateConfig(PCFGMNODE pNode, const char *pszNode,
  • trunk/src/VBox/VMM/Makefile.kmk

    r73271 r73348  
    9393        VMMR3/DBGFAddrSpace.cpp \
    9494        VMMR3/DBGFBp.cpp \
     95        VMMR3/DBGFR3BugCheck.cpp \
    9596        VMMR3/DBGFCoreWrite.cpp \
    9697        VMMR3/DBGFCpu.cpp \
  • trunk/src/VBox/VMM/VMMAll/DBGFAll.cpp

    r69111 r73348  
    2727#include <iprt/assert.h>
    2828#include <iprt/asm.h>
     29#include <iprt/stdarg.h>
    2930
    3031
     
    313314 * @retval  VINF_EM_DBG_EVENT if the event was raised and the caller should
    314315 *          return ASAP to the debugger (via EM).  We set VMCPU_FF_DBGF so, it
    315  *          is okay not to pass this along in some situations  .
     316 *          is okay not to pass this along in some situations.
    316317 * @retval  VINF_SUCCESS if the event was disabled or ignored.
    317318 *
     
    319320 * @param   pVCpu               The cross context virtual CPU structure.
    320321 * @param   enmEvent            The generic event being raised.
     322 * @param   enmCtx              The context in which this event is being raised.
     323 * @param   cArgs               Number of arguments (0 - 6).
    321324 * @param   uEventArg           The argument of that event.
    322  * @param   enmCtx              The context in which this event is being raised.
    323325 *
    324326 * @thread  EMT(pVCpu)
    325327 */
    326 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg,
    327                                                    DBGFEVENTCTX enmCtx)
    328 {
     328VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArgs(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, DBGFEVENTCTX enmCtx,
     329                                                    unsigned cArgs, ...)
     330{
     331    Assert(cArgs < RT_ELEMENTS(pVCpu->dbgf.s.aEvents[0].Event.u.Generic.auArgs));
     332
    329333    /*
    330334     * Is it enabled.
    331335     */
    332     if (dbgfEventIsGenericWithArgEnabled(pVM, enmEvent, uEventArg))
     336    va_list va;
     337    va_start(va, cArgs);
     338    uint64_t uEventArg0 = cArgs ? va_arg(va, uint64_t) : 0;
     339    if (dbgfEventIsGenericWithArgEnabled(pVM, enmEvent, uEventArg0))
    333340    {
    334341        /*
     
    346353                {
    347354                    pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_RESTORABLE;
     355                    va_end(va);
    348356                    return VINF_SUCCESS;
    349357                }
     
    381389        pVCpu->dbgf.s.aEvents[i].Event.enmType          = enmEvent;
    382390        pVCpu->dbgf.s.aEvents[i].Event.enmCtx           = enmCtx;
    383         pVCpu->dbgf.s.aEvents[i].Event.u.Generic.uArg   = uEventArg;
     391        pVCpu->dbgf.s.aEvents[i].Event.u.Generic.cArgs  = cArgs;
     392        pVCpu->dbgf.s.aEvents[i].Event.u.Generic.auArgs[0] = uEventArg0;
     393        if (cArgs > 1)
     394        {
     395            AssertStmt(cArgs < RT_ELEMENTS(pVCpu->dbgf.s.aEvents[i].Event.u.Generic.auArgs),
     396                       cArgs = RT_ELEMENTS(pVCpu->dbgf.s.aEvents[i].Event.u.Generic.auArgs));
     397            for (unsigned iArg = 1; iArg < cArgs; iArg++)
     398                pVCpu->dbgf.s.aEvents[i].Event.u.Generic.auArgs[iArg] = va_arg(va, uint64_t);
     399        }
    384400        pVCpu->dbgf.s.cEvents = i + 1;
    385401
    386402        VMCPU_FF_SET(pVCpu, VMCPU_FF_DBGF);
     403        va_end(va);
    387404        return VINF_EM_DBG_EVENT;
    388405    }
    389406
     407    va_end(va);
    390408    return VINF_SUCCESS;
    391409}
  • trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp

    r72469 r73348  
    934934                LogRel(("GIM: HyperV: Guest indicates a fatal condition! P0=%#RX64 P1=%#RX64 P2=%#RX64 P3=%#RX64 P4=%#RX64\n",
    935935                        pHv->uCrashP0Msr, pHv->uCrashP1Msr, pHv->uCrashP2Msr, pHv->uCrashP3Msr, pHv->uCrashP4Msr));
     936                char szDetails[512];
     937                DBGFR3FormatBugCheck(pVM->pUVM, szDetails, sizeof(szDetails), pHv->uCrashP0Msr, pHv->uCrashP1Msr,
     938                                     pHv->uCrashP2Msr, pHv->uCrashP3Msr, pHv->uCrashP4Msr);
     939                LogRel(("%s", szDetails));
    936940
    937941                if (DBGF_IS_EVENT_ENABLED(pVM, DBGFEVENT_BSOD_MSR))
    938                     DBGFEventGenericWithArg(pVM, pVCpu, DBGFEVENT_BSOD_MSR, pHv->uCrashP0Msr, DBGFEVENTCTX_OTHER);
     942                    DBGFEventGenericWithArgs(pVM, pVCpu, DBGFEVENT_BSOD_MSR, DBGFEVENTCTX_OTHER, 5 /*cArgs*/, pHv->uCrashP0Msr,
     943                                             pHv->uCrashP1Msr, pHv->uCrashP2Msr, pHv->uCrashP3Msr, pHv->uCrashP4Msr);
    939944                /* (Do not try pass VINF_EM_DBG_EVENT, doesn't work from here!) */
    940945            }
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r73311 r73348  
    95569556        && DBGF_IS_EVENT_ENABLED(pVM, enmEvent1))
    95579557    {
    9558         VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg, DBGFEVENTCTX_HM);
     9558        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArgs(pVM, pVCpu, enmEvent1, DBGFEVENTCTX_HM, 1, uEventArg);
    95599559        if (rcStrict != VINF_SUCCESS)
    95609560            return rcStrict;
     
    95639563             && DBGF_IS_EVENT_ENABLED(pVM, enmEvent2))
    95649564    {
    9565         VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg, DBGFEVENTCTX_HM);
     9565        VBOXSTRICTRC rcStrict = DBGFEventGenericWithArgs(pVM, pVCpu, enmEvent2, DBGFEVENTCTX_HM, 1, uEventArg);
    95669566        if (rcStrict != VINF_SUCCESS)
    95679567            return rcStrict;
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