DBGCOps.cpp revision 506df97a8c78dacfe69bc4d3ee5d3de832d0f19a
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/* $Id$ */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/** @file
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * DBGC - Debugger Console, Operators.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Copyright (C) 2006-2011 Oracle Corporation
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * This file is part of VirtualBox Open Source Edition (OSE), as
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * available from http://www.virtualbox.org. This file is free software;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * you can redistribute it and/or modify it under the terms of the GNU
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * General Public License (GPL) as published by the Free Software
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Foundation, in version 2 as it comes in the "COPYING" file of the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*******************************************************************************
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx* Header Files *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx*******************************************************************************/
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff#define LOG_GROUP LOG_GROUP_DBGC
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <VBox/dbg.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <VBox/vmm/dbgf.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <VBox/param.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <VBox/err.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <VBox/log.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <iprt/assert.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <iprt/mem.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <iprt/string.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include "DBGCInternal.h"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*******************************************************************************
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx* Internal Functions *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx*******************************************************************************/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMinus(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpPluss(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanNot(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseNot(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpVar(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpAddrFar(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMult(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpDiv(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMod(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpAdd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpSub(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseShiftLeft(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseShiftRight(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseAnd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseXor(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseOr(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanAnd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanOr(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeLength(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeLengthBytes(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeTo(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*******************************************************************************
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx* Defined Constants And Macros *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx*******************************************************************************/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Generic implementation of a binary operator.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param Operator The C operator.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param fIsDiv Set if it's division and we need to check for zero on the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * right hand side.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, Operator, fIsDiv) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Get the 64-bit right side value. */ \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint64_t u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcOpHelperGetNumber((pDbgc), (pArg2), &u64Right); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((fIsDiv) && RT_SUCCESS(rc) && !u64Right) /* div/0 kludge */ \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER((pResult), UINT64_MAX); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else if (RT_SUCCESS(rc)) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Apply it to the left hand side. */ \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( (pArg1)->enmType == DBGCVAR_TYPE_SYMBOL \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx || (pArg1)->enmType == DBGCVAR_TYPE_STRING) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet((pDbgc), (pArg1)->u.pszString, DBGCVAR_TYPE_ANY, (pResult)); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc)) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *(pResult) = *(pArg1); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch ((pResult)->enmType) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.GCFlat = (pResult)->u.GCFlat Operator u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.GCFar.off = (pResult)->u.GCFar.off Operator u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.GCPhys = (pResult)->u.GCPhys Operator u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.pvHCFlat = (void *)((uintptr_t)(pResult)->u.pvHCFlat Operator u64Right); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.HCPhys = (pResult)->u.HCPhys Operator u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pResult)->u.u64Number = (pResult)->u.u64Number Operator u64Right; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default: \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } while (0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Switch the factors/whatever so we preserve pointers.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Far pointers are considered more important that physical and flat pointers.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The left side argument. Input & output.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The right side argument. Input & output.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define DBGC_GEN_ARIT_POINTER_TO_THE_LEFT(pArg1, pArg2) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( DBGCVAR_ISPOINTER((pArg2)->enmType) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && ( !DBGCVAR_ISPOINTER((pArg1)->enmType) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx || ( DBGCVAR_IS_FAR_PTR((pArg2)->enmType) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && !DBGCVAR_IS_FAR_PTR((pArg1)->enmType)))) \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PCDBGCVAR pTmp = (pArg1); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pArg2) = (pArg1); \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (pArg1) = pTmp; \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } while (0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*******************************************************************************
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx* Global Variables *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx*******************************************************************************/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/** Operators. */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxconst DBGCOP g_aOps[] =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* szName is initialized as a 4 char array because of M$C elsewise optimizing it away in /Ox mode (the 'const char' vs 'char' problem). */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* szName, cchName, fBinary, iPrecedence, pfnHandlerUnary, pfnHandlerBitwise */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'-'}, 1, false, 1, dbgcOpMinus, NULL, "Unary minus." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'+'}, 1, false, 1, dbgcOpPluss, NULL, "Unary plus." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'!'}, 1, false, 1, dbgcOpBooleanNot, NULL, "Boolean not." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'~'}, 1, false, 1, dbgcOpBitwiseNot, NULL, "Bitwise complement." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {':'}, 1, true, 2, NULL, dbgcOpAddrFar, "Far pointer." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'%'}, 1, false, 3, dbgcOpAddrFlat, NULL, "Flat address." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'%','%'}, 2, false, 3, dbgcOpAddrPhys, NULL, "Physical address." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'#'}, 1, false, 3, dbgcOpAddrHost, NULL, "Flat host address." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'#','%','%'}, 3, false, 3, dbgcOpAddrHostPhys, NULL, "Physical host address." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'$'}, 1, false, 3, dbgcOpVar, NULL, "Reference a variable." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'@'}, 1, false, 3, dbgcOpRegister, NULL, "Reference a register." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'*'}, 1, true, 10, NULL, dbgcOpMult, "Multiplication." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'/'}, 1, true, 11, NULL, dbgcOpDiv, "Division." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'%'}, 1, true, 12, NULL, dbgcOpMod, "Modulus." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'+'}, 1, true, 13, NULL, dbgcOpAdd, "Addition." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'-'}, 1, true, 14, NULL, dbgcOpSub, "Subtraction." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'<','<'}, 2, true, 15, NULL, dbgcOpBitwiseShiftLeft, "Bitwise left shift." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'>','>'}, 2, true, 16, NULL, dbgcOpBitwiseShiftRight, "Bitwise right shift." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'&'}, 1, true, 17, NULL, dbgcOpBitwiseAnd, "Bitwise and." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'^'}, 1, true, 18, NULL, dbgcOpBitwiseXor, "Bitwise exclusiv or." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'|'}, 1, true, 19, NULL, dbgcOpBitwiseOr, "Bitwise inclusive or." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'&','&'}, 2, true, 20, NULL, dbgcOpBooleanAnd, "Boolean and." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'|','|'}, 2, true, 21, NULL, dbgcOpBooleanOr, "Boolean or." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'L'}, 1, true, 22, NULL, dbgcOpRangeLength, "Range elements." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'L','B'}, 2, true, 23, NULL, dbgcOpRangeLengthBytes, "Range bytes." },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx { {'T'}, 1, true, 24, NULL, dbgcOpRangeTo, "Range to." }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/** Number of operators in the operator array. */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxconst unsigned g_cOps = RT_ELEMENTS(g_aOps);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Converts an argument to a number value.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox status code.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc The DBGC instance.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument to convert.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pu64Ret Where to return the value.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic int dbgcOpHelperGetNumber(PDBGC pDbgc, PCDBGCVAR pArg, uint64_t *pu64Ret)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var = *pArg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (Var.enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = Var.u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = Var.u.GCFar.off;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = Var.u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = (uintptr_t)Var.u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = Var.u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_SYMBOL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, Var.u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* fall thru */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pu64Ret = Var.u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Minus (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMinus(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpMinus\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat = -(RTGCINTPTR)pResult->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off = -(int32_t)pResult->u.GCFar.off;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCPhys = (RTGCPHYS) -(int64_t)pResult->u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.pvHCFlat = (void *) -(intptr_t)pResult->u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.HCPhys = (RTHCPHYS) -(int64_t)pResult->u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = -(int64_t)pResult->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NOREF(pDbgc);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Plus (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpPluss(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpPluss\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NOREF(pDbgc);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Boolean not (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanNot(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBooleanNot\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.GCFar.off && pResult->u.GCFar.sel <= 3;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = !pResult->u64Range;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmType = DBGCVAR_TYPE_NUMBER;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NOREF(pDbgc);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise not (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseNot(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseNot\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat = ~pResult->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off = ~pResult->u.GCFar.off;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCPhys = ~pResult->u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.pvHCFlat = (void *)~(uintptr_t)pResult->u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.HCPhys = ~pResult->u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number = ~pResult->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NOREF(pDbgc);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Reference variable (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpVar(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpVar: %s\n", pArg->u.pszString));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Parse sanity.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pArg->enmType != DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Lookup the variable.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *pszVar = pArg->u.pszString;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (unsigned iVar = 0; iVar < pDbgc->cVars; iVar++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!strcmp(pszVar, pDbgc->papVars[iVar]->szName))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = pDbgc->papVars[iVar]->Var;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_VARIABLE_NOT_FOUND;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Reference register (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxDECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpRegister: %s\n", pArg->u.pszString));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Parse sanity.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( pArg->enmType != DBGCVAR_TYPE_STRING
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && pArg->enmType != DBGCVAR_TYPE_SYMBOL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Get the register.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGFREGVALTYPE enmType;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGFREGVAL Value;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = DBGFR3RegNmQuery(pDbgc->pVM, pDbgc->idCpu, pArg->u.pszString, &Value, &enmType);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_SUCCESS(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_U8:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.u8);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_U16:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.u16);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_U32:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.u32);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_U64:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.u64);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_U128:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.u128.s.Lo);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_R80:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#ifdef RT_COMPILER_WITH_80BIT_LONG_DOUBLE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, (uint64_t)Value.r80.lrd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, (uint64_t)Value.r80.sj64.u63Fraction);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#endif
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_DTR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR_INIT_NUMBER(pResult, Value.dtr.u64Base);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_INVALID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_END:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGFREGVALTYPE_32BIT_HACK:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = VERR_INTERNAL_ERROR_5;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Flat address (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxDECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAddrFlat\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVARTYPE enmType = DBGCVAR_ISHCPOINTER(pArg->enmType) ? DBGCVAR_TYPE_HC_FLAT : DBGCVAR_TYPE_GC_FLAT;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return DBGCCmdHlpConvert(&pDbgc->CmdHlp, pArg, enmType, true /*fConvSyms*/, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Physical address (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxDECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAddrPhys\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVARTYPE enmType = DBGCVAR_ISHCPOINTER(pArg->enmType) ? DBGCVAR_TYPE_HC_PHYS : DBGCVAR_TYPE_GC_PHYS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return DBGCCmdHlpConvert(&pDbgc->CmdHlp, pArg, enmType, true /*fConvSyms*/, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Physical host address (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxDECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAddrPhys\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return DBGCCmdHlpConvert(&pDbgc->CmdHlp, pArg, DBGCVAR_TYPE_HC_PHYS, true /*fConvSyms*/, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Host address (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxDECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAddrHost\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return DBGCCmdHlpConvert(&pDbgc->CmdHlp, pArg, DBGCVAR_TYPE_HC_FLAT, true /*fConvSyms*/, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise not (unary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg The argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpAddrFar(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAddrFar\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg1->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet(pDbgc, pArg1->u.pszString, DBGCVAR_TYPE_NUMBER, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.sel = (RTSEL)pResult->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* common code for the two types we support. */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off = pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmType = DBGCVAR_TYPE_GC_FAR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.pvHCFlat = (void *)(uintptr_t)pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmType = DBGCVAR_TYPE_GC_FAR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off = (RTGCPTR)pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmType = DBGCVAR_TYPE_GC_FAR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off = (RTGCPTR)Var.u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmType = DBGCVAR_TYPE_GC_FAR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_UNKNOWN:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INCORRECT_ARG_TYPE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Multiplication operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMult(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpMult\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_POINTER_TO_THE_LEFT(pArg1, pArg2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, *, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Division operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpDiv(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpDiv\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, /, true);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Modulus operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpMod(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpMod\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, %, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Addition operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpAdd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpAdd\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * An addition operation will return (when possible) the left side type in the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * expression. We make an omission for numbers, where we'll take the right side
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * type instead. An expression where only the left hand side is a string we'll
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * use the right hand type assuming that the string is a symbol.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( (pArg1->enmType == DBGCVAR_TYPE_NUMBER && pArg2->enmType != DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx || (pArg1->enmType == DBGCVAR_TYPE_STRING && pArg2->enmType != DBGCVAR_TYPE_STRING))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PCDBGCVAR pTmp = pArg2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg2 = pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg1 = pTmp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Sym1, Sym2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pArg1->enmType == DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, pArg1->u.pszString, DBGCVAR_TYPE_ANY, &Sym1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg1 = &Sym1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_ANY, &Sym2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg2 = &Sym2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg1->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Flat
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat += pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Far
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off += (RTGCPTR)pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg1, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat += pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Phys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrPhys(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (Var.enmType != DBGCVAR_TYPE_GC_PHYS)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCPhys += Var.u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * HC Flat
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrHost(pDbgc, pArg2, &Var2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, &Var2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.pvHCFlat = (char *)pResult->u.pvHCFlat + (uintptr_t)Var.u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * HC Phys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrHostPhys(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.HCPhys += Var.u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Numbers (see start of function)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_SYMBOL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number += pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Subtraction operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpSub(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpSub\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * An subtraction operation will return the left side type in the expression.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * However, if the left hand side is a number and the right hand a pointer of
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * some kind we'll convert the left hand side to the same type as the right hand.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Any strings will be attempted resolved as symbols.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Sym1, Sym2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( pArg2->enmType == DBGCVAR_TYPE_STRING
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && ( pArg1->enmType == DBGCVAR_TYPE_NUMBER
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx || pArg1->enmType == DBGCVAR_TYPE_STRING))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_ANY, &Sym2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg2 = &Sym2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pArg1->enmType == DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVARTYPE enmType;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx enmType = DBGCVAR_TYPE_ANY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx enmType = pArg2->enmType;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx enmType = DBGCVAR_TYPE_GC_FLAT;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AssertMsgFailed(("Can't happen\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx enmType = DBGCVAR_TYPE_STRING;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (enmType != DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, pArg1->u.pszString, DBGCVAR_TYPE_ANY, &Sym1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg1 = &Sym1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else if (pArg1->enmType == DBGCVAR_TYPE_NUMBER)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PFNDBGCOPUNARY pOp = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pOp = dbgcOpAddrFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pOp = dbgcOpAddrPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pOp = dbgcOpAddrHost;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pOp = dbgcOpAddrHostPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AssertMsgFailed(("Can't happen\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pOp)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = pOp(pDbgc, pArg1, &Sym1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pArg1 = &Sym1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Normal processing.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Var2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg1->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Flat
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat -= pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Far
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFar.off -= (RTGCPTR)pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg1, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCFlat -= pArg2->u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * GC Phys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrPhys(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (Var.enmType != DBGCVAR_TYPE_GC_PHYS)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.GCPhys -= Var.u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * HC Flat
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrHost(pDbgc, pArg2, &Var2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrFlat(pDbgc, &Var2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.pvHCFlat = (char *)pResult->u.pvHCFlat - (uintptr_t)Var.u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * HC Phys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcOpAddrHostPhys(pDbgc, pArg2, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.HCPhys -= Var.u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Numbers (see start of function)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_SYMBOL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u.u64Number -= pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise shift left operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseShiftLeft(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseShiftLeft\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, <<, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise shift right operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseShiftRight(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseShiftRight\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, >>, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise and operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseAnd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseAnd\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_POINTER_TO_THE_LEFT(pArg1, pArg2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, &, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise exclusive or operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseXor(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseXor\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_POINTER_TO_THE_LEFT(pArg1, pArg2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, ^, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Bitwise inclusive or operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBitwiseOr(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBitwiseOr\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_POINTER_TO_THE_LEFT(pArg1, pArg2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, |, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Boolean and operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanAnd(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBooleanAnd\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /** @todo force numeric return value? */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, &&, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Boolean or operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpBooleanOr(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpBooleanOr\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /** @todo force numeric return value? */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGC_GEN_ARIT_BINARY_OP(pDbgc, pArg1, pArg2, pResult, ||, false);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Range to operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeLength(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpRangeLength\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Make result. Strings needs to be resolved into symbols.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pArg1->enmType == DBGCVAR_TYPE_STRING)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, pArg1->u.pszString, DBGCVAR_TYPE_ANY, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Convert 2nd argument to element count.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmRangeType = DBGCVAR_RANGE_ELEMENTS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (pArg2->enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = pArg2->u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Range to operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeLengthBytes(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpRangeLengthBytes\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcOpRangeLength(pDbgc, pArg1, pArg2, pResult);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_SUCCESS(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmRangeType = DBGCVAR_RANGE_BYTES;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Range to operator (binary).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VINF_SUCCESS on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns VBox evaluation / parsing error code on failure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The caller does the bitching.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc Debugger console instance data.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg1 The first argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pArg2 The 2nd argument.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pResult Where to store the result.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic DECLCALLBACK(int) dbgcOpRangeTo(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LogFlow(("dbgcOpRangeTo\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Calc number of bytes between the two args.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DBGCVAR Diff;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rc = dbgcOpSub(pDbgc, pArg2, pArg1, &Diff);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (RT_FAILURE(rc))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return rc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Use the diff as the range of Arg1.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pResult = *pArg1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->enmRangeType = DBGCVAR_RANGE_BYTES;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (Diff.enmType)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = (RTGCUINTPTR)Diff.u.GCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = Diff.u.GCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_FLAT:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = (uintptr_t)Diff.u.pvHCFlat;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_HC_PHYS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = Diff.u.HCPhys;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_NUMBER:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pResult->u64Range = Diff.u.u64Number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_GC_FAR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case DBGCVAR_TYPE_STRING:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AssertMsgFailed(("Impossible!\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VERR_PARSE_INVALID_OPERATION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return VINF_SUCCESS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/**
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Searches for an operator descriptor which matches the start of
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the expression given us.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @returns Pointer to the operator on success.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pDbgc The debug console instance.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param pszExpr Pointer to the expression string which might start with an operator.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param fPreferBinary Whether to favour binary or unary operators.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Caller must assert that it's the desired type! Both types will still
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * be returned, this is only for resolving duplicates.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * @param chPrev The previous char. Some operators requires a blank in front of it.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxPCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PCDBGCOP pOp = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (unsigned iOp = 0; iOp < RT_ELEMENTS(g_aOps); iOp++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( g_aOps[iOp].szName[0] == pszExpr[0]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && (!g_aOps[iOp].szName[1] || g_aOps[iOp].szName[1] == pszExpr[1])
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && (!g_aOps[iOp].szName[2] || g_aOps[iOp].szName[2] == pszExpr[2]))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Check that we don't mistake it for some other operator which have more chars.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx unsigned j;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = iOp + 1; j < RT_ELEMENTS(g_aOps); j++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ( g_aOps[j].cchName > g_aOps[iOp].cchName
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && g_aOps[j].szName[0] == pszExpr[0]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && (!g_aOps[j].szName[1] || g_aOps[j].szName[1] == pszExpr[1])
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx && (!g_aOps[j].szName[2] || g_aOps[j].szName[2] == pszExpr[2]) )
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j < RT_ELEMENTS(g_aOps))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue; /* we'll catch it later. (for theoretical +,++,+++ cases.) */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pOp = &g_aOps[iOp];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Preferred type?
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (g_aOps[iOp].fBinary == fPreferBinary)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pOp)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx Log2(("dbgcOperatorLookup: pOp=%p %s\n", pOp, pOp->szName));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NOREF(pDbgc); NOREF(chPrev);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return pOp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx