/** * @callback_method_impl{The randu32() function implementation.} */ static DECLCALLBACK(int) dbgcFuncRandU32(PCDBGCFUNC pFunc, PDBGCCMDHLP pCmdHlp, PUVM pUVM, PCDBGCVAR paArgs, uint32_t cArgs, PDBGCVAR pResult) { AssertReturn(cArgs == 0, VERR_DBGC_PARSE_BUG); uint32_t u32 = RTRandU32(); DBGCVAR_INIT_NUMBER(pResult, u32); NOREF(pFunc); NOREF(pCmdHlp); NOREF(pUVM); NOREF(paArgs); return VINF_SUCCESS; }
/** * @callback_method_impl{FNDBGCOPUNARY, Reference register (unary).} */ DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult) { LogFlow(("dbgcOpRegister: %s\n", pArg->u.pszString)); AssertReturn(pArg->enmType == DBGCVAR_TYPE_SYMBOL, VERR_DBGC_PARSE_BUG); /* Detect references to hypervisor registers. */ const char *pszReg = pArg->u.pszString; VMCPUID idCpu = pDbgc->idCpu; if (pszReg[0] == '.') { pszReg++; idCpu |= DBGFREG_HYPER_VMCPUID; } /* * If the desired result is a symbol, pass the argument along unmodified. * This is a great help for "r @eax" and such, since it will be translated to "r eax". */ if (enmCat == DBGCVAR_CAT_SYMBOL) { int rc = DBGFR3RegNmValidate(pDbgc->pUVM, idCpu, pszReg); if (RT_SUCCESS(rc)) DBGCVAR_INIT_STRING(pResult, pArg->u.pszString); return rc; } /* * Get the register. */ DBGFREGVALTYPE enmType; DBGFREGVAL Value; int rc = DBGFR3RegNmQuery(pDbgc->pUVM, idCpu, pszReg, &Value, &enmType); if (RT_SUCCESS(rc)) { switch (enmType) { case DBGFREGVALTYPE_U8: DBGCVAR_INIT_NUMBER(pResult, Value.u8); return VINF_SUCCESS; case DBGFREGVALTYPE_U16: DBGCVAR_INIT_NUMBER(pResult, Value.u16); return VINF_SUCCESS; case DBGFREGVALTYPE_U32: DBGCVAR_INIT_NUMBER(pResult, Value.u32); return VINF_SUCCESS; case DBGFREGVALTYPE_U64: DBGCVAR_INIT_NUMBER(pResult, Value.u64); return VINF_SUCCESS; case DBGFREGVALTYPE_U128: DBGCVAR_INIT_NUMBER(pResult, Value.u128.s.Lo); return VINF_SUCCESS; case DBGFREGVALTYPE_R80: #ifdef RT_COMPILER_WITH_80BIT_LONG_DOUBLE DBGCVAR_INIT_NUMBER(pResult, (uint64_t)Value.r80Ex.lrd); #else DBGCVAR_INIT_NUMBER(pResult, (uint64_t)Value.r80Ex.sj64.u63Fraction); #endif return VINF_SUCCESS; case DBGFREGVALTYPE_DTR: DBGCVAR_INIT_NUMBER(pResult, Value.dtr.u64Base); return VINF_SUCCESS; case DBGFREGVALTYPE_INVALID: case DBGFREGVALTYPE_END: case DBGFREGVALTYPE_32BIT_HACK: break; } rc = VERR_INTERNAL_ERROR_5; } return rc; }