コード例 #1
0
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;
}
コード例 #2
0
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;
}