VirtualBox

Changeset 60706 in vbox


Ignore:
Timestamp:
Apr 26, 2016 3:44:23 PM (8 years ago)
Author:
vboxsync
Message:

VMM/APIC: Logging and nits. Don't bother with checking spurious interrupt while setting EOI.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r60689 r60706  
    535535                ||  XAPIC_PPR_GET_PP(uVector) > XAPIC_PPR_GET_PP(uPpr))
    536536            {
     537                Log2(("APIC%u: apicSignalNextPendingIntr: Signaling pending interrupt\n", pVCpu->idCpu));
    537538                APICSetInterruptFF(pVCpu, PDMAPICIRQ_HARDWARE);
    538539            }
     
    540541    }
    541542    else
     543    {
     544        Log2(("APIC%u: apicSignalNextPendingIntr: APIC software-disabled, clearing pending interrupt\n", pVCpu->idCpu));
    542545        APICClearInterruptFF(pVCpu, PDMAPICIRQ_HARDWARE);
     546    }
    543547}
    544548
     
    11781182    if (isrv >= 0)
    11791183    {
    1180         /*
    1181          * Dispensing the spurious-interrupt vector does not affect the ISR.
    1182          * See Intel spec. 10.9 "Spurious Interrupt".
    1183          */
     1184        Assert(isrv <= (int)UINT8_MAX);
    11841185        uint8_t const uVector = isrv;
    1185         if (uVector != pXApicPage->svr.u.u8SpuriousVector)
    1186         {
    1187             apicClearVectorInReg(&pXApicPage->isr, uVector);
    1188             apicUpdatePpr(pVCpu);
    1189             bool fLevelTriggered = apicTestVectorInReg(&pXApicPage->tmr, uVector);
    1190             if (fLevelTriggered)
    1191             {
    1192                 /** @todo We need to broadcast EOI to IO APICs here. */
    1193                 apicClearVectorInReg(&pXApicPage->tmr, uVector);
    1194             }
    1195 
    1196             Log2(("APIC%u: apicSetEoi: Acknowledged %s triggered interrupt. uVector=%#x\n", pVCpu->idCpu,
    1197                   fLevelTriggered ? "level" : "edge", uVector));
    1198 
    1199             apicSignalNextPendingIntr(pVCpu);
    1200         }
     1186        apicClearVectorInReg(&pXApicPage->isr, uVector);
     1187        apicUpdatePpr(pVCpu);
     1188        Log2(("APIC%u: apicSetEoi: Cleared interrupt from ISR. uVector=%#x\n", pVCpu->idCpu, uVector));
     1189
     1190        bool fLevelTriggered = apicTestVectorInReg(&pXApicPage->tmr, uVector);
     1191        if (fLevelTriggered)
     1192        {
     1193            /** @todo We need to broadcast EOI to IO APICs here. */
     1194            apicClearVectorInReg(&pXApicPage->tmr, uVector);
     1195            Log2(("APIC%u: apicSetEoi: Cleared level triggered interrupt from TMR. uVector=%#x\n", pVCpu->idCpu, uVector));
     1196        }
     1197
     1198        apicSignalNextPendingIntr(pVCpu);
    12011199    }
    12021200
     
    23132311            uint8_t const uVector = irrv;
    23142312
    2315             /** @todo this cannot possibly happen for anything other than ExtINT
    2316              *        interrupts right? */
     2313            /*
     2314             * This can happen if the APIC receives an interrupt when the CPU has interrupts
     2315             * disabled but the TPR is raised by the guest before re-enabling interrupts.
     2316             */
    23172317            uint8_t const uTpr = pXApicPage->tpr.u8Tpr;
    23182318            if (uTpr > 0 && uVector <= uTpr)
    23192319            {
    2320                 Log2(("APIC%u: APICGetInterrupt: Spurious interrupt. uVector=%#x\n", pVCpu->idCpu,
    2321                       pXApicPage->svr.u.u8SpuriousVector));
     2320                Log2(("APIC%u: APICGetInterrupt: Spurious interrupt. uVector=%#x Tpr=%#x SpuriousVector=%#x\n", pVCpu->idCpu,
     2321                      uVector, uTpr, pXApicPage->svr.u.u8SpuriousVector));
    23222322                return pXApicPage->svr.u.u8SpuriousVector;
    23232323            }
     
    23682368    *(uint32_t *)pv = uValue;
    23692369
    2370     Log2(("APIC%u: ApicReadMmio: offReg=%#RX16 uValue=%#RX32\n", pVCpu->idCpu, offReg, uValue));
     2370    Log2(("APIC%u: APICReadMmio: offReg=%#RX16 uValue=%#RX32\n", pVCpu->idCpu, offReg, uValue));
    23712371    return rc;
    23722372}
     
    25152515    uint64_t const cTicksToNext = (uint64_t)uInitialCount << uTimerShift;
    25162516
    2517     Log2(("APIC%u: APICStartTimer: uInitialCount=%u uTimerShift=%u cTicksToNext=%RU64\n", pVCpu->idCpu, uInitialCount,
     2517    Log2(("APIC%u: APICStartTimer: uInitialCount=%#RX32 uTimerShift=%u cTicksToNext=%RU64\n", pVCpu->idCpu, uInitialCount,
    25182518          uTimerShift, cTicksToNext));
    25192519
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