VirtualBox

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


Ignore:
Timestamp:
May 24, 2023 11:39:15 AM (21 months ago)
Author:
vboxsync
Message:

VMM/CPUM-armv8: Implement OSDLR_EL1, OSLAR_EL1 and OSLSR_EL1 accessed by Linux guests, bugref:10387

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllSysRegs-armv8.cpp

    r99388 r99956  
    3737#include <VBox/err.h>
    3838
     39#include <iprt/armv8.h>
     40
    3941
    4042/*********************************************************************************************************************************
     
    160162
    161163
     164
     165/** @callback_method_impl{FNCPUMRDSYSREG} */
     166static DECLCALLBACK(VBOXSTRICTRC) cpumSysRegRd_OslsrEl1(PVMCPUCC pVCpu, uint32_t idSysReg, PCCPUMSYSREGRANGE pRange, uint64_t *puValue)
     167{
     168    RT_NOREF(idSysReg, pRange);
     169    *puValue = pVCpu->cpum.s.Guest.fOsLck ? ARMV8_OSLSR_EL1_AARCH64_OSLK : 0;
     170    return VINF_SUCCESS;
     171}
     172
     173
     174/** @callback_method_impl{FNCPUMWRSYSREG} */
     175static DECLCALLBACK(VBOXSTRICTRC) cpumSysRegWr_OslarEl1(PVMCPUCC pVCpu, uint32_t idSysReg, PCCPUMSYSREGRANGE pRange, uint64_t uValue, uint64_t uRawValue)
     176{
     177    RT_NOREF(idSysReg, pRange, uRawValue);
     178    Assert(!(uValue & ~ARMV8_OSLAR_EL1_AARCH64_OSLK));
     179    pVCpu->cpum.s.Guest.fOsLck = RT_BOOL(uValue);
     180    return VINF_SUCCESS;
     181}
     182
     183
    162184/**
    163185 * System register read function table.
     
    170192    { cpumSysRegRd_WriteOnly },
    171193    { cpumSysRegRd_GicV3Icc  },
     194    { cpumSysRegRd_OslsrEl1  },
    172195};
    173196
     
    183206    { NULL }, /* Alias */
    184207    { cpumSysRegWr_GicV3Icc },
     208    { cpumSysRegWr_OslarEl1 },
    185209};
    186210
     
    402426        STAM_REL_COUNTER_INC(&pVM->cpum.s.cSysRegWrites);
    403427        STAM_REL_COUNTER_INC(&pVM->cpum.s.cSysRegWritesUnknown);
    404         rcStrict = VERR_CPUM_RAISE_GP_0;
     428        rcStrict = VERR_CPUM_RAISE_GP_0; /** @todo Better status code. */
    405429    }
    406430    return rcStrict;
     
    425449    CPUM_ASSERT_RD_SYSREG_FN(WriteOnly);
    426450    CPUM_ASSERT_RD_SYSREG_FN(GicV3Icc);
     451    CPUM_ASSERT_RD_SYSREG_FN(OslsrEl1);
    427452
    428453    AssertReturn(g_aCpumWrSysRegFns[kCpumSysRegWrFn_Invalid].pfnWrSysReg == NULL, VERR_CPUM_IPE_2);
     
    430455    CPUM_ASSERT_WR_SYSREG_FN(ReadOnly);
    431456    CPUM_ASSERT_WR_SYSREG_FN(GicV3Icc);
     457    CPUM_ASSERT_WR_SYSREG_FN(OslarEl1);
    432458
    433459    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMR3/CPUM-armv8.cpp

    r99739 r99956  
    7171
    7272/*********************************************************************************************************************************
     73*   Defined Constants And Macros                                                                                                 *
     74*********************************************************************************************************************************/
     75
     76/** Internal form used by the macros. */
     77#ifdef VBOX_WITH_STATISTICS
     78# define RINT(a_uFirst, a_uLast, a_enmRdFn, a_enmWrFn, a_offCpumCpu, a_uInitOrReadValue, a_fWrIgnMask, a_fWrGpMask, a_szName) \
     79    { a_uFirst, a_uLast, a_enmRdFn, a_enmWrFn, a_offCpumCpu, 0, 0, a_uInitOrReadValue, a_fWrIgnMask, a_fWrGpMask, a_szName, \
     80      { 0 }, { 0 }, { 0 }, { 0 } }
     81#else
     82# define RINT(a_uFirst, a_uLast, a_enmRdFn, a_enmWrFn, a_offCpumCpu, a_uInitOrReadValue, a_fWrIgnMask, a_fWrGpMask, a_szName) \
     83    { a_uFirst, a_uLast, a_enmRdFn, a_enmWrFn, a_offCpumCpu, 0, 0, a_uInitOrReadValue, a_fWrIgnMask, a_fWrGpMask, a_szName }
     84#endif
     85
     86/** Function handlers, extended version. */
     87#define MFX(a_uMsr, a_szName, a_enmRdFnSuff, a_enmWrFnSuff, a_uValue, a_fWrIgnMask, a_fWrGpMask) \
     88    RINT(a_uMsr, a_uMsr, kCpumSysRegRdFn_##a_enmRdFnSuff, kCpumSysRegWrFn_##a_enmWrFnSuff, 0, a_uValue, a_fWrIgnMask, a_fWrGpMask, a_szName)
     89/** Function handlers, read-only. */
     90#define MFO(a_uMsr, a_szName, a_enmRdFnSuff) \
     91    RINT(a_uMsr, a_uMsr, kCpumSysRegRdFn_##a_enmRdFnSuff, kCpumSysRegWrFn_ReadOnly, 0, 0, 0, UINT64_MAX, a_szName)
     92/** Read-only fixed value, ignores all writes. */
     93#define MVI(a_uMsr, a_szName, a_uValue) \
     94    RINT(a_uMsr, a_uMsr, kCpumSysRegRdFn_FixedValue, kCpumSysRegWrFn_IgnoreWrite, 0, a_uValue, UINT64_MAX, 0, a_szName)
     95
     96
     97/*********************************************************************************************************************************
    7398*   Structures and Typedefs                                                                                                      *
    7499*********************************************************************************************************************************/
     
    103128*   Global Variables                                                                                                             *
    104129*********************************************************************************************************************************/
     130/**
     131 * System register ranges.
     132 */
     133static CPUMSYSREGRANGE const g_aSysRegRanges[] =
     134{
     135    MFX(ARMV8_AARCH64_SYSREG_OSLAR_EL1, "OSLAR_EL1", WriteOnly, OslarEl1, 0, UINT64_C(0xfffffffffffffffe), UINT64_C(0xfffffffffffffffe)),
     136    MFO(ARMV8_AARCH64_SYSREG_OSLSR_EL1, "OSLSR_EL1", OslsrEl1),
     137    MVI(ARMV8_AARCH64_SYSREG_OSDLR_EL1, "OSDLR_EL1", 0)
     138};
     139
     140
    105141#if 0 /** @todo Will come later. */
    106142/** Saved state field descriptors for CPUMCTX. */
     
    185221
    186222/**
     223 * Initializes the guest system register states.
     224 *
     225 * @returns VBox status code.
     226 * @param   pVM         The cross context VM structure.
     227 */
     228static int cpumR3InitSysRegs(PVM pVM)
     229{
     230    for (uint32_t i = 0; i < RT_ELEMENTS(g_aSysRegRanges); i++)
     231    {
     232        int rc = CPUMR3SysRegRangesInsert(pVM, &g_aSysRegRanges[i]);
     233        AssertLogRelRCReturn(rc, rc);
     234    }
     235
     236    return VINF_SUCCESS;
     237}
     238
     239
     240/**
    187241 * Initializes the CPUM.
    188242 *
     
    228282
    229283    rc = cpumR3DbgInit(pVM);
     284    if (RT_FAILURE(rc))
     285        return rc;
     286
     287    /*
     288     * Initialize the Guest system register states.
     289     */
     290    rc = cpumR3InitSysRegs(pVM);
    230291    if (RT_FAILURE(rc))
    231292        return rc;
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