VirtualBox

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


Ignore:
Timestamp:
Apr 27, 2016 3:32:57 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106907
Message:

VMM/APIC: Fixes for getting x2APIC mode working.

File:
1 edited

Legend:

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

    r60717 r60720  
    244244
    245245    /* Construct. */
    246     PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    247     uint64_t uApicBaseMsr = XAPIC_APICBASE_PHYSADDR
    248                           | MSR_APICBASE_XAPIC_ENABLE_BIT;
     246    PAPICCPU pApicCpu     = VMCPU_TO_APICCPU(pVCpu);
     247    PAPIC    pApic        = VM_TO_APIC(pVCpu->CTX_SUFF(pVM));
     248    uint64_t uApicBaseMsr = XAPIC_APICBASE_PHYSADDR;
    249249    if (pVCpu->idCpu == 0)
    250250        uApicBaseMsr |= MSR_APICBASE_BOOTSTRAP_CPU_BIT;
    251251
    252     /* Update CPUID. */
    253     APICUpdateCpuIdForMode(pVCpu->CTX_SUFF(pVM), APICMODE_XAPIC);
    254     LogRel(("APIC%u: Switched mode to xAPIC\n", pVCpu->idCpu));
     252    /* If the VM was configured with disabled mode, don't enable xAPIC mode. */
     253    if (pApic->enmOriginalMode != APICMODE_DISABLED)
     254    {
     255        uApicBaseMsr |= MSR_APICBASE_XAPIC_ENABLE_BIT;
     256
     257        /** @todo CPUID bits needs to be done on a per-VCPU basis! */
     258        CPUMSetGuestCpuIdFeature(pVCpu->CTX_SUFF(pVM), CPUMCPUIDFEATURE_APIC);
     259        LogRel(("APIC%u: Switched mode to xAPIC\n", pVCpu->idCpu));
     260    }
    255261
    256262    /* Commit. */
     
    14521458    rc = CFGMR3QueryU8Def(pCfg, "Mode", &uOriginalMode, APICMODE_XAPIC);
    14531459    AssertLogRelRCReturn(rc, rc);
     1460
    14541461    /* Validate APIC modes. */
    1455     switch (uOriginalMode)
     1462    APICMODE const enmOriginalMode = (APICMODE)uOriginalMode;
     1463    switch (enmOriginalMode)
    14561464    {
    14571465        case APICMODE_DISABLED:
     1466            pApic->enmOriginalMode = enmOriginalMode;
     1467            CPUMClearGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_APIC);
     1468            CPUMClearGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_X2APIC);
     1469            break;
     1470
    14581471        case APICMODE_X2APIC:
     1472            pApic->enmOriginalMode = enmOriginalMode;
     1473            CPUMSetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_X2APIC);
     1474            break;
     1475
    14591476        case APICMODE_XAPIC:
    1460             pApic->enmOriginalMode = (APICMODE)uOriginalMode;
     1477            pApic->enmOriginalMode = enmOriginalMode;
     1478            /* The CPUID bit will be updated in apicR3ResetBaseMsr(). */
    14611479            break;
     1480
    14621481        default:
    14631482            return VMR3SetError(pVM->pUVM, VERR_INVALID_STATE, RT_SRC_POS, "APIC mode %#x unknown.", uOriginalMode);
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