VirtualBox

Changeset 61575 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Jun 8, 2016 12:43:19 PM (9 years ago)
Author:
vboxsync
Message:

VMM/APIC: Better formatted LVT debugger info dumps and also use the new DBGFINFO_FLAGS_ALL_EMTS flag for the info callbacks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r61566 r61575  
    412412{
    413413    NOREF(pszArgs);
    414     PVMCPU       pVCpu       = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu));
     414    PVMCPU pVCpu = VMMGetCpu(pVM);
     415    if (!pVCpu)
     416        pVCpu = &pVM->aCpus[0];
     417
    415418    PCAPICCPU    pApicCpu    = VMCPU_TO_APICCPU(pVCpu);
    416419    PCXAPICPAGE  pXApicPage  = VMCPU_TO_CXAPICPAGE(pVCpu);
     
    512515    pHlp->pfnPrintf(pHlp, "  Timer Mode       = %#x (%s)\n", pXApicPage->lvt_timer.u.u2TimerMode,
    513516                    apicGetTimerModeName((XAPICTIMERMODE)pXApicPage->lvt_timer.u.u2TimerMode));
    514     pHlp->pfnPrintf(pHlp, "\n");
    515517}
    516518
     
    526528{
    527529    NOREF(pszArgs);
    528     PVMCPU      pVCpu      = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu));
     530    PVMCPU pVCpu = VMMGetCpu(pVM);
     531    if (!pVCpu)
     532        pVCpu = &pVM->aCpus[0];
     533
    529534    PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu);
    530535
    531     apicR3InfoLvtTimer(pVCpu, pHlp);
     536    /*
     537     * Delivery modes available in the LVT entries. They're different (more reserved stuff) from the
     538     * ICR delivery modes and hence we don't use apicGetDeliveryMode but mostly because we want small,
     539     * fixed-length strings to fit our formatting needs here.
     540     */
     541    static const char * const s_apszLvtDeliveryModes[] =
     542    {
     543        "Fixed ",
     544        "Rsvd  ",
     545        "SMI   ",
     546        "Rsvd  ",
     547        "NMI   ",
     548        "INIT  ",
     549        "Rsvd  ",
     550        "ExtINT"
     551    };
     552    /* Delivery Status. */
     553    static const char * const s_apszLvtDeliveryStatus[] =
     554    {
     555        "Idle",
     556        "Pend"
     557    };
     558    const char *pszNotApplicable = "";
     559
     560    pHlp->pfnPrintf(pHlp, "APIC Local Vector Table (LVT):\n");
     561    pHlp->pfnPrintf(pHlp, "lvt     timermode  mask  trigger  rirr  polarity  dlvr_st  dlvr_mode   vector\n");
     562    /* Timer. */
     563    {
     564        /* Timer modes. */
     565        static const char * const s_apszLvtTimerModes[] =
     566        {
     567            "One-shot ",
     568            "Periodic ",
     569            "TSC-dline"
     570        };
     571        const uint32_t       uLvtTimer         = pXApicPage->lvt_timer.all.u32LvtTimer;
     572        const XAPICTIMERMODE enmTimerMode      = XAPIC_LVT_GET_TIMER_MODE(uLvtTimer);
     573        const char          *pszTimerMode      = s_apszLvtTimerModes[enmTimerMode];
     574        const uint8_t        uMask             = XAPIC_LVT_IS_MASKED(uLvtTimer);
     575        const uint8_t        uDeliveryStatus   = uLvtTimer & XAPIC_LVT_DELIVERY_STATUS;
     576        const char          *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus];
     577        const uint8_t        uVector           = XAPIC_LVT_GET_VECTOR(uLvtTimer);
     578
     579        pHlp->pfnPrintf(pHlp, "%-7s  %9s  %u     %5s     %1s   %8s    %4s     %6s    %u (%#x)\n",
     580                        "Timer",
     581                        pszTimerMode,
     582                        uMask,
     583                        pszNotApplicable, /* TriggerMode */
     584                        pszNotApplicable, /* Remote IRR */
     585                        pszNotApplicable, /* Polarity */
     586                        pszDeliveryStatus,
     587                        pszNotApplicable, /* Delivery Mode */
     588                        uVector,
     589                        uVector);
     590    }
    532591
    533592#if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4
    534     uint32_t const uLvtThermal = pXApicPage->lvt_thermal.all.u32LvtThermal;
    535     pHlp->pfnPrintf(pHlp, "LVT Thermal        = %#RX32)\n",  uLvtThermal);
    536     pHlp->pfnPrintf(pHlp, "  Vector           = %u (%#x)\n", pXApicPage->lvt_thermal.u.u8Vector,
    537                     pXApicPage->lvt_thermal.u.u8Vector);
    538     pHlp->pfnPrintf(pHlp, "  Delivery Mode    = %#x (%s)\n", pXApicPage->lvt_thermal.u.u3DeliveryMode,
    539                     apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_thermal.u.u3DeliveryMode));
    540     pHlp->pfnPrintf(pHlp, "  Delivery status  = %u\n",       pXApicPage->lvt_thermal.u.u1DeliveryStatus);
    541     pHlp->pfnPrintf(pHlp, "  Masked           = %RTbool\n",  XAPIC_LVT_IS_MASKED(uLvtThermal));
    542     pHlp->pfnPrintf(pHlp, "\n");
     593    /* Thermal sensor. */
     594    {
     595        uint32_t const uLvtThermal = pXApicPage->lvt_thermal.all.u32LvtThermal;
     596        const uint8_t           uMask             = XAPIC_LVT_IS_MASKED(uLvtThermal);
     597        const uint8_t           uDeliveryStatus   = uLvtThermal & XAPIC_LVT_DELIVERY_STATUS;
     598        const char             *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus];
     599        const XAPICDELIVERYMODE enmDeliveryMode   = XAPIC_LVT_GET_DELIVERY_MODE(uLvtThermal);
     600        const char             *pszDeliveryMode   = s_apszLvtDeliveryModes[enmDeliveryMode];
     601        const uint8_t           uVector           = XAPIC_LVT_GET_VECTOR(uLvtThermal);
     602
     603        pHlp->pfnPrintf(pHlp, "%-7s  %9s  %u     %5s     %1s   %8s    %4s     %6s    %u (%#x)\n",
     604                        "Thermal",
     605                        pszNotApplicable, /* Timer mode */
     606                        uMask,
     607                        pszNotApplicable, /* TriggerMode */
     608                        pszNotApplicable, /* Remote IRR */
     609                        pszNotApplicable, /* Polarity */
     610                        pszDeliveryStatus,
     611                        pszDeliveryMode,
     612                        uVector,
     613                        uVector);
     614    }
    543615#endif
    544616
    545     uint32_t const uLvtPerf = pXApicPage->lvt_perf.all.u32LvtPerf;
    546     pHlp->pfnPrintf(pHlp, "LVT Perf           = %#RX32\n",   uLvtPerf);
    547     pHlp->pfnPrintf(pHlp, "  Vector           = %u (%#x)\n", pXApicPage->lvt_perf.u.u8Vector, pXApicPage->lvt_perf.u.u8Vector);
    548     pHlp->pfnPrintf(pHlp, "  Delivery Mode    = %#x (%s)\n", pXApicPage->lvt_perf.u.u3DeliveryMode,
    549                     apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_perf.u.u3DeliveryMode));
    550     pHlp->pfnPrintf(pHlp, "  Delivery status  = %u\n",       pXApicPage->lvt_perf.u.u1DeliveryStatus);
    551     pHlp->pfnPrintf(pHlp, "  Masked           = %RTbool\n",  XAPIC_LVT_IS_MASKED(uLvtPerf));
    552     pHlp->pfnPrintf(pHlp, "\n");
    553 
    554     uint32_t const uLvtLint0 = pXApicPage->lvt_lint0.all.u32LvtLint0;
    555     pHlp->pfnPrintf(pHlp, "LVT LINT0          = %#RX32\n",   uLvtLint0);
    556     pHlp->pfnPrintf(pHlp, "  Vector           = %u (%#x)\n", pXApicPage->lvt_lint0.u.u8Vector, pXApicPage->lvt_lint0.u.u8Vector);
    557     pHlp->pfnPrintf(pHlp, "  Delivery Mode    = %#x (%s)\n", pXApicPage->lvt_lint0.u.u3DeliveryMode,
    558                     apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_lint0.u.u3DeliveryMode));
    559     pHlp->pfnPrintf(pHlp, "  Delivery status  = %u\n",       pXApicPage->lvt_lint0.u.u1DeliveryStatus);
    560     pHlp->pfnPrintf(pHlp, "  Pin polarity     = %u\n",       pXApicPage->lvt_lint0.u.u1IntrPolarity);
    561     pHlp->pfnPrintf(pHlp, "  Remote IRR       = %u\n",       pXApicPage->lvt_lint0.u.u1RemoteIrr);
    562     pHlp->pfnPrintf(pHlp, "  Trigger Mode     = %u (%s)\n",  pXApicPage->lvt_lint0.u.u1TriggerMode,
    563                     apicGetTriggerModeName((XAPICTRIGGERMODE)pXApicPage->lvt_lint0.u.u1TriggerMode));
    564     pHlp->pfnPrintf(pHlp, "  Masked           = %RTbool\n",  XAPIC_LVT_IS_MASKED(uLvtLint0));
    565     pHlp->pfnPrintf(pHlp, "\n");
    566 
    567     uint32_t const uLvtLint1 = pXApicPage->lvt_lint1.all.u32LvtLint1;
    568     pHlp->pfnPrintf(pHlp, "LVT LINT1          = %#RX32\n",   uLvtLint1);
    569     pHlp->pfnPrintf(pHlp, "  Vector           = %u (%#x)\n", pXApicPage->lvt_lint1.u.u8Vector, pXApicPage->lvt_lint1.u.u8Vector);
    570     pHlp->pfnPrintf(pHlp, "  Delivery Mode    = %#x (%s)\n", pXApicPage->lvt_lint1.u.u3DeliveryMode,
    571                     apicGetDeliveryModeName((XAPICDELIVERYMODE)pXApicPage->lvt_lint1.u.u3DeliveryMode));
    572     pHlp->pfnPrintf(pHlp, "  Delivery status  = %u\n",       pXApicPage->lvt_lint1.u.u1DeliveryStatus);
    573     pHlp->pfnPrintf(pHlp, "  Pin polarity     = %u\n",       pXApicPage->lvt_lint1.u.u1IntrPolarity);
    574     pHlp->pfnPrintf(pHlp, "  Remote IRR       = %u\n",       pXApicPage->lvt_lint1.u.u1RemoteIrr);
    575     pHlp->pfnPrintf(pHlp, "  Trigger Mode     = %u (%s)\n",  pXApicPage->lvt_lint1.u.u1TriggerMode,
    576                     apicGetTriggerModeName((XAPICTRIGGERMODE)pXApicPage->lvt_lint1.u.u1TriggerMode));
    577     pHlp->pfnPrintf(pHlp, "  Masked           = %RTbool\n",  XAPIC_LVT_IS_MASKED(uLvtLint1));
    578     pHlp->pfnPrintf(pHlp, "\n");
    579 
    580     uint32_t const uLvtError = pXApicPage->lvt_error.all.u32LvtError;
    581     pHlp->pfnPrintf(pHlp, "LVT Error          = %#RX32\n",   uLvtError);
    582     pHlp->pfnPrintf(pHlp, "  Vector           = %u (%#x)\n", pXApicPage->lvt_error.u.u8Vector, pXApicPage->lvt_error.u.u8Vector);
    583     pHlp->pfnPrintf(pHlp, "  Delivery status  = %u\n",       pXApicPage->lvt_error.u.u1DeliveryStatus);
    584     pHlp->pfnPrintf(pHlp, "  Masked           = %RTbool\n",  XAPIC_LVT_IS_MASKED(uLvtError));
    585     pHlp->pfnPrintf(pHlp, "\n");
     617    /* Performance Monitor Counters. */
     618    {
     619        uint32_t const uLvtPerf = pXApicPage->lvt_thermal.all.u32LvtThermal;
     620        const uint8_t           uMask             = XAPIC_LVT_IS_MASKED(uLvtPerf);
     621        const uint8_t           uDeliveryStatus   = uLvtPerf & XAPIC_LVT_DELIVERY_STATUS;
     622        const char             *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus];
     623        const XAPICDELIVERYMODE enmDeliveryMode   = XAPIC_LVT_GET_DELIVERY_MODE(uLvtPerf);
     624        const char             *pszDeliveryMode   = s_apszLvtDeliveryModes[enmDeliveryMode];
     625        const uint8_t           uVector           = XAPIC_LVT_GET_VECTOR(uLvtPerf);
     626
     627        pHlp->pfnPrintf(pHlp, "%-7s  %9s  %u     %5s     %1s   %8s    %4s     %6s    %u (%#x)\n",
     628                        "Perf",
     629                        pszNotApplicable, /* Timer mode */
     630                        uMask,
     631                        pszNotApplicable, /* TriggerMode */
     632                        pszNotApplicable, /* Remote IRR */
     633                        pszNotApplicable, /* Polarity */
     634                        pszDeliveryStatus,
     635                        pszDeliveryMode,
     636                        uVector,
     637                        uVector);
     638    }
     639
     640    /* LINT0, LINT1. */
     641    {
     642        /* LINTx name. */
     643        static const char * const s_apszLvtLint[] =
     644        {
     645            "LINT0",
     646            "LINT1"
     647        };
     648        /* Trigger mode. */
     649        static const char * const s_apszLvtTriggerModes[] =
     650        {
     651            "Edge ",
     652            "Level"
     653        };
     654        /* Polarity. */
     655        static const char * const s_apszLvtPolarity[] =
     656        {
     657            "ActiveHi",
     658            "ActiveLo"
     659        };
     660
     661        uint32_t aLvtLint[2];
     662        aLvtLint[0] = pXApicPage->lvt_lint0.all.u32LvtLint0;
     663        aLvtLint[1] = pXApicPage->lvt_lint1.all.u32LvtLint1;
     664        for (size_t i = 0; i < RT_ELEMENTS(aLvtLint); i++)
     665        {
     666            uint32_t const uLvtLint = aLvtLint[i];
     667            const char             *pszLint           = s_apszLvtLint[i];
     668            const uint8_t           uMask             = XAPIC_LVT_IS_MASKED(uLvtLint);
     669            const XAPICTRIGGERMODE  enmTriggerMode    = XAPIC_LVT_GET_TRIGGER_MODE(uLvtLint);
     670            const char             *pszTriggerMode    = s_apszLvtTriggerModes[enmTriggerMode];
     671            const uint8_t           uRemoteIrr        = XAPIC_LVT_GET_REMOTE_IRR(uLvtLint);
     672            const uint8_t           uPolarity         = XAPIC_LVT_GET_POLARITY(uLvtLint);
     673            const char             *pszPolarity       = s_apszLvtPolarity[uPolarity];
     674            const uint8_t           uDeliveryStatus   = uLvtLint & XAPIC_LVT_DELIVERY_STATUS;
     675            const char             *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus];
     676            const XAPICDELIVERYMODE enmDeliveryMode   = XAPIC_LVT_GET_DELIVERY_MODE(uLvtLint);
     677            const char             *pszDeliveryMode   = s_apszLvtDeliveryModes[enmDeliveryMode];
     678            const uint8_t           uVector           = XAPIC_LVT_GET_VECTOR(uLvtLint);
     679
     680            pHlp->pfnPrintf(pHlp, "%-7s  %9s  %u     %5s     %u   %8s    %4s     %6s    %u (%#x)\n",
     681                            pszLint,
     682                            pszNotApplicable, /* Timer mode */
     683                            uMask,
     684                            pszTriggerMode,
     685                            uRemoteIrr,
     686                            pszPolarity,
     687                            pszDeliveryStatus,
     688                            pszDeliveryMode,
     689                            uVector,
     690                            uVector);
     691        }
     692    }
     693
     694    /* Error. */
     695    {
     696        uint32_t const uLvtError = pXApicPage->lvt_thermal.all.u32LvtThermal;
     697        const uint8_t           uMask             = XAPIC_LVT_IS_MASKED(uLvtError);
     698        const uint8_t           uDeliveryStatus   = uLvtError & XAPIC_LVT_DELIVERY_STATUS;
     699        const char             *pszDeliveryStatus = s_apszLvtDeliveryStatus[uDeliveryStatus];
     700        const XAPICDELIVERYMODE enmDeliveryMode   = XAPIC_LVT_GET_DELIVERY_MODE(uLvtError);
     701        const char             *pszDeliveryMode   = s_apszLvtDeliveryModes[enmDeliveryMode];
     702        const uint8_t           uVector           = XAPIC_LVT_GET_VECTOR(uLvtError);
     703
     704        pHlp->pfnPrintf(pHlp, "%-7s  %9s  %u     %5s     %1s   %8s    %4s     %6s    %u (%#x)\n",
     705                        "Error",
     706                        pszNotApplicable, /* Timer mode */
     707                        uMask,
     708                        pszNotApplicable, /* TriggerMode */
     709                        pszNotApplicable, /* Remote IRR */
     710                        pszNotApplicable, /* Polarity */
     711                        pszDeliveryStatus,
     712                        pszDeliveryMode,
     713                        uVector,
     714                        uVector);
     715    }
    586716}
    587717
     
    597727{
    598728    NOREF(pszArgs);
    599     PVMCPU      pVCpu      = VMMGetCpu(pVM); AssertFatalMsg(pVCpu, ("Invalid EMT thread. pVCpu=%p\n", pVCpu));
     729    PVMCPU pVCpu = VMMGetCpu(pVM);
     730    if (!pVCpu)
     731        pVCpu = &pVM->aCpus[0];
     732
    600733    PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu);
    601734    PCAPICCPU   pApicCpu   = VMCPU_TO_APICCPU(pVCpu);
     
    607740    pHlp->pfnPrintf(pHlp, "    Timer shift    = %#x\n",    apicGetTimerShift(pXApicPage));
    608741    pHlp->pfnPrintf(pHlp, "  Timer initial TS = %#RU64\n", pApicCpu->u64TimerInitial);
    609     pHlp->pfnPrintf(pHlp, "\n");
    610 
    611742    apicR3InfoLvtTimer(pVCpu, pHlp);
    612743}
     
    16381769     * not just used during live debugging via the VM debugger.
    16391770     */
    1640     rc  = DBGFR3InfoRegisterInternalEx(pVM, "apic",      "Dumps APIC basic information.", apicR3Info,      DBGFINFO_FLAGS_RUN_ON_EMT);
    1641     rc |= DBGFR3InfoRegisterInternalEx(pVM, "apiclvt",   "Dumps APIC LVT information.",   apicR3InfoLvt,   DBGFINFO_FLAGS_RUN_ON_EMT);
    1642     rc |= DBGFR3InfoRegisterInternalEx(pVM, "apictimer", "Dumps APIC timer information.", apicR3InfoTimer, DBGFINFO_FLAGS_RUN_ON_EMT);
     1771    rc  = DBGFR3InfoRegisterInternalEx(pVM, "apic",      "Dumps APIC basic information.", apicR3Info,      DBGFINFO_FLAGS_ALL_EMTS);
     1772    rc |= DBGFR3InfoRegisterInternalEx(pVM, "apiclvt",   "Dumps APIC LVT information.",   apicR3InfoLvt,   DBGFINFO_FLAGS_ALL_EMTS);
     1773    rc |= DBGFR3InfoRegisterInternalEx(pVM, "apictimer", "Dumps APIC timer information.", apicR3InfoTimer, DBGFINFO_FLAGS_ALL_EMTS);
    16431774    AssertRCReturn(rc, rc);
    16441775
Note: See TracChangeset for help on using the changeset viewer.

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