DBGFReg.cpp revision 6ca8a1595bddf29de7894958ae74c255eb2693be
2N/A * available from http://www.virtualbox.org. This file is free software;
2N/A#include "DBGFInternal.h"
typedef enum DBGFREGSETTYPE
typedef struct DBGFREGSET
void *pv;
} uUserArg;
} DBGFREGSET;
char ch;
static int dbgfR3RegRegisterCommon(PVM pVM, PCDBGFREGDESC paRegisters, DBGFREGSETTYPE enmType, void *pvUserArg, const char *pszPrefix, uint32_t iInstance)
AssertMsgReturn(cchPrefix < RT_SIZEOFMEMB(DBGFREGSET, szPrefix) - 4 - 1, ("%s\n", pszPrefix), VERR_INVALID_NAME);
AssertMsgReturn(dbgfR3RegIsNameValid(paRegisters[iDesc].pszName), ("%s (#%u)\n", paRegisters[iDesc].pszName, iDesc), VERR_INVALID_NAME);
if (paAliases)
AssertMsgReturn(dbgfR3RegIsNameValid(paAliases[j].pszName), ("%s (%s)\n", paAliases[j].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
if (paSubFields)
AssertMsgReturn(dbgfR3RegIsNameValid(paSubFields[j].pszName), ("%s (%s)\n", paSubFields[j].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
PDBGFREGSET pRegRec = (PDBGFREGSET)MMR3HeapAlloc(pVM, MM_TAG_DBGF_REG, RT_OFFSETOF(DBGFREGSET, szPrefix[cchPrefix + 4 + 1]));
if (!pRegRec)
return VERR_NO_MEMORY;
if (fNeedUnderscore)
if (fInserted)
return VINF_SUCCESS;
return VERR_DUPLICATE;
return dbgfR3RegRegisterCommon(pVCpu->pVMR3, paRegisters, DBGFREGSETTYPE_CPU, pVCpu, "cpu", pVCpu->idCpu);
VMMR3DECL(int) DBGFR3RegRegisterDevice(PVM pVM, PCDBGFREGDESC paRegisters, PPDMDEVINS pDevIns, const char *pszPrefix, uint32_t iInstance)
return dbgfR3RegRegisterCommon(pVM, paRegisters, DBGFREGSETTYPE_DEVICE, pDevIns, pszPrefix, iInstance);
static int dbgfR3RegValCast(PDBGFREGVAL pValue, DBGFREGVALTYPE enmFromType, DBGFREGVALTYPE enmToType)
switch (enmFromType)
case DBGFREGVALTYPE_U8:
switch (enmToType)
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_U16:
switch (enmToType)
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_U32:
switch (enmToType)
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_U64:
switch (enmToType)
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_U128:
switch (enmToType)
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_80:
return VERR_DBGF_UNSUPPORTED_CAST;
case DBGFREGVALTYPE_LRD:
switch (enmToType)
case DBGFREGVALTYPE_U128:
return VINF_DBGF_TRUNCATED_REGISTER;
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_DTR:
switch (enmToType)
case DBGFREGVALTYPE_U128: pValue->u128.s.Lo = InVal.dtr.u64Base; return VINF_DBGF_TRUNCATED_REGISTER;
case DBGFREGVALTYPE_END:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_INVALID:
case DBGFREGVALTYPE_END:
return VERR_DBGF_UNSUPPORTED_CAST;
static DECLCALLBACK(int) dbgfR3RegCpuQueryWorker(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, DBGFREGVALTYPE enmType, PDBGFREGVAL puValue)
return rc;
int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U8, &Value);
*pu8 = 0;
return rc;
int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U16, &Value);
*pu16 = 0;
return rc;
int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U32, &Value);
*pu32 = 0;
return rc;
int rc = VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryWorker, 5, pVM, idCpu, enmReg, DBGFREGVALTYPE_U64, &Value);
*pu64 = 0;
return rc;
static DECLCALLBACK(int) dbgfR3RegCpuQueryBatchWorker(PVM pVM, VMCPUID idCpu, PDBGFREGENTRY paRegs, size_t cRegs)
while (cRegs-- > 0)
pReg++;
AssertMsgReturn(enmReg >= 0 && enmReg <= DBGFREG_END, ("%d (%#x)\n", enmReg, enmReg), VERR_DBGF_INVALID_REGISTER);
case DBGFREGVALTYPE_U128:
case DBGFREGVALTYPE_LRD:
return rc;
return VINF_SUCCESS;
return VERR_NOT_IMPLEMENTED;
if (!cRegs)
return VINF_SUCCESS;
while (iReg-- > 0)
AssertMsgReturn(enmReg < DBGFREG_END && enmReg >= DBGFREG_AL, ("%d (%#x)", enmReg, enmReg), VERR_DBGF_INVALID_REGISTER);
return VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryBatchWorker, 4, pVM, idCpu, paRegs, cRegs);
if (!cRegs)
return VINF_SUCCESS;
unsigned iReg = 0;
iReg++;
return VMR3ReqCallWait(pVM, idCpu, (PFNRT)dbgfR3RegCpuQueryBatchWorker, 4, pVM, idCpu, paRegs, cRegs);
if ( pAlias
pAlias++;
return NULL;