VMMGuruMeditation.cpp revision 98427c0ab08697e468c26dc33ee9571308577867
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VMM - The Virtual Machine Monitor, Guru Meditation Code.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Copyright (C) 2006-2010 Oracle Corporation
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * available from http://www.virtualbox.org. This file is free software;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync * General Public License (GPL) as published by the Free Software
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*******************************************************************************
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync* Header Files *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync*******************************************************************************/
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync/*******************************************************************************
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync* Structures and Typedefs *
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync*******************************************************************************/
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync * Structure to pass to DBGFR3Info() and for doing all other
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync * output during fatal dump.
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync /** The helper core. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** The release logger instance. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync /** The saved release logger flags. */
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync /** The logger instance. */
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync /** The saved logger flags. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync /** The saved logger destination flags. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Whether to output to stderr or not. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Whether we're still recording the summary or not. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Buffer for the summary. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** The current summary offset. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** Pointer to a VMMR3FATALDUMPINFOHLP structure. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef const VMMR3FATALDUMPINFOHLP *PCVMMR3FATALDUMPINFOHLP;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Print formatted string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp Pointer to this structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pszFormat The format string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param ... Arguments.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic DECLCALLBACK(void) vmmR3FatalDumpInfoHlp_pfnPrintf(PCDBGFINFOHLP pHlp, const char *pszFormat, ...)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * Print formatted string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp Pointer to this structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pszFormat The format string.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * @param args Argument list.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic DECLCALLBACK(void) vmmR3FatalDumpInfoHlp_pfnPrintfV(PCDBGFINFOHLP pHlp, const char *pszFormat, va_list args)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync PVMMR3FATALDUMPINFOHLP pMyHlp = (PVMMR3FATALDUMPINFOHLP)pHlp;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTLogLoggerV(pMyHlp->pRelLogger, pszFormat, args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync size_t cchLeft = sizeof(pMyHlp->szSummary) - pMyHlp->offSummary;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync size_t cch = RTStrPrintfV(&pMyHlp->szSummary[pMyHlp->offSummary], cchLeft, pszFormat, args);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Initializes the fatal dump output helper.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * @param pHlp The structure to initialize.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsyncstatic void vmmR3FatalDumpInfoHlpInit(PVMMR3FATALDUMPINFOHLP pHlp)
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pHlp->Core.pfnPrintf = vmmR3FatalDumpInfoHlp_pfnPrintf;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->Core.pfnPrintfV = vmmR3FatalDumpInfoHlp_pfnPrintfV;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * The loggers.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fLoggerDestFlags = pHlp->pLogger->fDestFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Check if we need write to stderr.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fStdErr = (!pHlp->pRelLogger || !(pHlp->pRelLogger->fDestFlags & (RTLOGDEST_STDOUT | RTLOGDEST_STDERR)))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && (!pHlp->pLogger || !(pHlp->pLogger->fDestFlags & (RTLOGDEST_STDOUT | RTLOGDEST_STDERR)));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fStdErr = false; /* takes too long to display here */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Init the summary recording.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Deletes the fatal dump output helper.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp The structure to delete.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void vmmR3FatalDumpInfoHlpDelete(PVMMR3FATALDUMPINFOHLP pHlp)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fDestFlags = pHlp->fLoggerDestFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dumps the VM state on a fatal error.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pVM Pointer to the VM.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pVCpu Pointer to the VMCPU.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param rcErr VBox status code.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncVMMR3DECL(void) VMMR3FatalDump(PVM pVM, PVMCPU pVCpu, int rcErr)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Create our output helper and sync it with the log settings.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This helper will be used for all the output.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Release owned locks to make sure other VCPUs can continue in case they were waiting for one. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Guru Meditation %d (%Rrc)\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Continue according to context.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bool fDoneHyper = false;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Hypervisor errors.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fall thru */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Active trap? This is only of partial interest when in hardware
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * assisted virtualization mode, thus the different messages.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrorCode, &uCR2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! TRAP=%02x ERRCD=%RGv CR2=%RGv EIP=%RX32 Type=%d\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP=%RX32 NOTRAP\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! ACTIVE TRAP=%02x ERRCD=%RGv CR2=%RGv PC=%RGr Type=%d (Guest!)\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync u8TrapNo, uErrorCode, uCR2, CPUMGetGuestRIP(pVCpu), enmType);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dump the relevant hypervisor registers and stack.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ( rcErr == VERR_VMM_RING0_ASSERTION /* fInRing3Call has already been cleared here. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the jmpbuf. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! CallRing3JmpBuf:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "SavedEsp=%RHv SavedEbp=%RHv SpResume=%RHv SpCheck=%RHv\n",
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "pvSavedStack=%RHv cbSavedStack=%#x fInRing3Call=%RTbool\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "cbUsedMax=%#x cbUsedAvg=%#x cbUsedTotal=%#llx cUsedTotal=%#llx\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the resume register frame on the stack. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP = (PRTHCUINTPTR)&pVCpu->vmm.s.pbEMTStackR3[ pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP = (PRTHCUINTPTR)&pVCpu->vmm.s.pbEMTStackR3[ pVCpu->vmm.s.CallRing3JmpBufR0.cbSavedStack
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "eax=volatile ebx=%08x ecx=volatile edx=volatile esi=%08x edi=%08x\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "eip=%08x esp=%08x ebp=%08x efl=%08x\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 8, pBP[0], pBP[-4]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "rax=volatile rbx=%016RX64 rcx=volatile rdx=volatile\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "rsi=%016RX64 rdi=%016RX64 r8=volatile r9=volatile \n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "r10=volatile r11=volatile r12=%016RX64 r13=%016RX64\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "r14=%016RX64 r15=%016RX64\n"
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "rip=%016RX64 rsp=%016RX64 rbp=%016RX64 rfl=%08RX64\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 16, pBP[0], pBP[-8]);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "rax=volatile rbx=%016RX64 rcx=volatile rdx=volatile\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "rsi=volatile rdi=volatile r8=volatile r9=volatile \n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "r10=volatile r11=volatile r12=%016RX64 r13=%016RX64\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "r14=%016RX64 r15=%016RX64\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "rip=%016RX64 rsp=%016RX64 rbp=%016RX64 rflags=%08RX64\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 16, pBP[0], pBP[-6]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Callstack. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.FlatPtr = pc.off = pVCpu->vmm.s.CallRing3JmpBufR0.rip;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.FlatPtr = pc.off = pVCpu->vmm.s.CallRing3JmpBufR0.eip;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync ebp.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync ebp.FlatPtr = ebp.off = pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync esp.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync esp.FlatPtr = esp.off = pVCpu->vmm.s.CallRing3JmpBufR0.SavedEsp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3StackWalkBeginEx(pVM->pUVM, pVCpu->idCpu, DBGFCODETYPE_RING0, &ebp, &esp, &pc,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Call Stack:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n");
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pHlp->pfnPrintf(pHlp, "RBP Ret RBP Ret RIP RIP Symbol [line]\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%RHv %RHv %04RX32:%RHv %RHv %RHv %RHv %RHv",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %RTsel:%08RHv", pFrame->AddrPC.Sel, pFrame->AddrPC.off);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "%RHv %RHv %RHv %RHv",
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " %s+%llx", pFrame->pSymPC->szName, (int64_t)offDisp);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync else if (offDisp < 0)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " %s-%llx", pFrame->pSymPC->szName, -(int64_t)offDisp);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " %s", pFrame->pSymPC->szName);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* raw stack */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! Raw stack (mind the direction). \n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! pbEMTStackR0=%RHv pbEMTStackBottomR0=%RHv VMM_STACK_SIZE=%#x\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! pbEmtStackR3=%p\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%.*Rhxd\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync MMHyperCCToR0(pVM, pVCpu->vmm.s.pbEMTStackR3) + VMM_STACK_SIZE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Skipping ring-0 registers and stack, rcErr=%Rrc\n", rcErr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Try figure out where eip is.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* core code? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (uEIP - (RTGCUINTPTR)pVM->vmm.s.pvCoreCodeRC < pVM->vmm.s.cbCoreCode)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP is in CoreCode, offset %#x\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szNearSym1[0], sizeof(szNearSym1), &RCPtrNearSym1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szNearSym2[0], sizeof(szNearSym2), &RCPtrNearSym2);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "!! EIP in %s (%RRv) at rva %x near symbols:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! %RRv rva %RRv off %08x %s\n"
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "!! %RRv rva %RRv off -%08x %s\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RCPtrNearSym1, RCPtrNearSym1 - RCPtrMod, (unsigned)(uEIP - RCPtrNearSym1), szNearSym1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RCPtrNearSym2, RCPtrNearSym2 - RCPtrMod, (unsigned)(RCPtrNearSym2 - uEIP), szNearSym2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP is not in any code known to VMM!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Disassemble the instruction. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3DisasInstrEx(pVM->pUVM, pVCpu->idCpu, 0, 0,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGF_DISAS_FLAGS_CURRENT_HYPER | DBGF_DISAS_FLAGS_DEFAULT_MODE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the hypervisor cpu state. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3Info(pVM->pUVM, "cpumhyper", "verbose", pHlp);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* Callstack. */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync rc2 = DBGFR3StackWalkBegin(pVM->pUVM, pVCpu->idCpu, DBGFCODETYPE_HYPER, &pFirstFrame);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Call Stack:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %RTsel:%08RGv", pFrame->AddrPC.Sel, pFrame->AddrPC.off);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %s+%llx", pFrame->pSymPC->szName, (int64_t)offDisp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (offDisp < 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %s-%llx", pFrame->pSymPC->szName, -(int64_t)offDisp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %s", pFrame->pSymPC->szName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* raw stack */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! Raw stack (mind the direction). pbEMTStackRC=%RRv pbEMTStackBottomRC=%RRv\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%.*Rhxd\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.pbEMTStackRC, pVCpu->vmm.s.pbEMTStackBottomRC,
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync } /* !HMIsEnabled */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync DBGFR3Info(pVM->pUVM, "cpumguestinstr", NULL, pHlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync } /* switch (rcErr) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Generic info dumper loop.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync static struct
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszInfo;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszArgs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fDoneHyper && !strcmp(aInfo[i].pszInfo, "cpumhyper"))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! {%s, %s}\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFR3Info(pVM->pUVM, aInfo[i].pszInfo, aInfo[i].pszArgs, pHlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* All other info items */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "mappings|hma|cpum|cpumguest|cpumguestinstr|cpumhyper|cpumhost|mode|cpuid"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "|pgmpd|pgmcr3|timers|activetimers|handlers|help",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! {%s}\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Repeat the summary to stderr so we don't have to scroll half a mile up.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Delete the output instance (flushing and restoring of flags).