VirtualBox

Changeset 108758 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Mar 26, 2025 4:05:20 PM (6 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168185
Message:

VMM/Arm: Add ACTLR_EL1 to the CPU state, bugref:10392

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

Legend:

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

    r107650 r108758  
    416416};
    417417
     418/**
     419 * Additional fields for v2
     420 */
     421static const SSMFIELD g_aCpumCtxFieldsV2[] =
     422{
     423    SSMFIELD_ENTRY(         CPUMCTX, Actlr.u64),
     424    SSMFIELD_ENTRY_TERM()
     425};
     426
    418427
    419428/**
     
    641650
    642651        SSMR3PutStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFields, NULL);
     652        SSMR3PutStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFieldsV2, NULL);
    643653
    644654        SSMR3PutU32(pSSM, pVCpu->cpum.s.fChanged);
     
    669679     * Validate version.
    670680     */
    671     if (uVersion != CPUM_SAVED_STATE_VERSION)
     681    if (   uVersion != CPUM_SAVED_STATE_VERSION
     682        && uVersion != CPUM_SAVED_STATE_VERSION_ARMV8_V1)
    672683    {
    673684        AssertMsgFailed(("cpumR3LoadExec: Invalid version uVersion=%d!\n", uVersion));
     
    695706            rc = SSMR3GetStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFields, NULL);
    696707            AssertRCReturn(rc, rc);
     708
     709            if (uVersion == CPUM_SAVED_STATE_VERSION_ARMV8_V2)
     710            {
     711                rc = SSMR3GetStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFieldsV2, NULL);
     712                AssertRCReturn(rc, rc);
     713            }
    697714
    698715            /*
  • trunk/src/VBox/VMM/VMMR3/CPUMDbg-armv8.cpp

    r107113 r108758  
    313313    CPU_REG_RW_AS("elr_el1",        ELR_EL1,        U64, Elr,             cpumR3RegGet_Generic,         cpumR3RegSet_Generic,         NULL,                       NULL                    ),
    314314    CPU_REG_RW_AS("vbar_el1",       VBAR_EL1,       U64, VBar,            cpumR3RegGet_Generic,         cpumR3RegSet_Generic,         NULL,                       NULL                    ),
     315    CPU_REG_RW_AS("actlr_el1",      ACTLR_EL1,      U64, Actlr,           cpumR3RegGet_Generic,         cpumR3RegSet_Generic,         NULL,                       NULL                    ),
    315316
    316317    CPU_REG_RW_AS("cnthctl_el2",    CNTHCTL_EL2,    U64, CntHCtlEl2,      cpumR3RegGet_Generic,         cpumR3RegSet_Generic,         NULL,                       NULL                    ),
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-darwin-armv8.cpp

    r108414 r108758  
    142142    HV_GIC_INT_PERFORMANCE_MONITOR = 30
    143143} hv_gic_intid_t;
     144
     145# define HV_SYS_REG_ACTLR_EL1   (hv_sys_reg_t)0xc081
    144146
    145147#else
     
    533535    { HV_SYS_REG_MDCCINT_EL1,       CPUMCTX_EXTRN_SYSREG_MISC,      RT_UOFFSETOF(CPUMCTX, MDccInt.u64)      }
    534536
     537};
     538/** Additional System registers to sync when on at least macOS Sequioa 15.0. */
     539static const struct
     540{
     541    hv_sys_reg_t    enmHvReg;
     542    uint32_t        fCpumExtrn;
     543    uint32_t        offCpumCtx;
     544} s_aCpumSysRegsSequioa[] =
     545{
     546    { HV_SYS_REG_ACTLR_EL1,         CPUMCTX_EXTRN_SYSREG_MISC,      RT_UOFFSETOF(CPUMCTX, Actlr.u64)        }
    535547};
    536548/** EL2 support system registers. */
     
    905917                        "sctlr_el1=%016VR{sctlr_el1} tcr_el1=%016VR{tcr_el1}\n"
    906918                        "ttbr0_el1=%016VR{ttbr0_el1} ttbr1_el1=%016VR{ttbr1_el1}\n"
    907                         "vbar_el1=%016VR{vbar_el1}\n"
     919                        "vbar_el1=%016VR{vbar_el1} actlr_el1=%016VR{actlr_el1}\n"
    908920                        );
    909921        if (pVM->nem.s.fEl2Enabled)
     
    9981010    }
    9991011
     1012    if (   pVM->nem.s.fMacOsSequia
     1013        && (fWhat & CPUMCTX_EXTRN_SYSREG_MISC))
     1014    {
     1015        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumSysRegsSequioa); i++)
     1016        {
     1017            uint64_t *pu64 = (uint64_t *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumSysRegsSequioa[i].offCpumCtx);
     1018            hrc |= hv_vcpu_get_sys_reg(pVCpu->nem.s.hVCpu, s_aCpumSysRegsSequioa[i].enmHvReg, pu64);
     1019
     1020            /* Make sure only the TOS bit is kept as this seems to return 0x0000000000000c00 which fails during writes. */
     1021            /** @todo r=aeichner Need to find out where the value comes from, some bits were reverse engineered here
     1022             * https://github.com/AsahiLinux/docs/blob/main/docs/hw/cpu/system-registers.md#actlr_el1-arm-standard-not-standard
     1023             * But the ones being set are not documented. Maybe they are always set by the Hypervisor...
     1024             */
     1025            if (s_aCpumSysRegsSequioa[i].enmHvReg == HV_SYS_REG_ACTLR_EL1)
     1026                *pu64 &= RT_BIT_64(1);
     1027        }
     1028    }
     1029
    10001030    if (   hrc == HV_SUCCESS
    10011031        && (fWhat & CPUMCTX_EXTRN_SYSREG_EL2)
     
    10981128                hrc |= hv_vcpu_set_sys_reg(pVCpu->nem.s.hVCpu, s_aCpumSysRegs[i].enmHvReg, *pu64);
    10991129            }
     1130        }
     1131    }
     1132
     1133    if (   pVM->nem.s.fMacOsSequia
     1134        && !(pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_SYSREG_MISC))
     1135    {
     1136        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumSysRegsSequioa); i++)
     1137        {
     1138            uint64_t *pu64 = (uint64_t *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumSysRegsSequioa[i].offCpumCtx);
     1139            hrc |= hv_vcpu_set_sys_reg(pVCpu->nem.s.hVCpu, s_aCpumSysRegsSequioa[i].enmHvReg, *pu64);
     1140            Assert(hrc == HV_SUCCESS);
    11001141        }
    11011142    }
     
    12881329        && hv_vm_config_get_el2_supported)
    12891330    {
     1331        pVM->nem.s.fMacOsSequia = true; /* hv_vm_config_get_el2_supported is only available on Sequioa 15.0. */
     1332
    12901333        hVmCfg = hv_vm_config_create();
    12911334
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-win-armv8.cpp

    r108757 r108758  
    14121412        ADD_SYSREG64(WHvArm64RegisterTpidrEl0,      pVCpu->cpum.GstCtx.aTpIdr[0]);
    14131413        ADD_SYSREG64(WHvArm64RegisterTpidrEl1,      pVCpu->cpum.GstCtx.aTpIdr[1]);
     1414        ADD_SYSREG64(WHvArm64RegisterActlrEl1,      pVCpu->cpum.GstCtx.Actlr);
    14141415    }
    14151416
     
    16011602        aenmNames[iReg++] = WHvArm64RegisterTpidrEl0;
    16021603        aenmNames[iReg++] = WHvArm64RegisterTpidrEl1;
     1604        aenmNames[iReg++] = WHvArm64RegisterActlrEl1;
    16031605    }
    16041606
     
    17981800        GET_SYSREG64(pVCpu->cpum.GstCtx.aTpIdr[0],  WHvArm64RegisterTpidrEl0);
    17991801        GET_SYSREG64(pVCpu->cpum.GstCtx.aTpIdr[1],  WHvArm64RegisterTpidrEl1);
     1802        GET_SYSREG64(pVCpu->cpum.GstCtx.Actlr,      WHvArm64RegisterActlrEl1);
    18001803    }
    18011804
  • trunk/src/VBox/VMM/include/CPUMInternal.h

    r107854 r108758  
    116116# define CPUM_SAVED_STATE_VERSION               CPUM_SAVED_STATE_VERSION_HWVIRT_VMX_4
    117117#elif defined(VBOX_VMM_TARGET_ARMV8)
    118 # define CPUM_SAVED_STATE_VERSION               CPUM_SAVED_STATE_VERSION_ARMV8_V1
     118# define CPUM_SAVED_STATE_VERSION               CPUM_SAVED_STATE_VERSION_ARMV8_V2
    119119#endif
    120120
     
    163163
    164164#if defined(VBOX_VMM_TARGET_ARMV8)
     165/** Adds ACTLR_EL1 to the ARMv8 saved state. */
     166# define CPUM_SAVED_STATE_VERSION_ARMV8_V2      2
    165167/** The initial ARMv8 saved state. */
    166168# define CPUM_SAVED_STATE_VERSION_ARMV8_V1      1
  • trunk/src/VBox/VMM/include/NEMInternal.h

    r108434 r108758  
    337337    /** Set if EL2 is enabled. */
    338338    bool                        fEl2Enabled  : 1;
     339    /** Set if we are running at least on macOS Sequioa 15.0. */
     340    bool                        fMacOsSequia : 1;
    339341# ifdef VBOX_VMM_TARGET_ARMV8
    340342    /** @name vTimer related state.
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