a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * DBGC - Debugger Console, Command Helpers.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2013 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Header Files *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define LOG_GROUP LOG_GROUP_DBGC
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/dbg.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/dbgf.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pgm.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/param.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/err.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/log.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/assert.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/ctype.h>
506df97a8c78dacfe69bc4d3ee5d3de832d0f19avboxsync#include <iprt/mem.h>
506df97a8c78dacfe69bc4d3ee5d3de832d0f19avboxsync#include <iprt/string.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "DBGCInternal.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnPrintf}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpPrintf(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, ...)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Do the formatting and output.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_list args;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_start(args, pszFormat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = pCmdHlp->pfnPrintfV(pCmdHlp, pcbWritten, pszFormat, args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_end(args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync/**
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * Outputs a string in quotes.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync *
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @returns The number of bytes formatted.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @param pfnOutput Pointer to output function.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @param pvArgOutput Argument for the output function.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @param chQuote The quote character.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @param psz The string to quote.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync * @param cch The string length.
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync */
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsyncstatic size_t dbgcStringOutputInQuotes(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, char chQuote, const char *psz, size_t cch)
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync{
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync size_t cchOutput = pfnOutput(pvArgOutput, &chQuote, 1);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync while (cch > 0)
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync {
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync char *pchQuote = (char *)memchr(psz, chQuote, cch);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync if (!pchQuote)
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync {
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync cchOutput += pfnOutput(pvArgOutput, psz, cch);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync break;
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync }
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync size_t cchSub = pchQuote - psz + 1;
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync cchOutput += pfnOutput(pvArgOutput, psz, cchSub);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync cchOutput += pfnOutput(pvArgOutput, &chQuote, 1);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync cchSub -= cchSub;
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync psz += cchSub;
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync }
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync cchOutput += pfnOutput(pvArgOutput, &chQuote, 1);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync return cchOutput;
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync}
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * Callback to format non-standard format specifiers, employed by dbgcPrintfV
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * and others.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns The number of bytes formatted.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvArg Formatter argument.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pfnOutput Pointer to output function.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvArgOutput Argument for the output function.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param ppszFormat Pointer to the format string pointer. Advance this till the char
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * after the format specifier.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pArgs Pointer to the argument list. Use this to fetch the arguments.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cchWidth Format Width. -1 if not specified.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cchPrecision Format Precision. -1 if not specified.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param fFlags Flags (RTSTR_NTFS_*).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param chArgSize The argument size specifier, 'l' or 'L'.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(size_t) dbgcStringFormatter(void *pvArg, PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char **ppszFormat, va_list *pArgs, int cchWidth,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int cchPrecision, unsigned fFlags, char chArgSize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(cchWidth); NOREF(cchPrecision); NOREF(fFlags); NOREF(chArgSize); NOREF(pvArg);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (**ppszFormat != 'D')
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync (*ppszFormat)++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync (*ppszFormat)++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (**ppszFormat)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Print variable without range.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The argument is a const pointer to the variable.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 'V':
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync (*ppszFormat)++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PCDBGCVAR pVar = va_arg(*pArgs, PCDBGCVAR);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVar->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%RGv", pVar->u.GCFlat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FAR:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%04x:%08x", pVar->u.GCFar.sel, pVar->u.GCFar.off);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%%%RGp", pVar->u.GCPhys);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%#%RHv", (uintptr_t)pVar->u.pvHCFlat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "#%%%%%RHp", pVar->u.HCPhys);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_NUMBER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%llx", pVar->u.u64Number);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_STRING:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync return dbgcStringOutputInQuotes(pfnOutput, pvArgOutput, '"', pVar->u.pszString, (size_t)pVar->u64Range);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_SYMBOL:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync return dbgcStringOutputInQuotes(pfnOutput, pvArgOutput, '\'', pVar->u.pszString, (size_t)pVar->u64Range);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_UNKNOWN:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pfnOutput(pvArgOutput, "??", 2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Print variable with range.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The argument is a const pointer to the variable.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 'v':
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync (*ppszFormat)++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PCDBGCVAR pVar = va_arg(*pArgs, PCDBGCVAR);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szRange[32];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVar->enmRangeType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_RANGE_NONE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szRange[0] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_RANGE_ELEMENTS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szRange, sizeof(szRange), " L %llx", pVar->u64Range);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_RANGE_BYTES:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szRange, sizeof(szRange), " LB %llx", pVar->u64Range);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVar->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%RGv%s", pVar->u.GCFlat, szRange);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FAR:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%04x:%08x%s", pVar->u.GCFar.sel, pVar->u.GCFar.off, szRange);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%%%RGp%s", pVar->u.GCPhys, szRange);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%#%RHv%s", (uintptr_t)pVar->u.pvHCFlat, szRange);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "#%%%%%RHp%s", pVar->u.HCPhys, szRange);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_NUMBER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%llx%s", pVar->u.u64Number, szRange);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_STRING:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync return dbgcStringOutputInQuotes(pfnOutput, pvArgOutput, '"', pVar->u.pszString, (size_t)pVar->u64Range);
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_SYMBOL:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync return dbgcStringOutputInQuotes(pfnOutput, pvArgOutput, '\'', pVar->u.pszString, (size_t)pVar->u64Range);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_UNKNOWN:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pfnOutput(pvArgOutput, "??", 2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("Invalid format type '%s'!\n", **ppszFormat));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * Output callback employed by dbgcHlpPrintfV.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns number of bytes written.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvArg User argument.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pachChars Pointer to an array of utf-8 characters.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cbChars Number of bytes in the character array pointed to by pachChars.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(size_t) dbgcFormatOutput(void *pvArg, const char *pachChars, size_t cbChars)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync PDBGC pDbgc = (PDBGC)pvArg;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbChars)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = pDbgc->pBack->pfnWrite(pDbgc->pBack, pachChars, cbChars, NULL);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync if (RT_SUCCESS(rc))
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync pDbgc->chLastOutput = pachChars[cbChars - 1];
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->rcOutput = rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbChars = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return cbChars;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnPrintfV}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpPrintfV(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, va_list args)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Do the formatting and output.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->rcOutput = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = RTStrFormatV(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, pszFormat, args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = cb;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pDbgc->rcOutput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync/**
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync * @interface_method_impl{DBGCCMDHLP,pfnStrPrintf}
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync */
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsyncstatic DECLCALLBACK(size_t) dbgcHlpStrPrintfV(PDBGCCMDHLP pCmdHlp, char *pszBuf, size_t cbBuf,
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync const char *pszFormat, va_list va)
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync{
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync return RTStrPrintfExV(dbgcStringFormatter, pDbgc, pszBuf, cbBuf, pszFormat, va);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync}
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync/**
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync * @interface_method_impl{DBGCCMDHLP,pfnStrPrintf}
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync */
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsyncstatic DECLCALLBACK(size_t) dbgcHlpStrPrintf(PDBGCCMDHLP pCmdHlp, char *pszBuf, size_t cbBuf, const char *pszFormat, ...)
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync{
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync va_list va;
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync va_start(va, pszFormat);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync size_t cch = RTStrPrintfExV(dbgcStringFormatter, pDbgc, pszBuf, cbBuf, pszFormat, va);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync va_end(va);
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync return cch;
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync}
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnVBoxErrorV}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpVBoxErrorV(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, va_list args)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (rc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VINF_SUCCESS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL, "error: %Rrc: %s", rc, pszFormat ? " " : "\n");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc) && pszFormat)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = pCmdHlp->pfnPrintfV(pCmdHlp, NULL, pszFormat, args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = VERR_DBGC_COMMAND_FAILED;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnVBoxError}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpVBoxError(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, ...)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_list args;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_start(args, pszFormat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rcRet = pCmdHlp->pfnVBoxErrorV(pCmdHlp, rc, pszFormat, args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_end(args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rcRet;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnMemRead}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgcHlpMemRead(PDBGCCMDHLP pCmdHlp, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Address;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Dummy check.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbRead == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (*pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbRead = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Convert Far addresses getting size and the correct base address.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Getting and checking the size is what makes this messy and slow.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGCVAR Var = *pVarPointer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVarPointer->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FAR:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Use DBGFR3AddrFromSelOff for the conversion. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync Assert(pDbgc->pUVM);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, Var.u.GCFar.sel, Var.u.GCFar.off);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* don't bother with flat selectors (for now). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!DBGFADDRESS_IS_FLAT(&Address))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFSELINFO SelInfo;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3SelQueryInfo(pDbgc->pUVM, pDbgc->idCpu, Address.Sel,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE, &SelInfo);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTGCUINTPTR cb; /* -1 byte */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (DBGFSelInfoIsExpandDown(&SelInfo))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !SelInfo.u.Raw.Gen.u1Granularity
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Address.off > UINT16_C(0xffff))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Address.off <= SelInfo.cbLimit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cb = (SelInfo.u.Raw.Gen.u1Granularity ? UINT32_C(0xffffffff) : UINT32_C(0xffff)) - Address.off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Address.off > SelInfo.cbLimit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cb = SelInfo.cbLimit - Address.off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbRead - 1 > cb)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbRead = cb + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.enmType = DBGCVAR_TYPE_GC_FLAT;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.u.GCFlat = Address.FlatPtr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NOT_IMPLEMENTED;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Copy page by page.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbLeft = cbRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Calc read size.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = RT_MIN(PAGE_SIZE, cbLeft);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVarPointer->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT: cb = RT_MIN(cb, PAGE_SIZE - (Var.u.GCFlat & PAGE_OFFSET_MASK)); break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS: cb = RT_MIN(cb, PAGE_SIZE - (Var.u.GCPhys & PAGE_OFFSET_MASK)); break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT: cb = RT_MIN(cb, PAGE_SIZE - ((uintptr_t)Var.u.pvHCFlat & PAGE_OFFSET_MASK)); break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS: cb = RT_MIN(cb, PAGE_SIZE - ((size_t)Var.u.HCPhys & PAGE_OFFSET_MASK)); break; /* size_t: MSC has braindead loss of data warnings! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default: break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Perform read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (Var.enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, &Address, Var.u.GCFlat),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromPhys(pDbgc->pUVM, &Address, Var.u.GCPhys),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGCVAR Var2;
bb5391c96a16b4ba7f86878998710d4a8e7fce53vboxsync rc = dbgcOpAddrFlat(pDbgc, &Var, DBGCVAR_CAT_ANY, &Var2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo protect this!!! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(pvBuffer, Var2.u.pvHCFlat, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = VERR_INVALID_POINTER;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync rc = VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Check for failure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbRead && (*pcbRead = cbRead - cbLeft) > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Next.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbLeft -= cb;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!cbLeft)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer = (char *)pvBuffer + cb;
6bb6b050af8d55e4488ee3feb33f57fec559a783vboxsync rc = DBGCCmdHlpEval(pCmdHlp, &Var, "%DV + %#zx", &Var, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbRead && (*pcbRead = cbRead - cbLeft) > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Done
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbRead)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbRead = cbRead;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnMemWrite}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgcHlpMemWrite(PDBGCCMDHLP pCmdHlp, const void *pvBuffer, size_t cbWrite, PCDBGCVAR pVarPointer, size_t *pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Address;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Dummy check.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbWrite == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (*pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Convert Far addresses getting size and the correct base address.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Getting and checking the size is what makes this messy and slow.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGCVAR Var = *pVarPointer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVarPointer->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FAR:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Use DBGFR3AddrFromSelOff for the conversion. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync Assert(pDbgc->pUVM);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, Var.u.GCFar.sel, Var.u.GCFar.off);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* don't bother with flat selectors (for now). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!DBGFADDRESS_IS_FLAT(&Address))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFSELINFO SelInfo;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3SelQueryInfo(pDbgc->pUVM, pDbgc->idCpu, Address.Sel,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE, &SelInfo);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTGCUINTPTR cb; /* -1 byte */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (DBGFSelInfoIsExpandDown(&SelInfo))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !SelInfo.u.Raw.Gen.u1Granularity
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Address.off > UINT16_C(0xffff))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Address.off <= SelInfo.cbLimit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cb = (SelInfo.u.Raw.Gen.u1Granularity ? UINT32_C(0xffffffff) : UINT32_C(0xffff)) - Address.off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Address.off > SelInfo.cbLimit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cb = SelInfo.cbLimit - Address.off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbWrite - 1 > cb)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_OUT_OF_SELECTOR_BOUNDS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbWrite = cb + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.enmType = DBGCVAR_TYPE_GC_FLAT;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.u.GCFlat = Address.FlatPtr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* fall thru */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemWrite(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, &Address, Var.u.GCFlat),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer, cbWrite);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten && RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = cbWrite;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemWrite(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromPhys(pDbgc->pUVM, &Address, Var.u.GCPhys),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer, cbWrite);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten && RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = cbWrite;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Copy HC memory page by page.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (cbWrite > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* convert to flat address */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGCVAR Var2;
bb5391c96a16b4ba7f86878998710d4a8e7fce53vboxsync rc = dbgcOpAddrFlat(pDbgc, &Var, DBGCVAR_CAT_ANY, &Var2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten && *pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return -VERR_INVALID_POINTER;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_INVALID_POINTER;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* calc size. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbChunk = PAGE_SIZE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbChunk -= (uintptr_t)Var.u.pvHCFlat & PAGE_OFFSET_MASK;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cbChunk > cbWrite)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbChunk = cbWrite;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo protect this!!! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(Var2.u.pvHCFlat, pvBuffer, cbChunk);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* advance */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Var.enmType == DBGCVAR_TYPE_HC_FLAT)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.u.pvHCFlat = (uint8_t *)Var.u.pvHCFlat + cbChunk;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Var.u.HCPhys += cbChunk;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pvBuffer = (uint8_t const *)pvBuffer + cbChunk;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pcbWritten)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pcbWritten += cbChunk;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbWrite -= cbChunk;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NOT_IMPLEMENTED;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnHlpExec}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpExec(PDBGCCMDHLP pCmdHlp, const char *pszExpr, ...)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Save the scratch state. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char *pszScratch = pDbgc->pszScratch;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned iArg = pDbgc->iArg;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Format the expression.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_list args;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_start(args, pszExpr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbScratch = sizeof(pDbgc->achScratch) - (pDbgc->pszScratch - &pDbgc->achScratch[0]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = RTStrPrintfExV(dbgcStringFormatter, pDbgc, pDbgc->pszScratch, cbScratch, pszExpr, args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync va_end(args);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (cb >= cbScratch)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_BUFFER_OVERFLOW;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Execute the command.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We save and restore the arg index and scratch buffer pointer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->pszScratch = pDbgc->pszScratch + cb + 1;
506df97a8c78dacfe69bc4d3ee5d3de832d0f19avboxsync int rc = dbgcEvalCommand(pDbgc, pszScratch, cb, false /* fNoExecute */);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Restore the scratch state. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->iArg = iArg;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->pszScratch = pszScratch;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGCCMDHLP::pfnEvalV
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpEvalV(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, va_list va)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Format the expression.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szExprFormatted[2048];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = RTStrPrintfExV(dbgcStringFormatter, pDbgc, szExprFormatted, sizeof(szExprFormatted), pszExpr, va);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* ignore overflows. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
10bea85296ddd1bd4ed6fca7f9bdf386d071ffb6vboxsync return dbgcEvalSub(pDbgc, &szExprFormatted[0], cb, DBGCVAR_CAT_ANY, pResult);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGCCMDHLP::pfnFailV
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpFailV(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, const char *pszFormat, va_list va)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Do the formatting and output.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDbgc->rcOutput = VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrFormat(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, "%s: error: ", pCmd->pszCmd);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(pDbgc->rcOutput))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pDbgc->rcOutput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrFormatV(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, pszFormat, va);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(pDbgc->rcOutput))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pDbgc->rcOutput;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync if (pDbgc->chLastOutput != '\n')
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync dbgcFormatOutput(pDbgc, "\n", 1);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync return VERR_DBGC_COMMAND_FAILED;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync}
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @copydoc DBGCCMDHLP::pfnFailV
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync */
6d1eb3b4ff1138127091da66816af96cddd9418evboxsyncstatic DECLCALLBACK(int) dbgcHlpFailRcV(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int rc, const char *pszFormat, va_list va)
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync{
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync /*
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * Do the formatting and output.
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync */
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync pDbgc->rcOutput = VINF_SUCCESS;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync RTStrFormat(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, "%s: error: ", pCmd->pszCmd);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync if (RT_FAILURE(pDbgc->rcOutput))
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync return pDbgc->rcOutput;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync RTStrFormatV(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, pszFormat, va);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync if (RT_FAILURE(pDbgc->rcOutput))
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync return pDbgc->rcOutput;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync RTStrFormat(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, ": %Rrc\n", rc);
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync if (RT_FAILURE(pDbgc->rcOutput))
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync return pDbgc->rcOutput;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync
6ffa2eb79bdf1b3299aacf589ece7b124ec34dc7vboxsync return VERR_DBGC_COMMAND_FAILED;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
7453a6a25717dafb455fcd0b94c621781f613839vboxsync/**
7453a6a25717dafb455fcd0b94c621781f613839vboxsync * @copydoc DBGCCMDHLP::pfnParserError
7453a6a25717dafb455fcd0b94c621781f613839vboxsync */
7453a6a25717dafb455fcd0b94c621781f613839vboxsyncstatic DECLCALLBACK(int) dbgcHlpParserError(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int iArg, const char *pszExpr, unsigned iLine)
7453a6a25717dafb455fcd0b94c621781f613839vboxsync{
7453a6a25717dafb455fcd0b94c621781f613839vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
7453a6a25717dafb455fcd0b94c621781f613839vboxsync
7453a6a25717dafb455fcd0b94c621781f613839vboxsync /*
7453a6a25717dafb455fcd0b94c621781f613839vboxsync * Do the formatting and output.
7453a6a25717dafb455fcd0b94c621781f613839vboxsync */
7453a6a25717dafb455fcd0b94c621781f613839vboxsync pDbgc->rcOutput = VINF_SUCCESS;
7453a6a25717dafb455fcd0b94c621781f613839vboxsync RTStrFormat(dbgcFormatOutput, pDbgc, dbgcStringFormatter, pDbgc, "%s: parser error: iArg=%d iLine=%u pszExpr=%s\n",
7453a6a25717dafb455fcd0b94c621781f613839vboxsync pCmd->pszCmd, iArg, iLine, pszExpr);
7453a6a25717dafb455fcd0b94c621781f613839vboxsync if (RT_FAILURE(pDbgc->rcOutput))
7453a6a25717dafb455fcd0b94c621781f613839vboxsync return pDbgc->rcOutput;
7453a6a25717dafb455fcd0b94c621781f613839vboxsync return VERR_DBGC_COMMAND_FAILED;
7453a6a25717dafb455fcd0b94c621781f613839vboxsync}
7453a6a25717dafb455fcd0b94c621781f613839vboxsync
7453a6a25717dafb455fcd0b94c621781f613839vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarToDbgfAddr}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpVarToDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertPtr(pVar);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertPtr(pAddress);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync switch (pVar->enmType)
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync {
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_GC_FLAT:
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, pAddress, pVar->u.GCFlat);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return VINF_SUCCESS;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_NUMBER:
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, pAddress, (RTGCUINTPTR)pVar->u.u64Number);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return VINF_SUCCESS;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_GC_FAR:
98427c0ab08697e468c26dc33ee9571308577867vboxsync return DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, pAddress, pVar->u.GCFar.sel, pVar->u.GCFar.off);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_GC_PHYS:
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromPhys(pDbgc->pUVM, pAddress, pVar->u.GCPhys);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return VINF_SUCCESS;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_SYMBOL:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync {
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync DBGCVAR Var;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync int rc = DBGCCmdHlpEval(&pDbgc->CmdHlp, &Var, "%%(%DV)", pVar);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync if (RT_FAILURE(rc))
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return rc;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return dbgcHlpVarToDbgfAddr(pCmdHlp, &Var, pAddress);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync }
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_STRING:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_HC_FLAT:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGCVAR_TYPE_HC_PHYS:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync default:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync }
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync}
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync/**
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarFromDbgfAddr}
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync */
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsyncstatic DECLCALLBACK(int) dbgcHlpVarFromDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGFADDRESS pAddress, PDBGCVAR pResult)
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync{
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertPtrReturn(pAddress, VERR_INVALID_POINTER);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertReturn(DBGFADDRESS_IS_VALID(pAddress), VERR_INVALID_PARAMETER);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertPtrReturn(pResult, VERR_INVALID_POINTER);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync switch (pAddress->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK)
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync {
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGFADDRESS_FLAGS_FAR16:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGFADDRESS_FLAGS_FAR32:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGFADDRESS_FLAGS_FAR64:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync DBGCVAR_INIT_GC_FAR(pResult, pAddress->Sel, pAddress->off);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync break;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGFADDRESS_FLAGS_FLAT:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync DBGCVAR_INIT_GC_FLAT(pResult, pAddress->FlatPtr);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync break;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync case DBGFADDRESS_FLAGS_PHYS:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync DBGCVAR_INIT_GC_PHYS(pResult, pAddress->FlatPtr);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync break;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync default:
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync DBGCVAR_INIT(pResult);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync AssertMsgFailedReturn(("%#x\n", pAddress->fFlags), VERR_INVALID_PARAMETER);
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync break;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync }
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarToNumber}
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsyncstatic DECLCALLBACK(int) dbgcHlpVarToNumber(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync{
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync NOREF(pDbgc);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync uint64_t u64Number;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (pVar->enmType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = pVar->u.GCFlat;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = pVar->u.GCPhys;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = (uintptr_t)pVar->u.pvHCFlat;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = (uintptr_t)pVar->u.HCPhys;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = (uintptr_t)pVar->u.u64Number;
97aab6c5459febce8b28362b984128d7de57b9bfvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync u64Number = (uintptr_t)pVar->u.GCFar.off;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync /** @todo try convert as symbol? */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE; /** @todo better error code! */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync default:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync *pu64Number = u64Number;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync}
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarToBool}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic DECLCALLBACK(int) dbgcHlpVarToBool(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, bool *pf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(pDbgc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pVar->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync case DBGCVAR_TYPE_SYMBOL:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_STRING:
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync if ( !RTStrICmp(pVar->u.pszString, "true")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "on")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "no")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "enabled"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pf = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync if ( !RTStrICmp(pVar->u.pszString, "false")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "off")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "yes")
60c09b27d103d1f742cbd8a2fae8a254cba386a6vboxsync || !RTStrICmp(pVar->u.pszString, "disabled"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pf = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE; /** @todo better error code! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_FLAT:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_HC_PHYS:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_NUMBER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *pf = pVar->u.u64Number != 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case DBGCVAR_TYPE_GC_FAR:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync/**
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarGetRange}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsyncstatic DECLCALLBACK(int) dbgcHlpVarGetRange(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t cbElement, uint64_t cbDefault,
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync uint64_t *pcbRange)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync{
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync/** @todo implement this properly, strings/symbols are not resolved now. */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync switch (pVar->enmRangeType)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync {
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync default:
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync case DBGCVAR_RANGE_NONE:
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync *pcbRange = cbDefault;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync break;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync case DBGCVAR_RANGE_BYTES:
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync *pcbRange = pVar->u64Range;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync break;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync case DBGCVAR_RANGE_ELEMENTS:
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync *pcbRange = pVar->u64Range * cbElement;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync break;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync }
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync return VINF_SUCCESS;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync/**
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync * @interface_method_impl{DBGCCMDHLP,pfnVarConvert}
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsyncstatic DECLCALLBACK(int) dbgcHlpVarConvert(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pInVar, DBGCVARTYPE enmToType, bool fConvSyms,
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync PDBGCVAR pResult)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync{
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync DBGCVAR const InVar = *pInVar; /* if pInVar == pResult */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync PCDBGCVAR pArg = &InVar; /* lazy bird, clean up later */
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync DBGFADDRESS Address;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync int rc;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync Assert(pDbgc->pUVM);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync *pResult = InVar;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (InVar.enmType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToPhys(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, &Address, pArg->u.GCFlat),
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_FLAT;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, &Address, pArg->u.GCFlat),
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync false /*fReadOnly */,
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync &pResult->u.pvHCFlat);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToHostPhys(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pDbgc->pUVM, &Address, pArg->u.GCFlat),
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.u64Number = InVar.u.GCFlat;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_FLAT;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.GCFlat = Address.FlatPtr;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToPhys(pDbgc->pUVM, pDbgc->idCpu, &Address, &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_FLAT;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pUVM, pDbgc->idCpu, &Address,
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync false /*fReadOnly*/, &pResult->u.pvHCFlat);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrFromSelOff(pDbgc->pUVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToHostPhys(pDbgc->pUVM, pDbgc->idCpu, &Address, &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.u64Number = InVar.u.GCFar.off;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync //rc = MMR3PhysGCPhys2GCVirtEx(pDbgc->pVM, pResult->u.GCPhys, ..., &pResult->u.GCFlat); - yea, sure.
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_FLAT;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromPhys(pDbgc->pUVM, &Address, pArg->u.GCPhys),
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync false /*fReadOnly */,
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync &pResult->u.pvHCFlat);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3AddrToHostPhys(pDbgc->pUVM, pDbgc->idCpu,
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromPhys(pDbgc->pUVM, &Address, pArg->u.GCPhys),
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync &pResult->u.HCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.u64Number = InVar.u.GCPhys;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = PGMR3DbgR3Ptr2GCPhys(pDbgc->pUVM, pArg->u.pvHCFlat, &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync /** @todo more memory types! */
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = PGMR3DbgR3Ptr2HCPhys(pDbgc->pUVM, pArg->u.pvHCFlat, &pResult->u.HCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync /** @todo more memory types! */
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.u64Number = (uintptr_t)InVar.u.pvHCFlat;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_PHYS;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = PGMR3DbgHCPhys2GCPhys(pDbgc->pUVM, pArg->u.HCPhys, &pResult->u.GCPhys);
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (RT_SUCCESS(rc))
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_CONVERSION_FAILED;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.u64Number = InVar.u.HCPhys;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_FLAT;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.GCFlat = (RTGCPTR)InVar.u.u64Number;
f325fd0ecbe738d595f7a5ee31ad4256b390dec5vboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_GC_PHYS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.GCPhys = (RTGCPHYS)InVar.u.u64Number;
f325fd0ecbe738d595f7a5ee31ad4256b390dec5vboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_FLAT;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.pvHCFlat = (void *)(uintptr_t)InVar.u.u64Number;
f325fd0ecbe738d595f7a5ee31ad4256b390dec5vboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = DBGCVAR_TYPE_HC_PHYS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->u.HCPhys = (RTHCPHYS)InVar.u.u64Number;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync switch (enmToType)
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync {
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_FAR:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_GC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_FLAT:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_HC_PHYS:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_NUMBER:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync if (fConvSyms)
1cc76c220eb8fe406bb98b7d95861e5dc6bda516vboxsync {
1cc76c220eb8fe406bb98b7d95861e5dc6bda516vboxsync rc = dbgcSymbolGet(pDbgc, InVar.u.pszString, enmToType, pResult);
1cc76c220eb8fe406bb98b7d95861e5dc6bda516vboxsync if (RT_SUCCESS(rc))
1cc76c220eb8fe406bb98b7d95861e5dc6bda516vboxsync return VINF_SUCCESS;
1cc76c220eb8fe406bb98b7d95861e5dc6bda516vboxsync }
5dd0f48aea5b772d5b217101f71606345feb8d3bvboxsync return VERR_DBGC_PARSE_INCORRECT_ARG_TYPE;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_STRING:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_SYMBOL:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pResult->enmType = enmToType;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VINF_SUCCESS;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_UNKNOWN:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync case DBGCVAR_TYPE_ANY:
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync break;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync }
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync AssertMsgFailed(("f=%d t=%d\n", InVar.enmType, enmToType));
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync return VERR_INVALID_PARAMETER;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync}
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGFINFOHLP,pfnPrintf}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsyncstatic DECLCALLBACK(void) dbgcHlpGetDbgfOutputHlp_Printf(PCDBGFINFOHLP pHlp, const char *pszFormat, ...)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync{
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync PDBGC pDbgc = RT_FROM_MEMBER(pHlp, DBGC, DbgfOutputHlp);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync va_list va;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync va_start(va, pszFormat);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnPrintfV(&pDbgc->CmdHlp, NULL, pszFormat, va);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync va_end(va);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync/**
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync * @interface_method_impl{DBGFINFOHLP,pfnPrintfV}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsyncstatic DECLCALLBACK(void) dbgcHlpGetDbgfOutputHlp_PrintfV(PCDBGFINFOHLP pHlp, const char *pszFormat, va_list args)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync{
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync PDBGC pDbgc = RT_FROM_MEMBER(pHlp, DBGC, DbgfOutputHlp);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnPrintfV(&pDbgc->CmdHlp, NULL, pszFormat, args);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync/**
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync * @interface_method_impl{DBGCCMDHLP,pfnGetDbgfOutputHlp}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsyncstatic DECLCALLBACK(PCDBGFINFOHLP) dbgcHlpGetDbgfOutputHlp(PDBGCCMDHLP pCmdHlp)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync{
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync /* Lazy init */
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync if (!pDbgc->DbgfOutputHlp.pfnPrintf)
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync {
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->DbgfOutputHlp.pfnPrintf = dbgcHlpGetDbgfOutputHlp_Printf;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->DbgfOutputHlp.pfnPrintfV = dbgcHlpGetDbgfOutputHlp_PrintfV;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync }
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync return &pDbgc->DbgfOutputHlp;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync}
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync/**
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync * @interface_method_impl{DBGCCMDHLP,pfnGetCurrentCpu}
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync */
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsyncstatic DECLCALLBACK(VMCPUID) dbgcHlpGetCurrentCpu(PDBGCCMDHLP pCmdHlp)
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync{
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync return pDbgc->idCpu;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync}
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync/**
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync * @interface_method_impl{DBGCCMDHLP,pfnGetCpuMode}
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync */
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsyncstatic DECLCALLBACK(CPUMMODE) dbgcHlpGetCpuMode(PDBGCCMDHLP pCmdHlp)
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync{
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync CPUMMODE enmMode = CPUMMODE_INVALID;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync if (pDbgc->fRegCtxGuest)
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync if (pDbgc->pUVM)
98427c0ab08697e468c26dc33ee9571308577867vboxsync enmMode = DBGFR3CpuGetMode(pDbgc->pUVM, DBGCCmdHlpGetCurrentCpu(pCmdHlp));
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync if (enmMode == CPUMMODE_INVALID)
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync#if HC_ARCH_BITS == 64
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync enmMode = CPUMMODE_LONG;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync#else
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync enmMode = CPUMMODE_PROTECTED;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync#endif
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync }
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync else
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync enmMode = CPUMMODE_PROTECTED;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync return enmMode;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync}
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Initializes the Command Helpers for a DBGC instance.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pDbgc Pointer to the DBGC instance.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid dbgcInitCmdHlp(PDBGC pDbgc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync pDbgc->CmdHlp.u32Magic = DBGCCMDHLP_MAGIC;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnPrintfV = dbgcHlpPrintfV;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnPrintf = dbgcHlpPrintf;
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync pDbgc->CmdHlp.pfnStrPrintf = dbgcHlpStrPrintf;
c9cc4dc782381dceb4de3f0b5b9255dddde34b34vboxsync pDbgc->CmdHlp.pfnStrPrintfV = dbgcHlpStrPrintfV;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnVBoxErrorV = dbgcHlpVBoxErrorV;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnVBoxError = dbgcHlpVBoxError;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnMemRead = dbgcHlpMemRead;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnMemWrite = dbgcHlpMemWrite;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnEvalV = dbgcHlpEvalV;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnExec = dbgcHlpExec;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnFailV = dbgcHlpFailV;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync pDbgc->CmdHlp.pfnFailRcV = dbgcHlpFailRcV;
7453a6a25717dafb455fcd0b94c621781f613839vboxsync pDbgc->CmdHlp.pfnParserError = dbgcHlpParserError;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnVarToDbgfAddr = dbgcHlpVarToDbgfAddr;
5ab90d2dec9c6002357732cd078fa62ab5512edfvboxsync pDbgc->CmdHlp.pfnVarFromDbgfAddr = dbgcHlpVarFromDbgfAddr;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pDbgc->CmdHlp.pfnVarToNumber = dbgcHlpVarToNumber;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnVarToBool = dbgcHlpVarToBool;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnVarGetRange = dbgcHlpVarGetRange;
dec9772aebc272b06ae34a7f3da31f3e716eb1dcvboxsync pDbgc->CmdHlp.pfnVarConvert = dbgcHlpVarConvert;
75f41c9995e4a8d9ed39651503f229147318dbd2vboxsync pDbgc->CmdHlp.pfnGetDbgfOutputHlp = dbgcHlpGetDbgfOutputHlp;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync pDbgc->CmdHlp.pfnGetCurrentCpu = dbgcHlpGetCurrentCpu;
ef1d4e9a1377a0241f845ff3776fd6984708e048vboxsync pDbgc->CmdHlp.pfnGetCpuMode = dbgcHlpGetCpuMode;
6d1eb3b4ff1138127091da66816af96cddd9418evboxsync pDbgc->CmdHlp.u32EndMarker = DBGCCMDHLP_MAGIC;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync