VirtualBox

Changeset 106476 in vbox


Ignore:
Timestamp:
Oct 18, 2024 12:57:36 PM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165303
Message:

VMMArm: Skeleton of the PMU device emulation enough to make Windows/ARM boot as a guest and have it out of the NEM darwin backend, bugref:10778

Location:
trunk
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/log.h

    r106346 r106476  
    171171    /** Generic Platform Device group. */
    172172    LOG_GROUP_DEV_PLATFORM,
     173    /** PMU Device group. */
     174    LOG_GROUP_DEV_PMU,
    173175    /** QEMU firmware config Device group. */
    174176    LOG_GROUP_DEV_QEMUFWCFG,
     
    927929    "DEV_PIT", \
    928930    "DEV_PLATFORM", \
     931    "DEV_PMU", \
    929932    "DEV_QEMUFWCFG", \
    930933    "DEV_RTC", \
  • trunk/include/VBox/vmm/cpum-armv8.h

    r106381 r106476  
    7272    /** Read from the OSLSR_EL1 syste register. */
    7373    kCpumSysRegRdFn_OslsrEl1,
     74    /** Read from a PMU system register. */
     75    kCpumSysRegRdFn_Pmu,
    7476
    7577    /** End of valid system register read function indexes. */
     
    98100    /** Write to the OSLAR_EL1 syste register. */
    99101    kCpumSysRegWrFn_OslarEl1,
     102    /** Write to a PMU system register. */
     103    kCpumSysRegWrFn_Pmu,
    100104
    101105    /** End of valid system register write function indexes. */
  • trunk/src/VBox/Main/src-client/ConsoleImplConfigArmV8.cpp

    r106388 r106476  
    499499        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    500500
     501        /*
     502         * Configure the perofrmance monitoring unit.
     503         */
     504        /** @todo Make this configurable and enable as default for Windows VMs because they assume a working PMU
     505         * (which is not available in hardware on AppleSilicon).
     506         */
     507        InsertConfigNode(pDevices, "pmu",                &pDev);
     508        InsertConfigNode(pDev,     "0",                  &pInst);
     509        InsertConfigInteger(pInst, "Trusted",            1);
     510        InsertConfigNode(pInst,    "Config",             &pCfg);
     511
    501512        RTGCPHYS GCPhysMmioStart;
    502513        RTGCPHYS cbMmio;
  • trunk/src/VBox/VMM/Makefile.kmk

    r106475 r106476  
    470470        VMMR3/PGMSavedState.cpp \
    471471        VMMR3/PGMSharedPage.cpp \
     472        VMMR3/PMUR3.cpp \
    472473        VMMR3/SSM.cpp \
    473474        VMMR3/STAM.cpp \
     
    503504        VMMAll/GICAll.cpp \
    504505        VMMAll/GIMAll.cpp \
     506        VMMAll/PMUAll.cpp \
    505507        VMMAll/TMAll.cpp \
    506508        VMMAll/TMAllCpu.cpp \
  • trunk/src/VBox/VMM/VMMAll/CPUMAllSysRegs-armv8.cpp

    r106061 r106476  
    3434#include "CPUMInternal-armv8.h"
    3535#include <VBox/vmm/gic.h>
     36#include <VBox/vmm/pmu.h>
    3637#include <VBox/vmm/vmcc.h>
    3738#include <VBox/err.h>
     
    182183
    183184
     185
     186/** @callback_method_impl{FNCPUMRDSYSREG} */
     187static DECLCALLBACK(VBOXSTRICTRC) cpumSysRegRd_Pmu(PVMCPUCC pVCpu, uint32_t idSysReg, PCCPUMSYSREGRANGE pRange, uint64_t *puValue)
     188{
     189    RT_NOREF_PV(pRange);
     190    return PMUReadSysReg(pVCpu, idSysReg, puValue);
     191}
     192
     193
     194/** @callback_method_impl{FNCPUMWRSYSREG} */
     195static DECLCALLBACK(VBOXSTRICTRC) cpumSysRegWr_Pmu(PVMCPUCC pVCpu, uint32_t idSysReg, PCCPUMSYSREGRANGE pRange, uint64_t uValue, uint64_t uRawValue)
     196{
     197    RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
     198    return PMUWriteSysReg(pVCpu, idSysReg, uValue);
     199}
     200
     201
    184202/**
    185203 * System register read function table.
     
    193211    { cpumSysRegRd_GicV3Icc  },
    194212    { cpumSysRegRd_OslsrEl1  },
     213    { cpumSysRegRd_Pmu       }
    195214};
    196215
     
    207226    { cpumSysRegWr_GicV3Icc },
    208227    { cpumSysRegWr_OslarEl1 },
     228    { cpumSysRegWr_Pmu      }
    209229};
    210230
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-darwin-armv8.cpp

    r106463 r106476  
    17311731    {
    17321732        RT_NOREF(pVM);
    1733 
    1734         /** @todo Windows assumes a working PMU which is not available on AppleSilicon. It uses it
    1735          * to determine the base frequency it seems (because without the * 100 multiplier the frequency
    1736          * is detetcted as 24MHz. This needs to be moved into a separate PMU emulation (to be created) for
    1737          * all backends to share (Linux/KVM when running on AppleSilicon hardware). */
    1738         if (   idSysReg == ARMV8_AARCH64_SYSREG_PMCR_EL0
    1739             || idSysReg == ARMV8_AARCH64_SYSREG_PMCCNTR_EL0
    1740             || idSysReg == ARMV8_AARCH64_SYSREG_PMCNTENCLR_EL0)
    1741         {
    1742             if (idSysReg == ARMV8_AARCH64_SYSREG_PMCCNTR_EL0)
    1743             {
    1744                 u64Val = ASMReadTSC() * 100;
    1745             }
    1746             else
    1747                 u64Val = 0;
    1748         }
    1749         else
    1750             rcStrict = CPUMQueryGuestSysReg(pVCpu, idSysReg, &u64Val);
     1733        rcStrict = CPUMQueryGuestSysReg(pVCpu, idSysReg, &u64Val);
    17511734        Log4(("SysInsnExit/%u: %08RX64: READ %u:%u:%u:%u:%u -> %#RX64 rcStrict=%Rrc\n",
    17521735              pVCpu->idCpu, pVCpu->cpum.GstCtx.Pc.u64, uOp0, uOp1, uCRn, uCRm, uOp2, u64Val,
     
    17571740    else
    17581741    {
    1759         if (   idSysReg != ARMV8_AARCH64_SYSREG_PMCNTENCLR_EL0
    1760             && idSysReg != ARMV8_AARCH64_SYSREG_PMOVSCLR_EL0
    1761             && idSysReg != ARMV8_AARCH64_SYSREG_PMINTENCLR_EL1
    1762             && idSysReg != ARMV8_AARCH64_SYSREG_PMCR_EL0
    1763             && idSysReg != ARMV8_AARCH64_SYSREG_PMCCFILTR_EL0
    1764             && idSysReg != ARMV8_AARCH64_SYSREG_PMCNTENSET_EL0
    1765             && idSysReg != ARMV8_AARCH64_SYSREG_PMUSERENR_EL0
    1766             && idSysReg != ARMV8_AARCH64_SYSREG_PMCCNTR_EL0)
    1767         {
    1768             u64Val = nemR3DarwinGetGReg(pVCpu, uReg);
    1769             rcStrict = CPUMSetGuestSysReg(pVCpu, idSysReg, u64Val);
    1770         }
     1742        u64Val = nemR3DarwinGetGReg(pVCpu, uReg);
     1743        rcStrict = CPUMSetGuestSysReg(pVCpu, idSysReg, u64Val);
    17711744        Log4(("SysInsnExit/%u: %08RX64: WRITE %u:%u:%u:%u:%u %#RX64 -> rcStrict=%Rrc\n",
    17721745              pVCpu->idCpu, pVCpu->cpum.GstCtx.Pc.u64, uOp0, uOp1, uCRn, uCRm, uOp2, u64Val,
  • trunk/src/VBox/VMM/VMMR3/PDMDevice.cpp

    r106061 r106476  
    3636#if defined(VBOX_VMM_TARGET_ARMV8)
    3737# include <VBox/vmm/gic.h>
     38# include <VBox/vmm/pmu.h>
    3839#else
    3940# include <VBox/vmm/apic.h>
     
    704705     */
    705706    rc = pdmR3DevReg_Register(&RegCB.Core, &g_DeviceGICNem);
     707    AssertRCReturn(rc, rc);
     708
     709    /*
     710     * Register the internal VMM PMU device.
     711     */
     712    rc = pdmR3DevReg_Register(&RegCB.Core, &g_DevicePMU);
    706713    AssertRCReturn(rc, rc);
    707714#else
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