MachineDebuggerImpl.cpp revision ebb971f52a832dafea0ea4e17f6b0f48776dfb8c
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/* $Id$ */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @file
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox COM class implementation
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (C) 2006-2008 Sun Microsystems, Inc.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * available from http://www.virtualbox.org. This file is free software;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * General Public License (GPL) as published by the Free Software
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * additional information or have any questions.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "MachineDebuggerImpl.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "ConsoleImpl.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include "Logging.h"
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/em.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/patm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/csam.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/vm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/tm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/err.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <VBox/hwaccm.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// defines
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/////////////////////////////////////////////////////////////////////////////
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// globals
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/////////////////////////////////////////////////////////////////////////////
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// constructor / destructor
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/////////////////////////////////////////////////////////////////////////////
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncDEFINE_EMPTY_CTOR_DTOR (MachineDebugger)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncHRESULT MachineDebugger::FinalConstruct()
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync unconst (mParent) = NULL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncvoid MachineDebugger::FinalRelease()
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uninit();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// public initializer/uninitializer for internal purposes only
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/////////////////////////////////////////////////////////////////////////////
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Initializes the machine debugger object.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM result indicator
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aParent handle of our parent object
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncHRESULT MachineDebugger::init (Console *aParent)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("aParent=%p\n", aParent));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync ComAssertRet (aParent, E_INVALIDARG);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Enclose the state transition NotReady->InInit->Ready */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoInitSpan autoInitSpan (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertReturn (autoInitSpan.isOk(), E_FAIL);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync unconst (mParent) = aParent;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mSinglestepQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mRecompileUserQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mRecompileSupervisorQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mPatmEnabledQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mCsamEnabledQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mLogEnabledQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mVirtualTimeRateQueued = ~0;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mFlushMode = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Confirm a successful initialization */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync autoInitSpan.setSucceeded();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Uninitializes the instance and sets the ready flag to FALSE.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncvoid MachineDebugger::uninit()
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("\n"));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /* Enclose the state transition Ready->InUninit->NotReady */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoUninitSpan autoUninitSpan (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (autoUninitSpan.uninitDone())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync unconst (mParent).setNull();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mFlushMode = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync// IMachineDebugger properties
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/////////////////////////////////////////////////////////////////////////////
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current singlestepping flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(Singlestep) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_NOTIMPL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets the singlestepping flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnable new singlestepping flag
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(Singlestep) (BOOL aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_NOTIMPL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current recompile user mode code flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(RecompileUser) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = !EMIsRawRing3Enabled (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets the recompile user mode code flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnable new user mode code recompile flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(RecompileUser) (BOOL aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("enable=%d\n", aEnable));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mRecompileUserQueued = aEnable;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PVMREQ pReq;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync EMRAWMODE rawModeFlag = aEnable ? EMRAW_RING3_DISABLE : EMRAW_RING3_ENABLE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rcVBox = VMR3ReqCall (pVM, VMREQDEST_ANY, &pReq, RT_INDEFINITE_WAIT,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync (PFNRT)EMR3RawSetMode, 2, pVM.raw(), rawModeFlag);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS (rcVBox))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rcVBox = pReq->iStatus;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VMR3ReqFree (pReq);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS (rcVBox))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgFailed (("Could not set raw mode flags to %d, rcVBox = %Rrc\n",
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rawModeFlag, rcVBox));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_FAIL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current recompile supervisor code flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(RecompileSupervisor) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = !EMIsRawRing0Enabled (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets the new recompile supervisor code flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnable new recompile supervisor code flag
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(RecompileSupervisor) (BOOL aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("enable=%d\n", aEnable));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mRecompileSupervisorQueued = aEnable;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PVMREQ pReq;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync EMRAWMODE rawModeFlag = aEnable ? EMRAW_RING0_DISABLE : EMRAW_RING0_ENABLE;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int rcVBox = VMR3ReqCall (pVM, VMREQDEST_ANY, &pReq, RT_INDEFINITE_WAIT,
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync (PFNRT)EMR3RawSetMode, 2, pVM.raw(), rawModeFlag);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS (rcVBox))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rcVBox = pReq->iStatus;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync VMR3ReqFree (pReq);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_SUCCESS (rcVBox))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgFailed (("Could not set raw mode flags to %d, rcVBox = %Rrc\n",
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync rawModeFlag, rcVBox));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_FAIL;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current patch manager enabled flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(PATMEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = PATMIsEnabled (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Set the new patch manager enabled flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnable new patch manager enabled flag
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(PATMEnabled) (BOOL aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("enable=%d\n", aEnable));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mPatmEnabledQueued = aEnable;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PATMR3AllowPatching (pVM, aEnable);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Set the new patch manager enabled flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param new patch manager enabled flag
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::InjectNMI()
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc ((""));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync HWACCMR3InjectNMI(pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current code scanner enabled flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(CSAMEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = CSAMIsEnabled (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Sets the new code scanner enabled flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnable new code scanner enabled flag
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(CSAMEnabled) (BOOL aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("enable=%d\n", aEnable));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mCsamEnabledQueued = aEnable;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int vrc;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (aEnable)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vrc = CSAMEnableScanning (pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync vrc = CSAMDisableScanning (pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_FAILURE (vrc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo handle error case */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the log enabled / disabled status.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(LogEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef LOG_ENABLED
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync const PRTLOGGER pLogInstance = RTLogDefaultInstance();
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = pLogInstance && !(pLogInstance->fFlags & RTLOGFLAGS_DISABLED);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Enables or disables logging.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled The new code log state.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(LogEnabled) (BOOL aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync LogFlowThisFunc (("aEnabled=%d\n", aEnabled));
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mLogEnabledQueued = aEnabled;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifdef LOG_ENABLED
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int vrc = DBGFR3LogModifyFlags (pVM, aEnabled ? "enabled" : "disabled");
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_FAILURE (vrc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo handle error code. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#endif
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current hardware virtualization flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(HWVirtExEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = HWACCMIsEnabled (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current nested paging flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(HWVirtExNestedPagingEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = HWACCMR3IsNestedPagingActive (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current VPID flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(HWVirtExVPIDEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = HWACCMR3IsVPIDActive (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current PAE flag.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aEnabled address of result variable
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(PAEEnabled) (BOOL *aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aEnabled)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync uint64_t cr4 = CPUMGetGuestCR4 (pVM.raw());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = !!(cr4 & X86_CR4_PAE);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aEnabled = false;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current virtual time rate.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aPct Where to store the rate.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMGETTER(VirtualTimeRate) (ULONG *aPct)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!aPct)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_POINTER;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoReadLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtrQuiet pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (pVM.isOk())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aPct = TMVirtualGetWarpDrive (pVM);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync else
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *aPct = 100;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Returns the current virtual time rate.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @returns COM status code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param aPct Where to store the rate.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsyncSTDMETHODIMP MachineDebugger::COMSETTER(VirtualTimeRate) (ULONG aPct)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync{
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (aPct < 2 || aPct > 20000)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return E_INVALIDARG;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoCaller autoCaller (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (autoCaller.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AutoWriteLock alock (this);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (queueSettings())
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync // queue the request
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync mVirtualTimeRateQueued = aPct;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Console::SafeVMPtr pVM (mParent);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CheckComRCReturnRC (pVM.rc());
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync int vrc = TMVirtualSetWarpDrive (pVM, aPct);
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (RT_FAILURE (vrc))
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync {
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync /** @todo handle error code. */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync }
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync return S_OK;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync}
/**
* Hack for getting the VM handle.
* This is only temporary (promise) while prototyping the debugger.
*
* @returns COM status code
* @param aVm Where to store the vm handle.
* Since there is no uintptr_t in COM, we're using the max integer.
* (No, ULONG is not pointer sized!)
*/
STDMETHODIMP MachineDebugger::COMGETTER(VM) (ULONG64 *aVm)
{
if (!aVm)
return E_POINTER;
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
AutoReadLock alock (this);
Console::SafeVMPtr pVM (mParent);
CheckComRCReturnRC (pVM.rc());
*aVm = (uintptr_t)pVM.raw();
/*
* Note: pVM protection provided by SafeVMPtr is no more effective
* after we return from this method.
*/
return S_OK;
}
// IMachineDebugger methods
/////////////////////////////////////////////////////////////////////////////
/**
* Resets VM statistics.
*
* @returns COM status code.
* @param aPattern The selection pattern. A bit similar to filename globbing.
*/
STDMETHODIMP MachineDebugger::ResetStats (INPTR BSTR aPattern)
{
Console::SafeVMPtrQuiet pVM (mParent);
if (pVM.isOk())
STAMR3Reset (pVM, Utf8Str (aPattern).raw());
return S_OK;
}
/**
* Dumps VM statistics to the log.
*
* @returns COM status code.
* @param aPattern The selection pattern. A bit similar to filename globbing.
*/
STDMETHODIMP MachineDebugger::DumpStats (INPTR BSTR aPattern)
{
Console::SafeVMPtrQuiet pVM (mParent);
if (pVM.isOk())
STAMR3Dump (pVM, Utf8Str (aPattern).raw());
return S_OK;
}
/**
* Get the VM statistics in an XML format.
*
* @returns COM status code.
* @param aPattern The selection pattern. A bit similar to filename globbing.
* @param aWithDescriptions Whether to include the descriptions.
* @param aStats The XML document containing the statistics.
*/
STDMETHODIMP MachineDebugger::GetStats (INPTR BSTR aPattern, BOOL aWithDescriptions, BSTR *aStats)
{
Console::SafeVMPtrQuiet pVM (mParent);
if (!pVM.isOk())
return E_FAIL;
char *pszSnapshot;
int vrc = STAMR3Snapshot (pVM, Utf8Str (aPattern).raw(), &pszSnapshot, NULL,
!!aWithDescriptions);
if (RT_FAILURE (vrc))
return vrc == VERR_NO_MEMORY ? E_OUTOFMEMORY : E_FAIL;
/** @todo this is horribly inefficient! And it's kinda difficult to tell whether it failed...
* Must use UTF-8 or ASCII here and completely avoid these two extra copy operations.
* Until that's done, this method is kind of useless for debugger statistics GUI because
* of the amount statistics in a debug build. */
Bstr (pszSnapshot).cloneTo (aStats);
return S_OK;
}
// public methods only for internal purposes
/////////////////////////////////////////////////////////////////////////////
void MachineDebugger::flushQueuedSettings()
{
mFlushMode = true;
if (mSinglestepQueued != ~0)
{
COMSETTER(Singlestep) (mSinglestepQueued);
mSinglestepQueued = ~0;
}
if (mRecompileUserQueued != ~0)
{
COMSETTER(RecompileUser) (mRecompileUserQueued);
mRecompileUserQueued = ~0;
}
if (mRecompileSupervisorQueued != ~0)
{
COMSETTER(RecompileSupervisor) (mRecompileSupervisorQueued);
mRecompileSupervisorQueued = ~0;
}
if (mPatmEnabledQueued != ~0)
{
COMSETTER(PATMEnabled) (mPatmEnabledQueued);
mPatmEnabledQueued = ~0;
}
if (mCsamEnabledQueued != ~0)
{
COMSETTER(CSAMEnabled) (mCsamEnabledQueued);
mCsamEnabledQueued = ~0;
}
if (mLogEnabledQueued != ~0)
{
COMSETTER(LogEnabled) (mLogEnabledQueued);
mLogEnabledQueued = ~0;
}
if (mVirtualTimeRateQueued != ~(uint32_t)0)
{
COMSETTER(VirtualTimeRate) (mVirtualTimeRateQueued);
mVirtualTimeRateQueued = ~0;
}
mFlushMode = false;
}
// private methods
/////////////////////////////////////////////////////////////////////////////
bool MachineDebugger::queueSettings() const
{
if (!mFlushMode)
{
// check if the machine is running
MachineState_T machineState;
mParent->COMGETTER(State) (&machineState);
if ( machineState != MachineState_Running
&& machineState != MachineState_Paused
&& machineState != MachineState_Stuck)
// queue the request
return true;
}
return false;
}