VMMRCTestTestWriteMsr(PVM pVM, uint32_t uMsr, uint32_t u32ValueLow, uint32_t u32ValueHi, uint64_t *puValueBefore, uint64_t *puValueAfter) { AssertPtrReturn(puValueBefore, VERR_INVALID_POINTER); AssertPtrReturn(puValueAfter, VERR_INVALID_POINTER); ASMIntDisable(); RT_NOREF_PV(pVM); int rc = VINF_SUCCESS; uint64_t uValueBefore = UINT64_MAX; uint64_t uValueAfter = UINT64_MAX; if (vmmRCSafeMsrRead(uMsr, &uValueBefore)) { if (!vmmRCSafeMsrWrite(uMsr, RT_MAKE_U64(u32ValueLow, u32ValueHi))) rc = VERR_WRITE_PROTECT; if (!vmmRCSafeMsrRead(uMsr, &uValueAfter) && RT_SUCCESS(rc)) rc = VERR_READ_ERROR; vmmRCSafeMsrWrite(uMsr, uValueBefore); } else rc = VERR_ACCESS_DENIED; *puValueBefore = uValueBefore; *puValueAfter = uValueAfter; return rc; }
VMMRCTestReadMsrs(PVM pVM, uint32_t uMsr, uint32_t cMsrs, PVMMTESTMSRENTRY paResults) { AssertReturn(cMsrs <= 16384, VERR_INVALID_PARAMETER); AssertPtrReturn(paResults, VERR_INVALID_POINTER); ASMIntEnable(); /* Run with interrupts enabled, so we can query more MSRs in one block. */ for (uint32_t i = 0; i < cMsrs; i++, uMsr++) { if (vmmRCSafeMsrRead(uMsr, &paResults[i].uValue)) paResults[i].uMsr = uMsr; else paResults[i].uMsr = UINT64_MAX; } ASMIntDisable(); return VINF_SUCCESS; }