VMMGuruMeditation.cpp revision 98427c0ab08697e468c26dc33ee9571308577867
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* $Id$ */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** @file
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VMM - The Virtual Machine Monitor, Guru Meditation Code.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Copyright (C) 2006-2010 Oracle Corporation
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
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
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*******************************************************************************
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync* Header Files *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync*******************************************************************************/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define LOG_GROUP LOG_GROUP_VMM
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/vmm.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/pdmapi.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/pdmcritsect.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/trpm.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/dbgf.h>
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#include "VMMInternal.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/vm.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/mm.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/iom.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/vmm/em.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/err.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#include <VBox/param.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#include <VBox/version.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#include <VBox/vmm/hm.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#include <iprt/assert.h>
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync#include <iprt/time.h>
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#include <iprt/stream.h>
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#include <iprt/string.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/stdarg.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync/*******************************************************************************
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync* Structures and Typedefs *
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync*******************************************************************************/
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync/**
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync * Structure to pass to DBGFR3Info() and for doing all other
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync * output during fatal dump.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e4dec40ee9c070be42661febd9ae047056007ec5vboxsynctypedef struct VMMR3FATALDUMPINFOHLP
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync /** The helper core. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFINFOHLP Core;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** The release logger instance. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync PRTLOGGER pRelLogger;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync /** The saved release logger flags. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync uint32_t fRelLoggerFlags;
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync /** The logger instance. */
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync PRTLOGGER pLogger;
553fe7e9c0f2700c19c346eec835ee7f29e2f89evboxsync /** The saved logger flags. */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync uint32_t fLoggerFlags;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync /** The saved logger destination flags. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t fLoggerDestFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Whether to output to stderr or not. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bool fStdErr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Whether we're still recording the summary or not. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bool fRecSummary;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** Buffer for the summary. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char szSummary[4096-2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /** The current summary offset. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size_t offSummary;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} VMMR3FATALDUMPINFOHLP, *PVMMR3FATALDUMPINFOHLP;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** Pointer to a VMMR3FATALDUMPINFOHLP structure. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef const VMMR3FATALDUMPINFOHLP *PCVMMR3FATALDUMPINFOHLP;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Print formatted string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp Pointer to this structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pszFormat The format string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param ... Arguments.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic DECLCALLBACK(void) vmmR3FatalDumpInfoHlp_pfnPrintf(PCDBGFINFOHLP pHlp, const char *pszFormat, ...)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync va_list args;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync va_start(args, pszFormat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintfV(pHlp, pszFormat, args);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync va_end(args);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync/**
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * Print formatted string.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp Pointer to this structure.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pszFormat The format string.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * @param args Argument list.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic DECLCALLBACK(void) vmmR3FatalDumpInfoHlp_pfnPrintfV(PCDBGFINFOHLP pHlp, const char *pszFormat, va_list args)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync PVMMR3FATALDUMPINFOHLP pMyHlp = (PVMMR3FATALDUMPINFOHLP)pHlp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pMyHlp->pRelLogger)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_list args2;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_copy(args2, args);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTLogLoggerV(pMyHlp->pRelLogger, pszFormat, args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_end(args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync if (pMyHlp->pLogger)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_list args2;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_copy(args2, args);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTLogLoggerV(pMyHlp->pLogger, pszFormat, args);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync va_end(args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pMyHlp->fStdErr)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_list args2;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_copy(args2, args);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTStrmPrintfV(g_pStdErr, pszFormat, args);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync va_end(args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pMyHlp->fRecSummary)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync size_t cchLeft = sizeof(pMyHlp->szSummary) - pMyHlp->offSummary;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (cchLeft > 1)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_list args2;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_copy(args2, args);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync size_t cch = RTStrPrintfV(&pMyHlp->szSummary[pMyHlp->offSummary], cchLeft, pszFormat, args);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync va_end(args2);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync Assert(cch <= cchLeft);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pMyHlp->offSummary += cch;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync}
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Initializes the fatal dump output helper.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync *
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * @param pHlp The structure to initialize.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsyncstatic void vmmR3FatalDumpInfoHlpInit(PVMMR3FATALDUMPINFOHLP pHlp)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync{
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RT_BZERO(pHlp, sizeof(*pHlp));
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pHlp->Core.pfnPrintf = vmmR3FatalDumpInfoHlp_pfnPrintf;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->Core.pfnPrintfV = vmmR3FatalDumpInfoHlp_pfnPrintfV;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /*
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync * The loggers.
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pRelLogger = RTLogRelDefaultInstance();
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#ifdef LOG_ENABLED
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pLogger = RTLogDefaultInstance();
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#else
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pHlp->pRelLogger)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pLogger = RTLogGetDefaultInstance();
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync else
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pLogger = RTLogDefaultInstance();
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync if (pHlp->pRelLogger)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->fRelLoggerFlags = pHlp->pRelLogger->fFlags;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pRelLogger->fFlags &= ~RTLOGFLAGS_DISABLED;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pRelLogger->fFlags |= RTLOGFLAGS_BUFFERED;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pHlp->pLogger)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fLoggerFlags = pHlp->pLogger->fFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fLoggerDestFlags = pHlp->pLogger->fDestFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fFlags &= ~RTLOGFLAGS_DISABLED;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fFlags |= RTLOGFLAGS_BUFFERED;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifndef DEBUG_sandervl
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fDestFlags |= RTLOGDEST_DEBUGGER;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Check if we need write to stderr.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fStdErr = (!pHlp->pRelLogger || !(pHlp->pRelLogger->fDestFlags & (RTLOGDEST_STDOUT | RTLOGDEST_STDERR)))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync && (!pHlp->pLogger || !(pHlp->pLogger->fDestFlags & (RTLOGDEST_STDOUT | RTLOGDEST_STDERR)));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef DEBUG_sandervl
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fStdErr = false; /* takes too long to display here */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Init the summary recording.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->fRecSummary = true;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->offSummary = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->szSummary[0] = '\0';
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Deletes the fatal dump output helper.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pHlp The structure to delete.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void vmmR3FatalDumpInfoHlpDelete(PVMMR3FATALDUMPINFOHLP pHlp)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pHlp->pRelLogger)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTLogFlush(pHlp->pRelLogger);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pRelLogger->fFlags = pHlp->fRelLoggerFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pHlp->pLogger)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTLogFlush(pHlp->pLogger);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fFlags = pHlp->fLoggerFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pLogger->fDestFlags = pHlp->fLoggerDestFlags;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dumps the VM state on a fatal error.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pVM Pointer to the VM.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param pVCpu Pointer to the VMCPU.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * @param rcErr VBox status code.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncVMMR3DECL(void) VMMR3FatalDump(PVM pVM, PVMCPU pVCpu, int rcErr)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Create our output helper and sync it with the log settings.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This helper will be used for all the output.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync VMMR3FATALDUMPINFOHLP Hlp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PCDBGFINFOHLP pHlp = &Hlp.Core;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync vmmR3FatalDumpInfoHlpInit(&Hlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Release owned locks to make sure other VCPUs can continue in case they were waiting for one. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PDMR3CritSectLeaveAll(pVM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Header.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Guru Meditation %d (%Rrc)\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rcErr, rcErr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Continue according to context.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bool fDoneHyper = false;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (rcErr)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Hypervisor errors.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VERR_VMM_RING0_ASSERTION:
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync case VINF_EM_DBG_HYPER_ASSERTION:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VERR_VMM_RING3_CALL_DISABLED:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszMsg1 = VMMR3GetRZAssertMsg1(pVM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync while (pszMsg1 && *pszMsg1 == '\n')
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pszMsg1++;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszMsg2 = VMMR3GetRZAssertMsg2(pVM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync while (pszMsg2 && *pszMsg2 == '\n')
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pszMsg2++;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%s"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%s",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pszMsg1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pszMsg2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ( !pszMsg2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync || !*pszMsg2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync || strchr(pszMsg2, '\0')[-1] != '\n')
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, "\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fall thru */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VERR_TRPM_DONT_PANIC:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VERR_TRPM_PANIC:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VINF_EM_RAW_STALE_SELECTOR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VINF_EM_RAW_IRET_TRAP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VINF_EM_DBG_HYPER_BREAKPOINT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VINF_EM_DBG_HYPER_STEPPED:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case VERR_VMM_HYPER_CR3_MISMATCH:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Active trap? This is only of partial interest when in hardware
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * assisted virtualization mode, thus the different messages.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t uEIP = CPUMGetHyperEIP(pVCpu);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync TRPMEVENT enmType;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint8_t u8TrapNo = 0xce;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTGCUINT uErrorCode = 0xdeadface;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTGCUINTPTR uCR2 = 0xdeadface;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrorCode, &uCR2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!HMIsEnabled(pVM))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_SUCCESS(rc2))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! TRAP=%02x ERRCD=%RGv CR2=%RGv EIP=%RX32 Type=%d\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync u8TrapNo, uErrorCode, uCR2, uEIP, enmType);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP=%RX32 NOTRAP\n",
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync uEIP);
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (RT_SUCCESS(rc2))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! ACTIVE TRAP=%02x ERRCD=%RGv CR2=%RGv PC=%RGr Type=%d (Guest!)\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync u8TrapNo, uErrorCode, uCR2, CPUMGetGuestRIP(pVCpu), enmType);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Dump the relevant hypervisor registers and stack.
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (HMIsEnabled(pVM))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ( rcErr == VERR_VMM_RING0_ASSERTION /* fInRing3Call has already been cleared here. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync || pVCpu->vmm.s.CallRing3JmpBufR0.fInRing3Call)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the jmpbuf. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! CallRing3JmpBuf:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "SavedEsp=%RHv SavedEbp=%RHv SpResume=%RHv SpCheck=%RHv\n",
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pVCpu->vmm.s.CallRing3JmpBufR0.SavedEsp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.SpResume,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.SpCheck);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pHlp->pfnPrintf(pHlp,
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync "pvSavedStack=%RHv cbSavedStack=%#x fInRing3Call=%RTbool\n",
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.pvSavedStack,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.cbSavedStack,
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.fInRing3Call);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "cbUsedMax=%#x cbUsedAvg=%#x cbUsedTotal=%#llx cUsedTotal=%#llx\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.cbUsedMax,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.cbUsedAvg,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.CallRing3JmpBufR0.cbUsedTotal,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pVCpu->vmm.s.CallRing3JmpBufR0.cUsedTotal);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the resume register frame on the stack. */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync PRTHCUINTPTR pBP;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef VMM_R0_SWITCH_STACK
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP = (PRTHCUINTPTR)&pVCpu->vmm.s.pbEMTStackR3[ pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync - MMHyperCCToR0(pVM, pVCpu->vmm.s.pbEMTStackR3)];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP = (PRTHCUINTPTR)&pVCpu->vmm.s.pbEMTStackR3[ pVCpu->vmm.s.CallRing3JmpBufR0.cbSavedStack
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync - pVCpu->vmm.s.CallRing3JmpBufR0.SpCheck
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync + pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp];
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#endif
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync#if HC_ARCH_BITS == 32
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
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 ,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[-3], pBP[-2], pBP[-1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 8, pBP[0], pBP[-4]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#else
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync# ifdef RT_OS_WINDOWS
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
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"
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync ,
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pBP[-7],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[-6], pBP[-5],
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pBP[-4], pBP[-3],
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pBP[-2], pBP[-1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 16, pBP[0], pBP[-8]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
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 ,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[-5],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[-4], pBP[-3],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[-2], pBP[-1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBP[1], pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp - 16, pBP[0], pBP[-6]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Callstack. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFADDRESS pc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if HC_ARCH_BITS == 64
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.FlatPtr = pc.off = pVCpu->vmm.s.CallRing3JmpBufR0.rip;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pc.FlatPtr = pc.off = pVCpu->vmm.s.CallRing3JmpBufR0.eip;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync pc.Sel = DBGF_SEL_FLAT;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync DBGFADDRESS ebp;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync ebp.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync ebp.FlatPtr = ebp.off = pVCpu->vmm.s.CallRing3JmpBufR0.SavedEbp;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync ebp.Sel = DBGF_SEL_FLAT;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync DBGFADDRESS esp;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync esp.fFlags = DBGFADDRESS_FLAGS_RING0 | DBGFADDRESS_FLAGS_VALID;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync esp.Sel = DBGF_SEL_FLAT;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync esp.FlatPtr = esp.off = pVCpu->vmm.s.CallRing3JmpBufR0.SavedEsp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PCDBGFSTACKFRAME pFirstFrame;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3StackWalkBeginEx(pVM->pUVM, pVCpu->idCpu, DBGFCODETYPE_RING0, &ebp, &esp, &pc,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFRETURNTYPE_INVALID, &pFirstFrame);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_SUCCESS(rc2))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Call Stack:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if HC_ARCH_BITS == 32
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n");
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync#else
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pHlp->pfnPrintf(pHlp, "RBP Ret RBP Ret RIP RIP Symbol [line]\n");
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync#endif
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync for (PCDBGFSTACKFRAME pFrame = pFirstFrame;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pFrame;
aeb7d3465f6e399a9719a21364e9a483302102dfvboxsync pFrame = DBGFR3StackWalkNext(pFrame))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if HC_ARCH_BITS == 32
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%RHv %RHv %04RX32:%RHv %RHv %RHv %RHv %RHv",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrFrame.off,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrReturnFrame.off,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrReturnPC.Sel,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrReturnPC.off,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[0],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[2],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %RTsel:%08RHv", pFrame->AddrPC.Sel, pFrame->AddrPC.off);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "%RHv %RHv %RHv %RHv",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrFrame.off,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (RTHCUINTPTR)pFrame->AddrReturnFrame.off,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync (RTHCUINTPTR)pFrame->AddrReturnPC.off,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync (RTHCUINTPTR)pFrame->AddrPC.off);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync#endif
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pFrame->pSymPC)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (offDisp > 0)
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 else
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " %s", pFrame->pSymPC->szName);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (pFrame->pLinePC)
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp, "\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync DBGFR3StackWalkEnd(pFirstFrame);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* raw stack */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync Hlp.fRecSummary = false;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!!\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! Raw stack (mind the direction). \n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! pbEMTStackR0=%RHv pbEMTStackBottomR0=%RHv VMM_STACK_SIZE=%#x\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! pbEmtStackR3=%p\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%.*Rhxd\n",
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync MMHyperCCToR0(pVM, pVCpu->vmm.s.pbEMTStackR3),
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync MMHyperCCToR0(pVM, pVCpu->vmm.s.pbEMTStackR3) + VMM_STACK_SIZE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync VMM_STACK_SIZE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.pbEMTStackR3,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync VMM_STACK_SIZE, pVCpu->vmm.s.pbEMTStackR3);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Skipping ring-0 registers and stack, rcErr=%Rrc\n", rcErr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Try figure out where eip is.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* core code? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (uEIP - (RTGCUINTPTR)pVM->vmm.s.pvCoreCodeRC < pVM->vmm.s.cbCoreCode)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP is in CoreCode, offset %#x\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uEIP - (RTGCUINTPTR)pVM->vmm.s.pvCoreCodeRC);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { /* ask PDM */ /** @todo ask DBGFR3Sym later? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char szModName[64];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTRCPTR RCPtrMod;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char szNearSym1[260];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTRCPTR RCPtrNearSym1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char szNearSym2[260];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTRCPTR RCPtrNearSym2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int rc = PDMR3LdrQueryRCModFromPC(pVM, uEIP,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szModName[0], sizeof(szModName), &RCPtrMod,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szNearSym1[0], sizeof(szNearSym1), &RCPtrNearSym1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szNearSym2[0], sizeof(szNearSym2), &RCPtrNearSym2);
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync if (RT_SUCCESS(rc))
e4dec40ee9c070be42661febd9ae047056007ec5vboxsync pHlp->pfnPrintf(pHlp,
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",
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync szModName, RCPtrMod, (unsigned)(uEIP - RCPtrMod),
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RCPtrNearSym1, RCPtrNearSym1 - RCPtrMod, (unsigned)(uEIP - RCPtrNearSym1), szNearSym1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RCPtrNearSym2, RCPtrNearSym2 - RCPtrMod, (unsigned)(RCPtrNearSym2 - uEIP), szNearSym2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! EIP is not in any code known to VMM!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Disassemble the instruction. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char szInstr[256];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3DisasInstrEx(pVM->pUVM, pVCpu->idCpu, 0, 0,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGF_DISAS_FLAGS_CURRENT_HYPER | DBGF_DISAS_FLAGS_DEFAULT_MODE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync &szInstr[0], sizeof(szInstr), NULL);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (RT_SUCCESS(rc2))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! %s\n", szInstr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Dump the hypervisor cpu state. */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc2 = DBGFR3Info(pVM->pUVM, "cpumhyper", "verbose", pHlp);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync fDoneHyper = true;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* Callstack. */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync PCDBGFSTACKFRAME pFirstFrame;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync rc2 = DBGFR3StackWalkBegin(pVM->pUVM, pVCpu->idCpu, DBGFCODETYPE_HYPER, &pFirstFrame);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync if (RT_SUCCESS(rc2))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! Call Stack:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (PCDBGFSTACKFRAME pFrame = pFirstFrame;
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync pFrame;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pFrame = DBGFR3StackWalkNext(pFrame))
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32",
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync (uint32_t)pFrame->AddrFrame.off,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync (uint32_t)pFrame->AddrReturnFrame.off,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync (uint32_t)pFrame->AddrReturnPC.Sel,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (uint32_t)pFrame->AddrReturnPC.off,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[0],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[1],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[2],
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pFrame->Args.au32[3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %RTsel:%08RGv", pFrame->AddrPC.Sel, pFrame->AddrPC.off);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pFrame->pSymPC)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (offDisp > 0)
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 else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " %s", pFrame->pSymPC->szName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pFrame->pLinePC)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp, "\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFR3StackWalkEnd(pFirstFrame);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* raw stack */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync Hlp.fRecSummary = false;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync pHlp->pfnPrintf(pHlp,
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!!\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!! Raw stack (mind the direction). pbEMTStackRC=%RRv pbEMTStackBottomRC=%RRv\n"
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%.*Rhxd\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pVCpu->vmm.s.pbEMTStackRC, pVCpu->vmm.s.pbEMTStackBottomRC,
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync VMM_STACK_SIZE, pVCpu->vmm.s.pbEMTStackR3);
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync } /* !HMIsEnabled */
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync break;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync }
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync case VERR_IEM_INSTR_NOT_IMPLEMENTED:
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync case VERR_IEM_ASPECT_NOT_IMPLEMENTED:
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync {
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync DBGFR3Info(pVM->pUVM, "cpumguest", NULL, pHlp);
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync DBGFR3Info(pVM->pUVM, "cpumguestinstr", NULL, pHlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync } /* switch (rcErr) */
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync Hlp.fRecSummary = false;
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Generic info dumper loop.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync static struct
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszInfo;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *pszArgs;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync } const aInfo[] =
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
83f490cd5eec4567f8ee5c9e481f9d9c739b3061vboxsync { "mappings", NULL },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "hma", NULL },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "cpumguest", "verbose" },
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync { "cpumguestinstr", "verbose" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "cpumhyper", "verbose" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "cpumhost", "verbose" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "mode", "all" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "cpuid", "verbose" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "handlers", "phys virt hyper stats" },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "timers", NULL },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync { "activetimers", NULL },
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync };
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync for (unsigned i = 0; i < RT_ELEMENTS(aInfo); i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (fDoneHyper && !strcmp(aInfo[i].pszInfo, "cpumhyper"))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync continue;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! {%s, %s}\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync aInfo[i].pszInfo, aInfo[i].pszArgs);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFR3Info(pVM->pUVM, aInfo[i].pszInfo, aInfo[i].pszArgs, pHlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* All other info items */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DBGFR3InfoMulti(pVM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "*",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "mappings|hma|cpum|cpumguest|cpumguestinstr|cpumhyper|cpumhost|mode|cpuid"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "|pgmpd|pgmcr3|timers|activetimers|handlers|help",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!! {%s}\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync /* done */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pHlp->pfnPrintf(pHlp,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Repeat the summary to stderr so we don't have to scroll half a mile up.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (Hlp.szSummary[0])
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RTStrmPrintf(g_pStdErr,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "%s"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync Hlp.szSummary);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Delete the output instance (flushing and restoring of flags).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync vmmR3FatalDumpInfoHlpDelete(&Hlp);
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
fd1325ef1bcafe67ea3535c82bb7c556482d868cvboxsync