VirtualBox

Changeset 93511 in vbox for trunk/src


Ignore:
Timestamp:
Jan 31, 2022 8:25:32 PM (3 years ago)
Author:
vboxsync
Message:

Main/ConsoleImpl2.cpp: Look at the CPU profile then the host cpu vendor when resolving IommuType_Automatic, skipping the latter for non-x86 hosts. bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r93449 r93511  
    841841    }
    842842
     843    /* Get the CPU profile name. */
     844    Bstr bstrCpuProfile;
     845    hrc = pMachine->COMGETTER(CPUProfile)(bstrCpuProfile.asOutParam());                     H();
     846
     847    /*
     848     * Figure out the IOMMU config.
     849     */
    843850#if defined(VBOX_WITH_IOMMU_AMD) || defined(VBOX_WITH_IOMMU_INTEL)
    844     IommuType_T iommuType;
    845     hrc = pMachine->COMGETTER(IommuType)(&iommuType);                                       H();
     851    IommuType_T enmIommuType;
     852    hrc = pMachine->COMGETTER(IommuType)(&enmIommuType);                                    H();
    846853
    847854    /* Resolve 'automatic' type to an Intel or AMD IOMMU based on the host CPU. */
    848     if (iommuType == IommuType_Automatic)
     855    if (enmIommuType == IommuType_Automatic)
    849856    {
    850         if (ASMIsAmdCpu())
    851             iommuType = IommuType_AMD;
     857        if (   bstrCpuProfile.startsWith("AMD")
     858            || bstrCpuProfile.startsWith("Quad-Core AMD")
     859            || bstrCpuProfile.startsWith("Hygon"))
     860            enmIommuType = IommuType_AMD;
     861        else if (bstrCpuProfile.startsWith("Intel"))
     862        {
     863            if (   bstrCpuProfile.equals("Intel 8086")
     864                || bstrCpuProfile.equals("Intel 80186")
     865                || bstrCpuProfile.equals("Intel 80286")
     866                || bstrCpuProfile.equals("Intel 80386")
     867                || bstrCpuProfile.equals("Intel 80486"))
     868                enmIommuType = IommuType_None;
     869            else
     870                enmIommuType = IommuType_Intel;
     871        }
     872# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     873        else if (ASMIsAmdCpu())
     874            enmIommuType = IommuType_AMD;
    852875        else if (ASMIsIntelCpu())
    853             iommuType = IommuType_Intel;
     876            enmIommuType = IommuType_Intel;
     877# endif
    854878        else
    855879        {
    856880            /** @todo Should we handle other CPUs like Shanghai, VIA etc. here? */
    857881            LogRel(("WARNING! Unrecognized CPU type, IOMMU disabled.\n"));
    858             iommuType = IommuType_None;
     882            enmIommuType = IommuType_None;
    859883        }
    860884    }
    861885
    862     if (iommuType == IommuType_AMD)
     886    if (enmIommuType == IommuType_AMD)
    863887    {
    864 #ifdef VBOX_WITH_IOMMU_AMD
     888# ifdef VBOX_WITH_IOMMU_AMD
    865889        /*
    866890         * Reserve the specific PCI address of the "SB I/O APIC" when using
     
    868892         */
    869893        uIoApicPciAddress = VBOX_PCI_BDF_SB_IOAPIC;
    870 #else
     894# else
    871895        LogRel(("WARNING! AMD IOMMU not supported, IOMMU disabled.\n"));
    872         iommuType = IommuType_None;
    873 #endif
     896        enmIommuType = IommuType_None;
     897# endif
    874898    }
    875899
    876     if (iommuType == IommuType_Intel)
     900    if (enmIommuType == IommuType_Intel)
    877901    {
    878 #ifdef VBOX_WITH_IOMMU_INTEL
     902# ifdef VBOX_WITH_IOMMU_INTEL
    879903        /*
    880904         * Reserve a unique PCI address for the I/O APIC when using
     
    883907         */
    884908        uIoApicPciAddress = VBOX_PCI_BDF_SB_IOAPIC;
    885 #else
     909# else
    886910        LogRel(("WARNING! Intel IOMMU not supported, IOMMU disabled.\n"));
    887         iommuType = IommuType_None;
    888 #endif
     911        enmIommuType = IommuType_None;
     912# endif
    889913    }
    890914
    891     if (   iommuType == IommuType_AMD
    892         || iommuType == IommuType_Intel)
     915    if (   enmIommuType == IommuType_AMD
     916        || enmIommuType == IommuType_Intel)
    893917    {
    894918        if (chipsetType != ChipsetType_ICH9)
     
    900924    }
    901925#else
    902     IommuType_T const iommuType = IommuType_None;
     926    IommuType_T const enmIommuType = IommuType_None;
    903927#endif
    904     Assert(iommuType != IommuType_Automatic);
    905     BusAssignmentManager *pBusMgr = mBusMgr = BusAssignmentManager::createInstance(pVMM, chipsetType, iommuType);
     928
     929    /* Instantiate the bus assignment manager. */
     930    Assert(enmIommuType != IommuType_Automatic);
     931    BusAssignmentManager *pBusMgr = mBusMgr = BusAssignmentManager::createInstance(pVMM, chipsetType, enmIommuType);
    906932
    907933    ULONG cCpus = 1;
     
    10791105
    10801106        /* CPUM profile name. */
    1081         hrc = pMachine->COMGETTER(CPUProfile)(bstr.asOutParam());                           H();
    1082         InsertConfigString(pCPUM, "GuestCpuName", bstr);
     1107        InsertConfigString(pCPUM, "GuestCpuName", bstrCpuProfile);
    10831108
    10841109        /*
     
    10881113         * dead wrong on 8086 (see http://www.os2museum.com/wp/undocumented-8086-opcodes/).
    10891114         */
    1090         if (   bstr.equals("Intel 80386") /* just for now */
    1091             || bstr.equals("Intel 80286")
    1092             || bstr.equals("Intel 80186")
    1093             || bstr.equals("Nec V20")
    1094             || bstr.equals("Intel 8086") )
     1115        if (   bstrCpuProfile.equals("Intel 80386") /* just for now */
     1116            || bstrCpuProfile.equals("Intel 80286")
     1117            || bstrCpuProfile.equals("Intel 80186")
     1118            || bstrCpuProfile.equals("Nec V20")
     1119            || bstrCpuProfile.equals("Intel 8086") )
    10951120        {
    10961121            InsertConfigInteger(pEM, "IemExecutesAll", true);
    1097             if (!bstr.equals("Intel 80386"))
     1122            if (!bstrCpuProfile.equals("Intel 80386"))
    10981123            {
    10991124                fEnableAPIC = false;
     
    15911616#endif
    15921617
    1593             if (iommuType == IommuType_AMD)
     1618            if (enmIommuType == IommuType_AMD)
    15941619            {
    15951620                /* AMD IOMMU. */
     
    16161641                hrc = pBusMgr->assignPCIDevice("sb-ioapic", NULL /* pCfg */, PCIAddr, true /*fGuestAddressRequired*/);  H();
    16171642            }
    1618             else if (iommuType == IommuType_Intel)
     1643            else if (enmIommuType == IommuType_Intel)
    16191644            {
    16201645                /* Intel IOMMU. */
     
    17741799                InsertConfigNode(pInst,    "Config", &pCfg);
    17751800                InsertConfigInteger(pCfg,  "NumCPUs", cCpus);
    1776                 if (iommuType == IommuType_Intel)
     1801                if (enmIommuType == IommuType_AMD)
     1802                    InsertConfigInteger(pCfg, "PCIAddress", uIoApicPciAddress);
     1803                else if (enmIommuType == IommuType_Intel)
    17771804                {
    17781805                    InsertConfigString(pCfg, "ChipType", "DMAR");
    17791806                    InsertConfigInteger(pCfg, "PCIAddress", uIoApicPciAddress);
    17801807                }
    1781                 else if (iommuType == IommuType_AMD)
    1782                     InsertConfigInteger(pCfg, "PCIAddress", uIoApicPciAddress);
    17831808            }
    17841809        }
     
    35093534                }
    35103535            }
    3511             if (iommuType == IommuType_AMD)
     3536            if (enmIommuType == IommuType_AMD)
    35123537            {
    35133538                PCIBusAddress Address;
     
    35273552                }
    35283553            }
    3529             else if (iommuType == IommuType_Intel)
     3554            else if (enmIommuType == IommuType_Intel)
    35303555            {
    35313556                PCIBusAddress Address;
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