VirtualBox

Changeset 69582 in vbox


Ignore:
Timestamp:
Nov 4, 2017 8:41:14 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
118932
Message:

VBoxCpuReport: Made MSR probing interface more modular, added Linux-specific /dev/msr backend. Further work coming.

Location:
trunk/src/VBox/VMM/tools
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/tools/Makefile.kmk

    r69111 r69582  
    6060VBoxCpuReport_SOURCES   = \
    6161        VBoxCpuReport.cpp \
     62        MsrSup.cpp        \
    6263       ../VMMR3/CPUMR3CpuId.cpp
     64VBoxCpuReport_SOURCES.linux = MsrLinux.cpp
     65VBoxCpuReport_DEFS.linux    = VBCR_HAVE_PLATFORM_MSR_PROBER
    6366VBoxCpuReport_LIBS      = \
    6467        $(PATH_STAGE_LIB)/SUPR3Static$(VBOX_SUFF_LIB) \
  • trunk/src/VBox/VMM/tools/VBoxCpuReport.cpp

    r69221 r69582  
    4040#include <VBox/sup.h>
    4141
     42#include "VBoxCpuReport.h"
    4243
    4344/*********************************************************************************************************************************
     
    7778static uint64_t         g_uMsrIntelP6FsbFrequency = UINT64_MAX;
    7879
    79 
    80 static void vbCpuRepDebug(const char *pszMsg, ...)
     80/** MSR prober routines. */
     81static VBMSRFNS         g_MsrAcc;
     82
     83
     84void vbCpuRepDebug(const char *pszMsg, ...)
    8185{
    8286    va_list va;
     
    102106
    103107
    104 static void vbCpuRepPrintf(const char *pszMsg, ...)
     108void vbCpuRepPrintf(const char *pszMsg, ...)
    105109{
    106110    va_list va;
     
    219223{
    220224    bool fGp;
    221     int rc = SUPR3MsrProberWrite(uMsr, NIL_RTCPUID, uValue, &fGp);
     225    int rc = g_MsrAcc.msrWrite(uMsr, NIL_RTCPUID, uValue, &fGp);
    222226    AssertRC(rc);
    223227    return RT_SUCCESS(rc) && !fGp;
     
    230234    *puValue = 0;
    231235    bool fGp;
    232     int rc = SUPR3MsrProberRead(uMsr, NIL_RTCPUID, puValue, &fGp);
     236    int rc = g_MsrAcc.msrRead(uMsr, NIL_RTCPUID, puValue, &fGp);
    233237    AssertRC(rc);
    234238    return RT_SUCCESS(rc) && !fGp;
     
    240244{
    241245    SUPMSRPROBERMODIFYRESULT Result;
    242     int rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, UINT64_MAX, 0, &Result);
     246    int rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, UINT64_MAX, 0, &Result);
    243247    return RT_SUCCESS(rc)
    244248        && !Result.fBeforeGp
     
    253257{
    254258    SUPMSRPROBERMODIFYRESULT Result;
    255     int rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, 0, 0, &Result);
     259    int rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, 0, 0, &Result);
    256260    return RT_SUCCESS(rc)
    257261        && !Result.fBeforeGp
     
    281285        /* Set it. */
    282286        SUPMSRPROBERMODIFYRESULT ResultSet;
    283         int rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, ~fBitMask, fBitMask, &ResultSet);
     287        int rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, ~fBitMask, fBitMask, &ResultSet);
    284288        if (RT_FAILURE(rc))
    285             return RTMsgErrorRc(rc, "SUPR3MsrProberModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, fBitMask, rc);
     289            return RTMsgErrorRc(rc, "msrModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, fBitMask, rc);
    286290
    287291        /* Clear it. */
    288292        SUPMSRPROBERMODIFYRESULT ResultClear;
    289         rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, ~fBitMask, 0, &ResultClear);
     293        rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, ~fBitMask, 0, &ResultClear);
    290294        if (RT_FAILURE(rc))
    291             return RTMsgErrorRc(rc, "SUPR3MsrProberModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, 0, rc);
     295            return RTMsgErrorRc(rc, "msrModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, 0, rc);
    292296
    293297        if (ResultSet.fModifyGp || ResultClear.fModifyGp)
     
    324328    /* Set it. */
    325329    SUPMSRPROBERMODIFYRESULT ResultSet;
    326     int rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, ~fBitMask, fBitMask, &ResultSet);
     330    int rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, ~fBitMask, fBitMask, &ResultSet);
    327331    if (RT_FAILURE(rc))
    328         return RTMsgErrorRc(-2, "SUPR3MsrProberModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, fBitMask, rc);
     332        return RTMsgErrorRc(-2, "msrModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, fBitMask, rc);
    329333
    330334    /* Clear it. */
    331335    SUPMSRPROBERMODIFYRESULT ResultClear;
    332     rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, ~fBitMask, 0, &ResultClear);
     336    rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, ~fBitMask, 0, &ResultClear);
    333337    if (RT_FAILURE(rc))
    334         return RTMsgErrorRc(-2, "SUPR3MsrProberModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, 0, rc);
     338        return RTMsgErrorRc(-2, "msrModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, ~fBitMask, 0, rc);
    335339
    336340    if (ResultSet.fModifyGp || ResultClear.fModifyGp)
     
    363367{
    364368    SUPMSRPROBERMODIFYRESULT Result;
    365     int rc = SUPR3MsrProberModify(uMsr, NIL_RTCPUID, fAndMask, fOrMask, &Result);
     369    int rc = g_MsrAcc.msrModify(uMsr, NIL_RTCPUID, fAndMask, fOrMask, &Result);
    366370    if (RT_FAILURE(rc))
    367371    {
    368         RTMsgError("SUPR3MsrProberModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, fAndMask, fOrMask, rc);
     372        RTMsgError("g_MsrAcc.msrModify(%#x,,%#llx,%#llx,): %Rrc", uMsr, fAndMask, fOrMask, rc);
    369373        return false;
    370374    }
     
    531535                uint64_t uValue = 0;
    532536                bool     fGp    = true;
    533                 int rc = SUPR3MsrProberRead(uMsr, NIL_RTCPUID, &uValue, &fGp);
     537                int rc = g_MsrAcc.msrRead(uMsr, NIL_RTCPUID, &uValue, &fGp);
    534538                if (RT_FAILURE(rc))
    535539                {
    536540                    RTMemFree(*ppaMsrs);
    537541                    *ppaMsrs = NULL;
    538                     return RTMsgErrorRc(rc, "SUPR3MsrProberRead failed on %#x: %Rrc\n", uMsr, rc);
     542                    return RTMsgErrorRc(rc, "msrRead failed on %#x: %Rrc\n", uMsr, rc);
    539543                }
    540544
     
    562566#endif
    563567                    fGp = true;
    564                     rc = SUPR3MsrProberWrite(uMsr, NIL_RTCPUID, 0, &fGp);
     568                    rc = g_MsrAcc.msrWrite(uMsr, NIL_RTCPUID, 0, &fGp);
    565569                    if (RT_FAILURE(rc))
    566570                    {
    567571                        RTMemFree(*ppaMsrs);
    568572                        *ppaMsrs = NULL;
    569                         return RTMsgErrorRc(rc, "SUPR3MsrProberWrite failed on %#x: %Rrc\n", uMsr, rc);
     573                        return RTMsgErrorRc(rc, "msrWrite failed on %#x: %Rrc\n", uMsr, rc);
    570574                    }
    571575                    uValue = 0;
     
    43434347
    43444348    /*
    4345      * Initialize the support library and check if we can read MSRs.
     4349     * First try the the support library (also checks if we can really read MSRs).
    43464350     */
    4347     int rc = SUPR3Init(NULL);
     4351    int rc = SupDrvMsrProberInit(&g_MsrAcc);
    43484352    if (RT_FAILURE(rc))
    43494353    {
    4350         vbCpuRepDebug("warning: Unable to initialize the support library (%Rrc), skipping MSR detection.\n", rc);
    4351         return VINF_SUCCESS;
    4352     }
     4354#ifdef VBCR_HAVE_PLATFORM_MSR_PROBER
     4355        /* Next try a platform-specific interface. */
     4356        rc = PlatformMsrProberInit(&g_MsrAcc);
     4357#endif
     4358        if (RT_FAILURE(rc))
     4359        {
     4360            vbCpuRepDebug("warning: Unable to initialize any MSR access interface (%Rrc), skipping MSR detection.\n", rc);
     4361            return VINF_SUCCESS;
     4362        }
     4363    }
     4364
    43534365    uint64_t uValue;
    43544366    bool     fGp;
    4355     rc = SUPR3MsrProberRead(MSR_IA32_TSC, NIL_RTCPUID, &uValue, &fGp);
     4367    rc = g_MsrAcc.msrRead(MSR_IA32_TSC, NIL_RTCPUID, &uValue, &fGp);
    43564368    if (RT_FAILURE(rc))
    43574369    {
     
    43604372    }
    43614373    vbCpuRepDebug("MSR_IA32_TSC: %#llx fGp=%RTbool\n", uValue, fGp);
    4362     rc = SUPR3MsrProberRead(0xdeadface, NIL_RTCPUID, &uValue, &fGp);
     4374    rc = g_MsrAcc.msrRead(0xdeadface, NIL_RTCPUID, &uValue, &fGp);
    43634375    vbCpuRepDebug("0xdeadface: %#llx fGp=%RTbool rc=%Rrc\n", uValue, fGp, rc);
    43644376
     
    43974409        uint32_t        cMsrs;
    43984410        rc = findMsrs(&paMsrs, &cMsrs, fMsrMask);
    4399         if (RT_FAILURE(rc))
     4411        if (!RT_FAILURE(rc))
    44004412            return rc;
    44014413
     
    44184430        paMsrs = NULL;
    44194431    }
     4432    g_MsrAcc.msrProberTerm();
     4433    RT_ZERO(g_MsrAcc);
    44204434    return rc;
    44214435}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette