VirtualBox

Changeset 60573 in vbox


Ignore:
Timestamp:
Apr 19, 2016 1:27:45 PM (8 years ago)
Author:
vboxsync
Message:

VMM/APIC: Fix INIT IPI handling, and handle callers of PDMGetInterrupt() expecting a valid
vector which may not be the case with the new APIC code.

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

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

    r60542 r60573  
    629629            {
    630630                if (VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu))
     631                {
     632                    Log4(("APIC: apicSendIntr: Raising SMI on VCPU%u\n", idCpu));
    631633                    APICSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_SMI);
     634                }
    632635            }
    633636            break;
     
    640643                if (   VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu)
    641644                    && apicIsEnabled(&pVM->aCpus[idCpu]))
     645                {
     646                    Log4(("APIC: apicSendIntr: Raising NMI on VCPU%u\n", idCpu));
    642647                    APICSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_NMI);
     648                }
    643649            }
    644650            break;
     
    650656            for (VMCPUID idCpu = 0; idCpu < cCpus; idCpu++)
    651657                if (VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu))
     658                {
     659                    Log4(("APIC: apicSendIntr: Issuing INIT to VCPU%u\n", idCpu));
    652660                    VMMR3SendInitIpi(pVM, idCpu);
     661                }
    653662#else
    654663            /* We need to return to ring-3 to deliver the INIT. */
     
    663672            for (VMCPUID idCpu = 0; idCpu < cCpus; idCpu++)
    664673                if (VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu))
     674                {
     675                    Log4(("APIC: apicSendIntr: Issuing SIPI to VCPU%u\n", idCpu));
    665676                    VMMR3SendStartupIpi(pVM, idCpu, uVector);
     677                }
    666678#else
    667679            /* We need to return to ring-3 to deliver the SIPI. */
     
    675687            for (VMCPUID idCpu = 0; idCpu < cCpus; idCpu++)
    676688                if (VMCPUSET_IS_PRESENT(pDestCpuSet, idCpu))
     689                {
     690                    Log4(("APIC: apicSendIntr: Raising EXTINT on VCPU%u\n", idCpu));
    677691                    APICSetInterruptFF(&pVM->aCpus[idCpu], PDMAPICIRQ_EXTINT);
     692                }
    678693            break;
    679694        }
     
    911926
    912927    PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
    913     XAPICDELIVERYMODE  const enmDeliveryMode  = (XAPICDELIVERYMODE)pXApicPage->icr_lo.u.u3DeliveryMode;
     928    XAPICDELIVERYMODE const enmDeliveryMode  = (XAPICDELIVERYMODE)pXApicPage->icr_lo.u.u3DeliveryMode;
    914929    XAPICDESTMODE const      enmDestMode      = (XAPICDESTMODE)pXApicPage->icr_lo.u.u1DestMode;
    915     XAPICINITLEVEL           enmInitLevel     = (XAPICINITLEVEL)pXApicPage->icr_lo.u.u1Level;
    916     XAPICTRIGGERMODE         enmTriggerMode   = (XAPICTRIGGERMODE)pXApicPage->icr_lo.u.u1TriggerMode;
     930    XAPICINITLEVEL const     enmInitLevel     = (XAPICINITLEVEL)pXApicPage->icr_lo.u.u1Level;
     931    XAPICTRIGGERMODE const   enmTriggerMode   = (XAPICTRIGGERMODE)pXApicPage->icr_lo.u.u1TriggerMode;
    917932    XAPICDESTSHORTHAND const enmDestShorthand = (XAPICDESTSHORTHAND)pXApicPage->icr_lo.u.u2DestShorthand;
    918933    uint8_t const            uVector          = pXApicPage->icr_lo.u.u8Vector;
     
    924939    /*
    925940     * INIT Level De-assert is not support on Pentium 4 and Xeon processors.
     941     * See AMD spec. 16.5 "Interprocessor Interrupts (IPI)" for a table of valid ICR combinations.
    926942     */
    927943    if (RT_UNLIKELY(   enmDeliveryMode == XAPICDELIVERYMODE_INIT_LEVEL_DEASSERT
     
    929945                    && enmTriggerMode  == XAPICTRIGGERMODE_LEVEL))
    930946    {
     947        Log4(("APIC%u: INIT level de-assert unsupported, ignoring!\n", pVCpu->idCpu));
    931948        return VINF_SUCCESS;
    932949    }
    933 
    934     enmInitLevel   = XAPICINITLEVEL_ASSERT;
    935     enmTriggerMode = XAPICTRIGGERMODE_EDGE;
    936950#else
    937951# error "Implement Pentium and P6 family APIC architectures"
     
    10151029    Log4(("APIC%u: apicSetIcrLo: uIcrLo=%#RX32\n", pVCpu->idCpu, pXApicPage->icr_lo.all.u32IcrLo));
    10161030
    1017     apicSendIpi(pVCpu, rcRZ);
    1018     return VINF_SUCCESS;
     1031    return apicSendIpi(pVCpu, rcRZ);
    10191032}
    10201033
     
    22632276
    22642277    PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
    2265     if (   apicIsEnabled(pVCpu)
     2278    bool const fApicHwEnabled = apicIsEnabled(pVCpu);
     2279    if (   fApicHwEnabled
    22662280        && pXApicPage->svr.u.fApicSoftwareEnable)
    22672281    {
     
    22952309                return uVector;
    22962310            }
    2297         }
    2298     }
     2311            else
     2312                Log4(("APIC%u: APICGetInterrupt: Interrupt's priority is not higher than the PPR uVector=%#x PPR=%#x\n",
     2313                      pVCpu->idCpu, uVector, uPpr));
     2314        }
     2315        else
     2316            Log4(("APIC%u: APICGetInterrupt: No pending bits in IRR\n", pVCpu->idCpu));
     2317    }
     2318    else
     2319        Log4(("APIC%u: APICGetInterrupt: APIC %s disabled\n", pVCpu->idCpu, !fApicHwEnabled ? "hardware" : "software"));
    22992320
    23002321    return -1;
     
    23182339    STAM_COUNTER_INC(&pVCpu->apic.s.CTX_SUFF(StatMmioRead));
    23192340
    2320     Log4(("APIC%u: ApicReadMmio: offReg=%#RX16\n", pVCpu->idCpu, offReg));
    2321 
    23222341    int rc = apicReadRegister(pApicDev, pVCpu, offReg, &uValue);
    23232342    *(uint32_t *)pv = uValue;
     2343
     2344    Log4(("APIC%u: ApicReadMmio: offReg=%#RX16 uValue=%#RX32\n", pVCpu->idCpu, offReg, uValue));
    23242345    return rc;
    23252346}
  • trunk/src/VBox/VMM/VMMAll/PDMAll.cpp

    r60396 r60573  
    6161        uint32_t uTagSrc;
    6262        int i = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns), pVCpu, &uTagSrc);
     63#ifndef VBOX_WITH_NEW_APIC
    6364        AssertMsg(i <= 255 && i >= 0, ("i=%d\n", i));
     65#endif
    6466        if (i >= 0)
    6567        {
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r60380 r60573  
    74447444            else
    74457445            {
    7446                 /** @todo Does this actually happen? If not turn it into an assertion. */
     7446                /* This can happen with the new APIC code. */
     7447#ifndef VBOX_WITH_NEW_APIC
    74477448                Assert(!VMCPU_FF_IS_PENDING(pVCpu, (VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)));
     7449#endif
    74487450                STAM_COUNTER_INC(&pVCpu->hm.s.StatSwitchGuestIrq);
    74497451            }
  • trunk/src/VBox/VMM/VMMR3/TRPM.cpp

    r58123 r60573  
    15551555        else
    15561556        {
     1557#ifndef VBOX_WITH_NEW_APIC
    15571558            AssertRC(rc);
     1559#endif
    15581560            return HMR3IsActive(pVCpu) ? VINF_EM_RESCHEDULE_HM : VINF_EM_RESCHEDULE_REM; /* (Heed the halted state if this is changed!) */
    15591561        }
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