dbg.h revision 5ab90d2dec9c6002357732cd078fa62ab5512edf
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @file
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Debugger Interfaces. (VBoxDbg)
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This header covers all external interfaces of the Debugger module.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * However, it does not cover the DBGF interface since that part of the
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * VMM. Use dbgf.h for that.
c58f1213e628a545081c70e26c6b67a841cff880vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/*
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Copyright (C) 2006-2007 Oracle Corporation
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * You may elect to license modified versions of this file under the
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * terms and conditions of either the GPL or the CDDL or both.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#ifndef ___VBox_dbg_h
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define ___VBox_dbg_h
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include <VBox/cdefs.h>
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include <VBox/types.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <VBox/vmm/dbgf.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#include <iprt/stdarg.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#ifdef IN_RING3
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync# include <iprt/err.h>
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsyncRT_C_DECLS_BEGIN
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @def VBOX_WITH_DEBUGGER
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * The build is with debugger module. Test if this is defined before registering
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * external debugger commands. This is normally defined in Config.kmk.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#ifdef DOXYGEN_RUNNING
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync# define VBOX_WITH_DEBUGGER
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#endif
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * DBGC variable category.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Used to describe an argument to a command or function and a functions
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * return value.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef enum DBGCVARCAT
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Any type is fine. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_ANY = 0,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Any kind of pointer or number. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_POINTER_NUMBER,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Any kind of pointer or number, no range. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_POINTER_NUMBER_NO_RANGE,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Any kind of pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_POINTER,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Any kind of pointer with no range option. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_POINTER_NO_RANGE,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** GC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_GC_POINTER,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** GC pointer with no range option. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_GC_POINTER_NO_RANGE,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Numeric argument. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_NUMBER,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Numeric argument with no range option. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_NUMBER_NO_RANGE,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** String. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_STRING,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Symbol. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_SYMBOL,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Option. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_OPTION,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Option + string. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_CAT_OPTION_STRING,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Option + number. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DBGCVAR_CAT_OPTION_NUMBER
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} DBGCVARCAT;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * DBGC variable type.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef enum DBGCVARTYPE
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** unknown... */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_UNKNOWN = 0,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Flat GC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_GC_FLAT,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Segmented GC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_GC_FAR,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Physical GC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_GC_PHYS,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Flat HC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_HC_FLAT,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Physical HC pointer. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_HC_PHYS,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** String. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_STRING,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Number. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_NUMBER,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Symbol.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @todo drop this */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_SYMBOL,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Special type used when querying symbols. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_TYPE_ANY
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} DBGCVARTYPE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @todo Rename to DBGCVAR_IS_xyz. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Checks if the specified variable type is of a pointer persuasion. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_ISPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_GC_FLAT && enmType <= DBGCVAR_TYPE_HC_PHYS)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Checks if the specified variable type is of a pointer persuasion. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_IS_FAR_PTR(enmType) ((enmType) == DBGCVAR_TYPE_GC_FAR)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Checks if the specified variable type is of a pointer persuasion and of the guest context sort. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_ISGCPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_GC_FLAT && (enmType) <= DBGCVAR_TYPE_GC_PHYS)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Checks if the specified variable type is of a pointer persuasion and of the host context sort. */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync#define DBGCVAR_ISHCPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_HC_FLAT && (enmType) <= DBGCVAR_TYPE_HC_PHYS)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * DBGC variable range type.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsynctypedef enum DBGCVARRANGETYPE
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** No range appliable or no range specified. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_RANGE_NONE = 0,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Number of elements. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_RANGE_ELEMENTS,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Number of bytes. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_RANGE_BYTES
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} DBGCVARRANGETYPE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Variable descriptor.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct DBGCVARDESC
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync /** The minimal number of times this argument may occur.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Use 0 here to inidicate that the argument is optional. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync unsigned cTimesMin;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Maximum number of occurrences.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Use ~0 here to indicate infinite. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync unsigned cTimesMax;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Argument category. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVARCAT enmCategory;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Flags, DBGCVD_FLAGS_* */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync unsigned fFlags;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Argument name. */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync const char *pszName;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Argument name. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszDescription;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} DBGCVARDESC;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to an argument descriptor. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DBGCVARDESC *PDBGCVARDESC;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a const argument descriptor. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef const DBGCVARDESC *PCDBGCVARDESC;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Variable descriptor flags.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @{ */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Indicates that the variable depends on the previous being present. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVD_FLAGS_DEP_PREV RT_BIT(1)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @} */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync/**
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync * DBGC variable.
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsynctypedef struct DBGCVAR
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync{
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Pointer to the argument descriptor. */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync PCDBGCVARDESC pDesc;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Pointer to the next argument. */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync struct DBGCVAR *pNext;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Argument type. */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync DBGCVARTYPE enmType;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Type specific. */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync union
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync {
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Flat GC Address. (DBGCVAR_TYPE_GC_FLAT) */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync RTGCPTR GCFlat;
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync /** Far (16:32) GC Address. (DBGCVAR_TYPE_GC_FAR) */
3ae788d4138a852743619b65c7404deb5cbae3e7vboxsync RTFAR32 GCFar;
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync /** Physical GC Address. (DBGCVAR_TYPE_GC_PHYS) */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync RTGCPHYS GCPhys;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Flat HC Address. (DBGCVAR_TYPE_HC_FLAT) */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync void *pvHCFlat;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Physical GC Address. (DBGCVAR_TYPE_HC_PHYS) */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync RTHCPHYS HCPhys;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** String. (DBGCVAR_TYPE_STRING)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * The basic idea is the the this is a pointer to the expression we're
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * parsing, so no messing with freeing. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync const char *pszString;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Number. (DBGCVAR_TYPE_NUMBER) */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync uint64_t u64Number;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } u;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Range type. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVARRANGETYPE enmRangeType;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Range. The use of the content depends on the enmRangeType. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync uint64_t u64Range;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync} DBGCVAR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a command argument. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DBGCVAR *PDBGCVAR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a const command argument. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef const DBGCVAR *PCDBGCVAR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with defaults.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * The result is an unknown variable type without any range.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT(pVar) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->pDesc = NULL;\
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->pNext = NULL; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_UNKNOWN; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.u64Number = 0; \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync (pVar)->enmRangeType = DBGCVAR_RANGE_NONE; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u64Range = 0; \
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a HC physical address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_HC_PHYS(pVar, Phys) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_HC_PHYS; \
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync (pVar)->u.HCPhys = (Phys); \
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync } while (0)
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a HC flat address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_HC_FLAT(pVar, Flat) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_HC_FLAT; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.pvHCFlat = (Flat); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a GC physical address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_GC_PHYS(pVar, Phys) \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_GC_PHYS; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.GCPhys = (Phys); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a GC flat address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define DBGCVAR_INIT_GC_FLAT(pVar, Flat) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_GC_FLAT; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.GCFlat = (Flat); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a GC flat address.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_GC_FLAT_BYTE_RANGE(pVar, Flat, cbRange) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_GC_FLAT; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.GCFlat = (Flat); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_SET_RANGE(pVar, DBGCVAR_RANGE_BYTES, cbRange); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a GC far address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_GC_FAR(pVar, _sel, _off) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_GC_FAR; \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync (pVar)->u.GCFar.sel = (_sel); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.GCFar.off = (_off); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a number.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_INIT_NUMBER(pVar, Value) \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_INIT(pVar); \
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync (pVar)->enmType = DBGCVAR_TYPE_NUMBER; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.u64Number = (Value); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for initializing a DBGC variable with a string.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define DBGCVAR_INIT_STRING(pVar, a_pszString) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync DBGCVAR_INIT(pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmType = DBGCVAR_TYPE_STRING; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->enmRangeType = DBGCVAR_RANGE_BYTES; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u.pszString = (a_pszString); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u64Range = strlen(a_pszString); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync * Macro for setting the range of a DBGC variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVar The variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param _enmRangeType The range type.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param Value The range length value.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_SET_RANGE(pVar, _enmRangeType, Value) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync (pVar)->enmRangeType = (_enmRangeType); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (pVar)->u64Range = (Value); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for setting the range of a DBGC variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_pVar The variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_cbRange The range, in bytes.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync#define DBGCVAR_SET_BYTE_RANGE(a_pVar, a_cbRange) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DBGCVAR_SET_RANGE(a_pVar, DBGCVAR_RANGE_BYTES, a_cbRange)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for resetting the range a DBGC variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_pVar The variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_ZAP_RANGE(a_pVar) \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync do { \
5b0a093ca572a855886faa6747ad46df859dd041vboxsync (a_pVar)->enmRangeType = DBGCVAR_RANGE_NONE; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync (a_pVar)->u64Range = 0; \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Macro for assigning one DBGC variable to another.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_pResult The result (target) variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param a_pVar The source variable.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync#define DBGCVAR_ASSIGN(a_pResult, a_pVar) \
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync do { \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *(a_pResult) = *(a_pVar); \
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync } while (0)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to command descriptor. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef struct DBGCCMD *PDBGCCMD;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** Pointer to const command descriptor. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef const struct DBGCCMD *PCDBGCCMD;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** Pointer to helper functions for commands. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct DBGCCMDHLP *PDBGCCMDHLP;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Command helper for writing text to the debug console.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pvBuf What to write.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param cbBuf Number of bytes to write.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pcbWritten Where to store the number of bytes actually written.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * If NULL the entire buffer must be successfully written.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPWRITE(PDBGCCMDHLP pCmdHlp, const void *pvBuf, size_t cbBuf, size_t *pcbWritten);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** Pointer to a FNDBGCHLPWRITE() function. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef FNDBGCHLPWRITE *PFNDBGCHLPWRITE;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Command helper for writing formatted text to the debug console.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pcb Where to store the number of bytes written.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pszFormat The format string.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This is using the log formatter, so it's format extensions can be used.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param ... Arguments specified in the format string.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPPRINTF(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, ...);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPPRINTF() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCHLPPRINTF *PFNDBGCHLPPRINTF;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Command helper for writing formatted text to the debug console.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pcb Where to store the number of bytes written.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pszFormat The format string.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * This is using the log formatter, so it's format extensions can be used.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param args Arguments specified in the format string.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPPRINTFV(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, va_list args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPPRINTFV() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCHLPPRINTFV *PFNDBGCHLPPRINTFV;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Command helper for formatting and error message for a VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code appropriate to return from a command.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync * @param rc The VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pszFormat Format string for additional messages. Can be NULL.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param ... Format arguments, optional.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPVBOXERROR(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, ...);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPVBOXERROR() function. */
993a55bd118e0b54549b3f0b380a8fbd6246a040vboxsynctypedef FNDBGCHLPVBOXERROR *PFNDBGCHLPVBOXERROR;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Command helper for formatting and error message for a VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code appropriate to return from a command.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param rc The VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pcb Where to store the number of bytes written.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pszFormat Format string for additional messages. Can be NULL.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param args Format arguments, optional.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPVBOXERRORV(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, va_list args);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPVBOXERRORV() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCHLPVBOXERRORV *PFNDBGCHLPVBOXERRORV;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Command helper for reading memory specified by a DBGC variable.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code appropriate to return from a command.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pVM VM handle if GC or physical HC address.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pvBuffer Where to store the read data.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param cbRead Number of bytes to read.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pVarPointer DBGC variable specifying where to start reading.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pcbRead Where to store the number of bytes actually read.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This optional, but it's useful when read GC virtual memory where a
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * page in the requested range might not be present.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * If not specified not-present failure or end of a HC physical page
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * will cause failure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPMEMREAD(PDBGCCMDHLP pCmdHlp, PVM pVM, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/** Pointer to a FNDBGCHLPMEMREAD() function. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef FNDBGCHLPMEMREAD *PFNDBGCHLPMEMREAD;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Command helper for writing memory specified by a DBGC variable.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code appropriate to return from a command.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVM VM handle if GC or physical HC address.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pvBuffer What to write.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param cbWrite Number of bytes to write.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVarPointer DBGC variable specifying where to start reading.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pcbWritten Where to store the number of bytes written.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This is optional. If NULL be aware that some of the buffer
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * might have been written to the specified address.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPMEMWRITE(PDBGCCMDHLP pCmdHlp, PVM pVM, const void *pvBuffer, size_t cbWrite, PCDBGCVAR pVarPointer, size_t *pcbWritten);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPMEMWRITE() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCHLPMEMWRITE *PFNDBGCHLPMEMWRITE;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Executes command an expression.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * (Hopefully the parser and functions are fully reentrant.)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code appropriate to return from a command.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
993a55bd118e0b54549b3f0b380a8fbd6246a040vboxsync * @param pszExpr The expression. Format string with the format DBGC extensions.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param ... Format arguments.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCHLPEXEC(PDBGCCMDHLP pCmdHlp, const char *pszExpr, ...);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCHLPEVAL() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCHLPEXEC *PFNDBGCHLPEXEC;
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Helper functions for commands.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef struct DBGCCMDHLP
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBCHLPWRITE() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPWRITE pfnWrite;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPPRINTF() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPPRINTF pfnPrintf;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPPRINTFV() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPPRINTFV pfnPrintfV;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPVBOXERROR() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPVBOXERROR pfnVBoxError;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPVBOXERRORV() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPVBOXERRORV pfnVBoxErrorV;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPMEMREAD() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPMEMREAD pfnMemRead;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPMEMWRITE() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPMEMWRITE pfnMemWrite;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /** Pointer to a FNDBGCHLPEXEC() function. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync PFNDBGCHLPEXEC pfnExec;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Evaluates an expression.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * (Hopefully the parser and functions are fully reentrant.)
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code appropriate to return from a command.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pResult Where to store the result.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pszExpr The expression. Format string with the format DBGC extensions.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param va Format arguments.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnEvalV)(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, va_list va);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Print an error and fail the current command.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code to pass upwards.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmd The failing command.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pszFormat The error message format string.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param va Format arguments.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnFailV)(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, const char *pszFormat, va_list va);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Converts a DBGC variable to a DBGF address structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pVar The variable to convert.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pAddress The target address.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnVarToDbgfAddr)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Converts a DBGF address structure to a DBGC variable.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pAddress The source address.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pResult The result variable.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync DECLCALLBACKMEMBER(int, pfnVarFromDbgfAddr)(PDBGCCMDHLP pCmdHlp, PCDBGFADDRESS pAddress, PDBGCVAR pResult);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a DBGC variable to a 64-bit number.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVar The variable to convert.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pu64Number Where to store the number.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync DECLCALLBACKMEMBER(int, pfnVarToNumber)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Converts a DBGC variable to a boolean.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVar The variable to convert.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pf Where to store the boolean.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DECLCALLBACKMEMBER(int, pfnVarToBool)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, bool *pf);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Get the range of a variable in bytes, resolving symbols if necessary.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pCmdHlp Pointer to the command callback structure.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pVar The variable to convert.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param cbElement Conversion factor for element ranges.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param cbDefault The default range.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pcbRange The length of the range.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync DECLCALLBACKMEMBER(int, pfnVarGetRange)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t cbElement, uint64_t cbDefault,
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync uint64_t *pcbRange);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync /**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * Converts a variable to one with the specified type.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * This preserves the range.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @returns VBox status code.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param pCmdHlp Pointer to the command callback structure.
4e47bb772df0d04d1ded3e06354de547d52e2d06vboxsync * @param pVar The variable to convert.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @param enmToType The target type.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param fConvSyms If @c true, then attempt to resolve symbols.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pResult The output variable. Can be the same as @a pVar.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DECLCALLBACKMEMBER(int, pfnVarConvert)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, DBGCVARTYPE enmToType, bool fConvSyms,
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync PDBGCVAR pResult);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync /**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Gets a DBGF output helper that directs the output to the debugger
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * console.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns Pointer to the helper structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pCmdHlp Pointer to the command callback structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync DECLCALLBACKMEMBER(PCDBGFINFOHLP, pfnGetDbgfOutputHlp)(PDBGCCMDHLP pCmdHlp);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync} DBGCCMDHLP;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync#ifdef IN_RING3
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync/**
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * Command helper for writing formatted text to the debug console.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync *
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @returns VBox status.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pCmdHlp Pointer to the command callback structure.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param pszFormat The format string.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * This is using the log formatter, so it's format extensions can be used.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync * @param ... Arguments specified in the format string.
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync */
daa94352f51be2329ac8660f70396e03a7cb983bvboxsyncDECLINLINE(int) DBGCCmdHlpPrintf(PDBGCCMDHLP pCmdHlp, const char *pszFormat, ...)
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync va_list va;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int rc;
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync va_start(va, pszFormat);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = pCmdHlp->pfnPrintfV(pCmdHlp, NULL, pszFormat, va);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync va_end(va);
daa94352f51be2329ac8660f70396e03a7cb983bvboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync}
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @copydoc FNDBGCHLPVBOXERROR
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncDECLINLINE(int) DBGCCmdHlpVBoxError(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, ...)
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync{
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync va_list va;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync va_start(va, pszFormat);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync rc = pCmdHlp->pfnVBoxErrorV(pCmdHlp, rc, pszFormat, va);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync va_end(va);
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync return rc;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync}
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * @copydoc FNDBGCHLPMEMREAD
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncDECLINLINE(int) DBGCCmdHlpMemRead(PDBGCCMDHLP pCmdHlp, PVM pVM, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead)
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync{
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync return pCmdHlp->pfnMemRead(pCmdHlp, pVM, pvBuffer, cbRead, pVarPointer, pcbRead);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync}
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/**
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Evaluates an expression.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * (Hopefully the parser and functions are fully reentrant.)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @returns VBox status code appropriate to return from a command.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pCmdHlp Pointer to the command callback structure.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pResult Where to store the result.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pszExpr The expression. Format string with the format DBGC extensions.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param ... Format arguments.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync */
d3dea25ec07f6546715fe3af943ea863294b392evboxsyncDECLINLINE(int) DBGCCmdHlpEval(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, ...)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync{
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_list va;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync int rc;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_start(va, pszExpr);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync rc = pCmdHlp->pfnEvalV(pCmdHlp, pResult, pszExpr, va);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_end(va);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync return rc;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync}
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/**
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * Print an error and fail the current command.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @returns VBox status code to pass upwards.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync *
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pCmdHlp Pointer to the command callback structure.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pCmd The failing command.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param pszFormat The error message format string.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @param ... Format arguments.
d3dea25ec07f6546715fe3af943ea863294b392evboxsync */
d3dea25ec07f6546715fe3af943ea863294b392evboxsyncDECLINLINE(int) DBGCCmdHlpFail(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, const char *pszFormat, ...)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync{
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_list va;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync int rc;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_start(va, pszFormat);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync rc = pCmdHlp->pfnFailV(pCmdHlp, pCmd, pszFormat, va);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync va_end(va);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync return rc;
d3dea25ec07f6546715fe3af943ea863294b392evboxsync}
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/**
d3dea25ec07f6546715fe3af943ea863294b392evboxsync * @copydoc DBGCCMDHLP::pfnVarToDbgfAddr
d3dea25ec07f6546715fe3af943ea863294b392evboxsync */
d3dea25ec07f6546715fe3af943ea863294b392evboxsyncDECLINLINE(int) DBGCCmdHlpVarToDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress)
d3dea25ec07f6546715fe3af943ea863294b392evboxsync{
d3dea25ec07f6546715fe3af943ea863294b392evboxsync return pCmdHlp->pfnVarToDbgfAddr(pCmdHlp, pVar, pAddress);
d3dea25ec07f6546715fe3af943ea863294b392evboxsync}
d3dea25ec07f6546715fe3af943ea863294b392evboxsync
d3dea25ec07f6546715fe3af943ea863294b392evboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnVarToDbgfAddr
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpVarFromDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGFADDRESS pAddress, PDBGCVAR pResult)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnVarFromDbgfAddr(pCmdHlp, pAddress, pResult);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Converts an variable to a flat address.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @returns VBox status code.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pCmdHlp Pointer to the command callback structure.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pVar The variable to convert.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pFlatPtr Where to store the flat address.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpVarToFlatAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PRTGCPTR pFlatPtr)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync DBGFADDRESS Addr;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync int rc = pCmdHlp->pfnVarToDbgfAddr(pCmdHlp, pVar, &Addr);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync if (RT_SUCCESS(rc))
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *pFlatPtr = Addr.FlatPtr;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return rc;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnVarToNumber
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpVarToNumber(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnVarToNumber(pCmdHlp, pVar, pu64Number);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnVarToBool
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpVarToBool(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, bool *pf)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnVarToBool(pCmdHlp, pVar, pf);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnVarGetRange
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpVarGetRange(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t cbElement, uint64_t cbDefault, uint64_t *pcbRange)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnVarGetRange(pCmdHlp, pVar, cbElement, cbDefault, pcbRange);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnVarConvert
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(int) DBGCCmdHlpConvert(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, DBGCVARTYPE enmToType, bool fConvSyms, PDBGCVAR pResult)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnVarConvert(pCmdHlp, pVar, enmToType, fConvSyms, pResult);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @copydoc DBGCCMDHLP::pfnGetDbgfOutputHlp
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncDECLINLINE(PCDBGFINFOHLP) DBGCCmdHlpGetDbgfOutputHlp(PDBGCCMDHLP pCmdHlp)
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync{
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync return pCmdHlp->pfnGetDbgfOutputHlp(pCmdHlp);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync}
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync#endif /* IN_RING3 */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * Command handler.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * The console will call the handler for a command once it's finished
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * parsing the user input. The command handler function is responsible
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * for executing the command itself.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @returns VBox status.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pCmd Pointer to the command descriptor (as registered).
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pCmdHlp Pointer to command helper functions.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pVM Pointer to the current VM (if any).
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param paArgs Pointer to (readonly) array of arguments.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param cArgs Number of arguments in the array.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * @param pResult Where to store the result. NULL if no result descriptor was specified.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsynctypedef DECLCALLBACK(int) FNDBGCCMD(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR pArgs, unsigned cArgs, PDBGCVAR pResult);
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/** Pointer to a FNDBGCCMD() function. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsynctypedef FNDBGCCMD *PFNDBGCCMD;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync/**
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * DBGC command descriptor.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync *
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync * If a pResultDesc is specified the command can be called and used
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * as a function too. If it's a pure function, set fFlags to
5b0a093ca572a855886faa6747ad46df859dd041vboxsync * DBGCCMD_FLAGS_FUNCTION.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync */
5b0a093ca572a855886faa6747ad46df859dd041vboxsynctypedef struct DBGCCMD
5b0a093ca572a855886faa6747ad46df859dd041vboxsync{
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Command string. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync const char *pszCmd;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Minimum number of arguments. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync unsigned cArgsMin;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Max number of arguments. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync unsigned cArgsMax;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Argument descriptors (array). */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync PCDBGCVARDESC paArgDescs;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Number of argument descriptors. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync unsigned cArgDescs;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Result descriptor. */
d3dea25ec07f6546715fe3af943ea863294b392evboxsync PCDBGCVARDESC pResultDesc;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync /** flags. (reserved for now) */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync unsigned fFlags;
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync /** Handler function. */
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync PFNDBGCCMD pfnHandler;
3bb3e26b3306b9f62b18c17380bdf2ca3a98ca49vboxsync /** Command syntax. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync const char *pszSyntax;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync /** Command description. */
5b0a093ca572a855886faa6747ad46df859dd041vboxsync const char *pszDescription;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync} DBGCCMD;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** DBGCCMD Flags.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @{
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** The description is of a pure function which cannot be invoked
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * as a command from the commandline. */
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync#define DBGCCMD_FLAGS_FUNCTION 1
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** @} */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync/** Pointer to a DBGC backend. */
6c2750d8e30830bf114880ca33922b108ab3e942vboxsynctypedef struct DBGCBACK *PDBGCBACK;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync/**
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * Checks if there is input.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync *
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @returns true if there is input ready.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @returns false if there not input ready.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @param pBack Pointer to the backend structure supplied by
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * the backend. The backend can use this to find
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * it's instance data.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync * @param cMillies Number of milliseconds to wait on input data.
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync */
6c2750d8e30830bf114880ca33922b108ab3e942vboxsynctypedef DECLCALLBACK(bool) FNDBGCBACKINPUT(PDBGCBACK pBack, uint32_t cMillies);
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync/** Pointer to a FNDBGCBACKINPUT() callback. */
6c2750d8e30830bf114880ca33922b108ab3e942vboxsynctypedef FNDBGCBACKINPUT *PFNDBGCBACKINPUT;
6c2750d8e30830bf114880ca33922b108ab3e942vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync/**
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * Read input.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync *
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @returns VBox status code.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pBack Pointer to the backend structure supplied by
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * the backend. The backend can use this to find
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * it's instance data.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pvBuf Where to put the bytes we read.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param cbBuf Maximum nymber of bytes to read.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param pcbRead Where to store the number of bytes actually read.
35327b0d3e16d29246883d9ffe93d54cb3a47e36vboxsync * If NULL the entire buffer must be filled for a
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * successful return.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef DECLCALLBACK(int) FNDBGCBACKREAD(PDBGCBACK pBack, void *pvBuf, size_t cbBuf, size_t *pcbRead);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/** Pointer to a FNDBGCBACKREAD() callback. */
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsynctypedef FNDBGCBACKREAD *PFNDBGCBACKREAD;
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync * Write (output).
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync *
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync * @returns VBox status code.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param pBack Pointer to the backend structure supplied by
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * the backend. The backend can use this to find
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * it's instance data.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param pvBuf What to write.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param cbBuf Number of bytes to write.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param pcbWritten Where to store the number of bytes actually written.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * If NULL the entire buffer must be successfully written.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsynctypedef DECLCALLBACK(int) FNDBGCBACKWRITE(PDBGCBACK pBack, const void *pvBuf, size_t cbBuf, size_t *pcbWritten);
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync/** Pointer to a FNDBGCBACKWRITE() callback. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsynctypedef FNDBGCBACKWRITE *PFNDBGCBACKWRITE;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync/**
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * Ready / busy notification.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync *
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param pBack Pointer to the backend structure supplied by
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * the backend. The backend can use this to find
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * it's instance data.
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * @param fReady Whether it's ready (true) or busy (false).
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsynctypedef DECLCALLBACK(void) FNDBGCBACKSETREADY(PDBGCBACK pBack, bool fReady);
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync/** Pointer to a FNDBGCBACKSETREADY() callback. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsynctypedef FNDBGCBACKSETREADY *PFNDBGCBACKSETREADY;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync/**
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * The communication backend provides the console with a number of callbacks
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync * which can be used
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsynctypedef struct DBGCBACK
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync{
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /** Check for input. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync PFNDBGCBACKINPUT pfnInput;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /** Read input. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync PFNDBGCBACKREAD pfnRead;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /** Write output. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync PFNDBGCBACKWRITE pfnWrite;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync /** Ready / busy notification. */
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync PFNDBGCBACKSETREADY pfnSetReady;
6ba706e9f431401d425d16817fdcd6316f83b584vboxsync} DBGCBACK;
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync/**
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * Make a console instance.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync *
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * This will not return until either an 'exit' command is issued or a error code
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * indicating connection loss is encountered.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync *
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @returns VINF_SUCCESS if console termination caused by the 'exit' command.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @returns The VBox status code causing the console termination.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync *
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @param pVM VM Handle.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @param pBack Pointer to the backend structure. This must contain
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * a full set of function pointers to service the console.
192a1d418422c3b5905dd2577527c07a8ed8b61evboxsync * @param fFlags Reserved, must be zero.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @remark A forced termination of the console is easiest done by forcing the
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * callbacks to return fatal failures.
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync */
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsyncDBGDECL(int) DBGCCreate(PVM pVM, PDBGCBACK pBack, unsigned fFlags);
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync/**
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync * Register one or more external commands.
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync *
830a019ad79a45e6bf7a5419efd5a729a36e599evboxsync * @returns VBox status.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * @param paCommands Pointer to an array of command descriptors.
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * The commands must be unique. It's not possible
809e0c4b84167932d92a1df4edcbab2edf0ddf25vboxsync * to register the same commands more than once.
* @param cCommands Number of commands.
*/
DBGDECL(int) DBGCRegisterCommands(PCDBGCCMD paCommands, unsigned cCommands);
/**
* Deregister one or more external commands previously registered by
* DBGCRegisterCommands().
*
* @returns VBox status.
* @param paCommands Pointer to an array of command descriptors
* as given to DBGCRegisterCommands().
* @param cCommands Number of commands.
*/
DBGDECL(int) DBGCDeregisterCommands(PCDBGCCMD paCommands, unsigned cCommands);
/**
* Spawns a new thread with a TCP based debugging console service.
*
* @returns VBox status.
* @param pVM VM handle.
* @param ppvData Where to store the pointer to instance data.
*/
DBGDECL(int) DBGCTcpCreate(PVM pVM, void **ppvUser);
/**
* Terminates any running TCP base debugger console service.
*
* @returns VBox status.
* @param pVM VM handle.
* @param pvData Instance data set by DBGCTcpCreate().
*/
DBGDECL(int) DBGCTcpTerminate(PVM pVM, void *pvData);
/** @defgroup grp_dbgc_plug_in The DBGC Plug-in Interface
* @{
*/
/** The plug-in module name prefix. */
#define DBGC_PLUG_IN_PREFIX "DBGCPlugIn"
/** The name of the plug-in entry point (FNDBGCPLUGIN) */
#define DBGC_PLUG_IN_ENTRYPOINT "DBGCPlugInEntry"
/**
* DBGC plug-in operations.
*/
typedef enum DBGCPLUGINOP
{
/** The usual invalid first value. */
DBGCPLUGINOP_INVALID,
/** Initialize the plug-in, register all the stuff.
* The plug-in will be unloaded on failure.
* uArg: The VirtualBox version (major+minor). */
DBGCPLUGINOP_INIT,
/** Terminate the plug-ing, deregister all the stuff.
* The plug-in will be unloaded after this call regardless of the return
* code. */
DBGCPLUGINOP_TERM,
/** The usual 32-bit hack. */
DBGCPLUGINOP_32BIT_HACK = 0x7fffffff
} DBGCPLUGINOP;
/**
* DBGC plug-in main entry point.
*
* @returns VBox status code.
*
* @param enmOperation The operation.
* @param pVM The VM handle. This may be NULL.
* @param uArg Extra argument.
*/
typedef DECLCALLBACK(int) FNDBGCPLUGIN(DBGCPLUGINOP enmOperation, PVM pVM, uintptr_t uArg);
/** Pointer to a FNDBGCPLUGIN. */
typedef FNDBGCPLUGIN *PFNDBGCPLUGIN;
/** @copydoc FNDBGCPLUGIN */
DECLEXPORT(int) DBGCPlugInEntry(DBGCPLUGINOP enmOperation, PVM pVM, uintptr_t uArg);
/** @} */
RT_C_DECLS_END
#endif