VirtualBox

Changeset 108822 in vbox for trunk/src


Ignore:
Timestamp:
Apr 2, 2025 5:36:47 AM (13 days ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168268
Message:

VMM/CPUM: bugref:10877 Configure the ID_AA64PFR0_EL1 system register with the availability of the GIC CPU interface (required for EFI firmware).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId-armv8.cpp

    r108405 r108822  
    3838#include "CPUMInternal-armv8.h"
    3939#include <VBox/vmm/vmcc.h>
     40#include <VBox/gic.h>
    4041
    4142#include <VBox/err.h>
     
    108109 * @param   pCpum       The CPUM instance data.
    109110 * @param   pConfig     The CPUID configuration we've read from CFGM.
    110  */
    111 static int cpumR3CpuIdSanitize(PVM pVM, PCPUM pCpum, PCPUMCPUIDCONFIG pConfig)
     111 * @param   pCpumCfg    The CPUM CFGM config.
     112 */
     113static int cpumR3CpuIdSanitize(PVM pVM, PCPUM pCpum, PCPUMCPUIDCONFIG pConfig, PCFGMNODE pCpumCfg)
    112114{
    113115#define PORTABLE_CLEAR_BITS_WHEN(Lvl, a_pLeafReg, FeatNm, fMask, uValue) \
     
    168170    /* Write ID_AA64ISAR0_EL1 register back. */
    169171    pVM->cpum.s.GuestIdRegs.u64RegIdAa64Isar0El1 = u64IdReg;
     172
     173    /* ID_AA64PFR0_EL1 */
     174    u64IdReg = pVM->cpum.s.GuestIdRegs.u64RegIdAa64Pfr0El1;
     175
     176    uint8_t uArchRev;
     177    int rc = CFGMR3QueryU8(pCpumCfg, "GicArchRev", &uArchRev);
     178    AssertRCReturn(rc, rc);
     179    if (uArchRev == GIC_DIST_REG_PIDR2_ARCHREV_GICV3)
     180        u64IdReg = RT_BF_SET(u64IdReg, ARMV8_ID_AA64PFR0_EL1_GIC, ARMV8_ID_AA64PFR0_EL1_GIC_V3_V4); /* 3.0 */
     181    else if (uArchRev == GIC_DIST_REG_PIDR2_ARCHREV_GICV4)
     182    {
     183        uint8_t uArchRevMinor = 0;
     184        rc = CFGMR3QueryU8Def(pCpumCfg, "GicArchRevMinor", &uArchRevMinor, 0);
     185        u64IdReg = uArchRevMinor == 0
     186                 ? RT_BF_SET(u64IdReg, ARMV8_ID_AA64PFR0_EL1_GIC, ARMV8_ID_AA64PFR0_EL1_GIC_V3_V4)  /* 4.0 */
     187                 : RT_BF_SET(u64IdReg, ARMV8_ID_AA64PFR0_EL1_GIC, ARMV8_ID_AA64PFR0_EL1_GIC_V4_1);  /* 4.1 */
     188    }
     189    else
     190        Assert(RT_BF_GET(u64IdReg, ARMV8_ID_AA64PFR0_EL1_GIC) == ARMV8_ID_AA64PFR0_EL1_GIC_NOT_IMPL);
     191
     192    /* Write ID_AA64PFR0_EL1 register back. */
     193    pVM->cpum.s.GuestIdRegs.u64RegIdAa64Pfr0El1 = u64IdReg;
    170194
    171195    /** @todo Other ID and feature registers. */
     
    424448     */
    425449    if (RT_SUCCESS(rc))
    426         rc = cpumR3CpuIdSanitize(pVM, pCpum, &Config);
     450        rc = cpumR3CpuIdSanitize(pVM, pCpum, &Config, pCpumCfg);
    427451
    428452    return rc;
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