VirtualBox

Changeset 82031 in vbox


Ignore:
Timestamp:
Nov 20, 2019 4:11:16 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134835
Message:

APIC: Converted the timer pointers to timer handles. This requires PPDMDEVINS to be accessible when called directly from the VMM, so adding pointers to the APIC specific GVM and VM structures. bugref:9218

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/gvm.h

    r81162 r82031  
    213213    } iomr0;
    214214
     215    union
     216    {
     217#if defined(VMM_INCLUDED_SRC_include_APICInternal_h) && defined(IN_RING0)
     218        struct APICR0PERVM  s;
     219#endif
     220        uint8_t             padding[64];
     221    } apicr0;
     222
    215223    /** Padding so aCpus starts on a page boundrary.  */
    216224#ifdef VBOX_WITH_NEM_R0
    217     uint8_t         abPadding2[4096 - 64 - 256 - 512 - 256 - 64 - 1792 - 512 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
    218 #else
    219     uint8_t         abPadding2[4096 - 64 - 256 - 512       - 64 - 1792 - 512 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
     225    uint8_t         abPadding2[4096 - 64 - 256 - 512 - 256 - 64 - 1792 - 512 - 64 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
     226#else
     227    uint8_t         abPadding2[4096 - 64 - 256 - 512       - 64 - 1792 - 512 - 64 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];
    220228#endif
    221229
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r82026 r82031  
    13841384 *
    13851385 * @returns VBox status code.
     1386 * @param   pDevIns         The device instance.
    13861387 * @param   pVCpu           The cross context virtual CPU structure.
    13871388 * @param   rcBusy          The busy return code for the timer critical section.
    13881389 * @param   puValue         Where to store the LVT timer CCR.
    13891390 */
    1390 static VBOXSTRICTRC apicGetTimerCcr(PVMCPUCC pVCpu, int rcBusy, uint32_t *puValue)
     1391static VBOXSTRICTRC apicGetTimerCcr(PPDMDEVINS pDevIns, PVMCPUCC pVCpu, int rcBusy, uint32_t *puValue)
    13911392{
    13921393    VMCPU_ASSERT_EMT(pVCpu);
     
    14111412     * We also need to lock before reading the timer CCR, see apicR3TimerCallback().
    14121413     */
    1413     PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    1414     PTMTIMER  pTimer   = pApicCpu->CTX_SUFF(pTimer);
    1415 
    1416     int rc = TMTimerLock(pTimer, rcBusy);
     1414    PCAPICCPU       pApicCpu = VMCPU_TO_APICCPU(pVCpu);
     1415    TMTIMERHANDLE   hTimer   = pApicCpu->hTimer;
     1416
     1417    int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy);
    14171418    if (rc == VINF_SUCCESS)
    14181419    {
     
    14211422        if (uCurrentCount)
    14221423        {
    1423             uint64_t const cTicksElapsed = TMTimerGet(pApicCpu->CTX_SUFF(pTimer)) - pApicCpu->u64TimerInitial;
    1424             TMTimerUnlock(pTimer);
     1424            uint64_t const cTicksElapsed = PDMDevHlpTimerGet(pDevIns, hTimer) - pApicCpu->u64TimerInitial;
     1425            PDMDevHlpTimerUnlock(pDevIns, hTimer);
    14251426            uint8_t  const uTimerShift   = apicGetTimerShift(pXApicPage);
    14261427            uint64_t const uDelta        = cTicksElapsed >> uTimerShift;
     
    14291430        }
    14301431        else
    1431             TMTimerUnlock(pTimer);
     1432            PDMDevHlpTimerUnlock(pDevIns, hTimer);
    14321433    }
    14331434    return rc;
     
    14391440 *
    14401441 * @returns Strict VBox status code.
     1442 * @param   pDevIns         The device instance.
    14411443 * @param   pVCpu           The cross context virtual CPU structure.
    14421444 * @param   rcBusy          The busy return code for the timer critical section.
    14431445 * @param   uInitialCount   The timer ICR.
    14441446 */
    1445 static VBOXSTRICTRC apicSetTimerIcr(PVMCPUCC pVCpu, int rcBusy, uint32_t uInitialCount)
     1447static VBOXSTRICTRC apicSetTimerIcr(PPDMDEVINS pDevIns, PVMCPUCC pVCpu, int rcBusy, uint32_t uInitialCount)
    14461448{
    14471449    VMCPU_ASSERT_EMT(pVCpu);
     
    14501452    PAPICCPU   pApicCpu   = VMCPU_TO_APICCPU(pVCpu);
    14511453    PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
    1452     PTMTIMER   pTimer     = pApicCpu->CTX_SUFF(pTimer);
    14531454
    14541455    Log2(("APIC%u: apicSetTimerIcr: uInitialCount=%#RX32\n", pVCpu->idCpu, uInitialCount));
     
    14651466     * timer ICR. We rely on CCR being consistent in apicGetTimerCcr().
    14661467     */
    1467     int rc = TMTimerLock(pTimer, rcBusy);
     1468    TMTIMERHANDLE hTimer = pApicCpu->hTimer;
     1469    int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy);
    14681470    if (rc == VINF_SUCCESS)
    14691471    {
     
    14741476        else
    14751477            apicStopTimer(pVCpu);
    1476         TMTimerUnlock(pTimer);
     1478        PDMDevHlpTimerUnlock(pDevIns, hTimer);
    14771479    }
    14781480    return rc;
     
    15881590 * Hints TM about the APIC timer frequency.
    15891591 *
     1592 * @param   pDevIns         The device instance.
    15901593 * @param   pApicCpu        The APIC CPU state.
    15911594 * @param   uInitialCount   The new initial count.
     
    15931596 * @thread  Any.
    15941597 */
    1595 void apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)
     1598void apicHintTimerFreq(PPDMDEVINS pDevIns, PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)
    15961599{
    15971600    Assert(pApicCpu);
     
    16041607        {
    16051608            uint64_t cTicksPerPeriod = (uint64_t)uInitialCount << uTimerShift;
    1606             uHz = TMTimerGetFreq(pApicCpu->CTX_SUFF(pTimer)) / cTicksPerPeriod;
     1609            uHz = PDMDevHlpTimerGetFreq(pDevIns, pApicCpu->hTimer) / cTicksPerPeriod;
    16071610        }
    16081611        else
    16091612            uHz = 0;
    16101613
    1611         TMTimerSetFrequencyHint(pApicCpu->CTX_SUFF(pTimer), uHz);
     1614        PDMDevHlpTimerSetFrequencyHint(pDevIns, pApicCpu->hTimer, uHz);
    16121615        pApicCpu->uHintedTimerInitialCount = uInitialCount;
    16131616        pApicCpu->uHintedTimerShift = uTimerShift;
     
    16981701        {
    16991702            Assert(!XAPIC_IN_X2APIC_MODE(pVCpu));
    1700             rc = apicGetTimerCcr(pVCpu, VINF_IOM_R3_MMIO_READ, &uValue);
     1703            rc = apicGetTimerCcr(pDevIns, pVCpu, VINF_IOM_R3_MMIO_READ, &uValue);
    17011704            break;
    17021705        }
     
    17661769        case XAPIC_OFF_TIMER_ICR:
    17671770        {
    1768             rcStrict = apicSetTimerIcr(pVCpu, VINF_IOM_R3_MMIO_WRITE, uValue);
     1771            rcStrict = apicSetTimerIcr(pDevIns, pVCpu, VINF_IOM_R3_MMIO_WRITE, uValue);
    17691772            break;
    17701773        }
     
    19101913            {
    19111914                uint32_t uValue;
    1912                 rcStrict = apicGetTimerCcr(pVCpu, VINF_CPUM_R3_MSR_READ, &uValue);
     1915                rcStrict = apicGetTimerCcr(VMCPU_TO_DEVINS(pVCpu), pVCpu, VINF_CPUM_R3_MSR_READ, &uValue);
    19131916                *pu64Value = uValue;
    19141917                break;
     
    20112014    { /* likely */ }
    20122015    else
    2013     {
    20142016        return apicMsrAccessError(pVCpu, u32Reg, pApic->enmMaxMode == PDMAPICMODE_NONE ?
    2015                                                  APICMSRACCESS_WRITE_DISALLOWED_CONFIG : APICMSRACCESS_WRITE_RSVD_OR_UNKNOWN);
    2016     }
     2017                                  APICMSRACCESS_WRITE_DISALLOWED_CONFIG : APICMSRACCESS_WRITE_RSVD_OR_UNKNOWN);
    20172018
    20182019#ifndef IN_RING3
     
    20882089            case MSR_IA32_X2APIC_TIMER_ICR:
    20892090            {
    2090                 rcStrict = apicSetTimerIcr(pVCpu, VINF_CPUM_R3_MSR_WRITE, u32Value);
     2091                rcStrict = apicSetTimerIcr(VMCPU_TO_DEVINS(pVCpu), pVCpu, VINF_CPUM_R3_MSR_WRITE, u32Value);
    20912092                break;
    20922093            }
     
    26112612    {
    26122613        PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    2613         *pu64Value = TMTimerGetFreq(pApicCpu->CTX_SUFF(pTimer));
     2614        *pu64Value = PDMDevHlpTimerGetFreq(VMCPU_TO_DEVINS(pVCpu), pApicCpu->hTimer);
    26142615        return VINF_SUCCESS;
    26152616    }
     
    31593160{
    31603161    Assert(pVCpu);
    3161     PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    3162     Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer)));
     3162    PAPICCPU   pApicCpu = VMCPU_TO_APICCPU(pVCpu);
     3163    PPDMDEVINS pDevIns  = VMCPU_TO_DEVINS(pVCpu);
     3164    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer));
    31633165    Assert(uInitialCount > 0);
    31643166
     
    31763178     * tick.
    31773179     */
    3178     PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer);
    3179     TMTimerSetRelative(pTimer, cTicksToNext, &pApicCpu->u64TimerInitial);
    3180     apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift);
     3180    PDMDevHlpTimerSetRelative(pDevIns, pApicCpu->hTimer, cTicksToNext, &pApicCpu->u64TimerInitial);
     3181    apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift);
    31813182}
    31823183
     
    31913192{
    31923193    Assert(pVCpu);
    3193     PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    3194     Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer)));
     3194    PAPICCPU   pApicCpu = VMCPU_TO_APICCPU(pVCpu);
     3195    PPDMDEVINS pDevIns  = VMCPU_TO_DEVINS(pVCpu);
     3196    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer));
    31953197
    31963198    Log2(("APIC%u: apicStopTimer\n", pVCpu->idCpu));
    31973199
    3198     PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer);
    3199     TMTimerStop(pTimer);    /* This will reset the hint, no need to explicitly call TMTimerSetFrequencyHint(). */
     3200    PDMDevHlpTimerStop(pDevIns, pApicCpu->hTimer); /* This will reset the hint, no need to explicitly call TMTimerSetFrequencyHint(). */
    32003201    pApicCpu->uHintedTimerInitialCount = 0;
    32013202    pApicCpu->uHintedTimerShift = 0;
     
    35073508    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    35083509    PAPICDEV pThis = PDMDEVINS_2_DATA(pDevIns, PAPICDEV);
     3510    PVMCC    pVM   = PDMDevHlpGetVM(pDevIns);
     3511
     3512    pVM->apicr0.s.pDevInsR0 = pDevIns;
    35093513
    35103514    int rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, apicWriteMmio, apicReadMmio, NULL /*pvUser*/);
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r82026 r82031  
    930930        pXApicPage->timer_ccr.u32CurrentCount = pXApicPage->timer_icr.u32InitialCount;
    931931
    932     rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM);
     932    rc = PDMDevHlpTimerLoad(pDevIns, pApicCpu->hTimer, pSSM);
    933933    AssertRCReturn(rc, rc);
    934934    Assert(pApicCpu->uHintedTimerInitialCount == 0);
    935935    Assert(pApicCpu->uHintedTimerShift == 0);
    936     if (TMTimerIsActive(pApicCpu->pTimerR3))
     936    if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer))
    937937    {
    938938        uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount;
    939         apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift);
     939        apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift);
    940940    }
    941941
     
    981981        /* Save the timer. */
    982982        pHlp->pfnSSMPutU64(pSSM, pApicCpu->u64TimerInitial);
    983         TMR3TimerSave(pApicCpu->pTimerR3, pSSM);
     983        PDMDevHlpTimerSave(pDevIns, pApicCpu->hTimer, pSSM);
    984984
    985985        /* Save the LINT0, LINT1 interrupt line states. */
     
    10611061            /* Load the timer. */
    10621062            rc = pHlp->pfnSSMGetU64(pSSM, &pApicCpu->u64TimerInitial);     AssertRCReturn(rc, rc);
    1063             rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM);           AssertRCReturn(rc, rc);
     1063            rc = PDMDevHlpTimerLoad(pDevIns, pApicCpu->hTimer, pSSM);      AssertRCReturn(rc, rc);
    10641064            Assert(pApicCpu->uHintedTimerShift == 0);
    10651065            Assert(pApicCpu->uHintedTimerInitialCount == 0);
    1066             if (TMTimerIsActive(pApicCpu->pTimerR3))
     1066            if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer))
    10671067            {
    10681068                PCXAPICPAGE    pXApicPage    = VMCPU_TO_CXAPICPAGE(pVCpu);
    10691069                uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount;
    10701070                uint8_t const  uTimerShift   = apicGetTimerShift(pXApicPage);
    1071                 apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift);
     1071                apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift);
    10721072            }
    10731073
     
    11161116static DECLCALLBACK(void) apicR3TimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
    11171117{
    1118     PVMCPU pVCpu = (PVMCPU)pvUser;
    1119     Assert(TMTimerIsLockOwner(pTimer));
     1118    PVMCPU      pVCpu    = (PVMCPU)pvUser;
     1119    PAPICCPU    pApicCpu = VMCPU_TO_APICCPU(pVCpu);
     1120    Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer));
    11201121    Assert(pVCpu);
    11211122    LogFlow(("APIC%u: apicR3TimerCallback\n", pVCpu->idCpu));
     
    11251126    uint32_t const uLvtTimer  = pXApicPage->lvt_timer.all.u32LvtTimer;
    11261127#ifdef VBOX_WITH_STATISTICS
    1127     PAPICCPU       pApicCpu   = VMCPU_TO_APICCPU(pVCpu);
    11281128    STAM_COUNTER_INC(&pApicCpu->StatTimerCallback);
    11291129#endif
     
    11831183        PAPICCPU pApicCpu  = VMCPU_TO_APICCPU(pVCpuDest);
    11841184
    1185         if (TMTimerIsActive(pApicCpu->pTimerR3))
    1186             TMTimerStop(pApicCpu->pTimerR3);
     1185        if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer))
     1186            PDMDevHlpTimerStop(pDevIns, pApicCpu->hTimer);
    11871187
    11881188        apicResetCpu(pVCpuDest, true /* fResetApicBaseMsr */);
     
    14111411    pApicDev->pDevInsR3 = pDevIns;
    14121412
     1413    pApic->pDevInsR3    = pDevIns;
    14131414    pApic->pApicDevR3   = pApicDev;
    14141415    pApic->pApicDevR0   = PDMINS_2_DATA_R0PTR(pDevIns);
     
    14921493        PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    14931494        RTStrPrintf(&pApicCpu->szTimerDesc[0], sizeof(pApicCpu->szTimerDesc), "APIC Timer %u", pVCpu->idCpu);
    1494         rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicR3TimerCallback, pVCpu, TMTIMER_FLAGS_NO_CRIT_SECT,
    1495                                     pApicCpu->szTimerDesc, &pApicCpu->pTimerR3);
     1495        rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicR3TimerCallback, pVCpu, TMTIMER_FLAGS_NO_CRIT_SECT,
     1496                                  pApicCpu->szTimerDesc, &pApicCpu->hTimer);
    14961497        AssertRCReturn(rc, rc);
    1497         pApicCpu->pTimerR0 = TMTimerR0Ptr(pApicCpu->pTimerR3);
    14981498    }
    14991499
  • trunk/src/VBox/VMM/include/APICInternal.h

    r82026 r82031  
    5858#define VM_TO_APIC(a_pVM)                    (&(a_pVM)->apic.s)
    5959#define VM_TO_APICDEV(a_pVM)                 CTX_SUFF(VM_TO_APIC(a_pVM)->pApicDev)
     60#ifdef IN_RING3
     61# define VMCPU_TO_DEVINS(a_pVCpu)           ((a_pVCpu)->pVMR3->apic.s.pDevInsR3)
     62#elif defined(IN_RING0)
     63# define VMCPU_TO_DEVINS(a_pVCpu)           ((a_pVCpu)->pGVM->apicr0.s.pDevInsR0)
     64#endif
    6065
    6166#define APICCPU_TO_XAPICPAGE(a_ApicCpu)      ((PXAPICPAGE)(CTX_SUFF((a_ApicCpu)->pvApicPage)))
     
    11641169typedef APICDEV const *PCAPICDEV;
    11651170
     1171
     1172/**
     1173 * The APIC GVM instance data.
     1174 */
     1175typedef struct APICR0PERVM
     1176{
     1177    /** The ring-0 device instance. */
     1178    PPDMDEVINSR0                pDevInsR0;
     1179} APICR0PERVM;
     1180
     1181
    11661182/**
    11671183 * APIC VM Instance data.
     
    11751191    /** The APIC device - R3 ptr. */
    11761192    R3PTRTYPE(PAPICDEV)         pApicDevR3;
     1193    /** The ring-3 device instance. */
     1194    PPDMDEVINSR3                pDevInsR3;
    11771195    /** @} */
    11781196
     
    12831301    /** @name The APIC timer.
    12841302     * @{ */
    1285     /** The timer - R0 ptr. */
    1286     PTMTIMERR0                  pTimerR0;
    1287     /** The timer - R3 ptr. */
    1288     PTMTIMERR3                  pTimerR3;
     1303    /** The timer. */
     1304    TMTIMERHANDLE               hTimer;
    12891305    /** The time stamp when the timer was initialized. */
    12901306    uint64_t                    u64TimerInitial;
     
    14121428const char                   *apicGetDestShorthandName(XAPICDESTSHORTHAND enmDestShorthand);
    14131429const char                   *apicGetTimerModeName(XAPICTIMERMODE enmTimerMode);
    1414 void                          apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift);
     1430void                          apicHintTimerFreq(PPDMDEVINS pDevIns, PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift);
    14151431APICMODE                      apicGetMode(uint64_t uApicBaseMsr);
    14161432
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r81153 r82031  
    14081408    GEN_CHECK_OFF(APICCPU, pvApicPibR3);
    14091409    GEN_CHECK_OFF(APICCPU, ApicPibLevel);
    1410     GEN_CHECK_OFF(APICCPU, pTimerR0);
    1411     GEN_CHECK_OFF(APICCPU, pTimerR3);
     1410    GEN_CHECK_OFF(APICCPU, hTimer);
    14121411    GEN_CHECK_OFF(APICCPU, TimerCritSect);
    14131412
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