target/arm: Implement VNCR_EL2 register
For FEAT_NV2, a new system register VNCR_EL2 holds the base address of the memory which nested-guest system register accesses are redirected to. Implement this register. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Miguel Luis <miguel.luis@oracle.com>
This commit is contained in:
parent
a13cd25d9b
commit
b5ba6c99a8
@ -547,6 +547,9 @@ typedef struct CPUArchState {
|
||||
uint64_t gpccr_el3;
|
||||
uint64_t gptbr_el3;
|
||||
uint64_t mfar_el3;
|
||||
|
||||
/* NV2 register */
|
||||
uint64_t vncr_el2;
|
||||
} cp15;
|
||||
|
||||
struct {
|
||||
|
@ -8131,6 +8131,28 @@ static const ARMCPRegInfo fgt_reginfo[] = {
|
||||
.access = PL2_RW, .accessfn = access_fgt,
|
||||
.fieldoffset = offsetof(CPUARMState, cp15.fgt_exec[FGTREG_HFGITR]) },
|
||||
};
|
||||
|
||||
static void vncr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/*
|
||||
* Clear the RES0 bottom 12 bits; this means at runtime we can guarantee
|
||||
* that VNCR_EL2 + offset is 64-bit aligned. We don't need to do anything
|
||||
* about the RESS bits at the top -- we choose the "generate an EL2
|
||||
* translation abort on use" CONSTRAINED UNPREDICTABLE option (i.e. let
|
||||
* the ptw.c code detect the resulting invalid address).
|
||||
*/
|
||||
env->cp15.vncr_el2 = value & ~0xfffULL;
|
||||
}
|
||||
|
||||
static const ARMCPRegInfo nv2_reginfo[] = {
|
||||
{ .name = "VNCR_EL2", .state = ARM_CP_STATE_AA64,
|
||||
.opc0 = 3, .opc1 = 4, .crn = 2, .crm = 2, .opc2 = 0,
|
||||
.access = PL2_RW,
|
||||
.writefn = vncr_write,
|
||||
.fieldoffset = offsetof(CPUARMState, cp15.vncr_el2) },
|
||||
};
|
||||
|
||||
#endif /* TARGET_AARCH64 */
|
||||
|
||||
static CPAccessResult access_predinv(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
@ -9614,6 +9636,10 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||
define_arm_cp_regs(cpu, rme_mte_reginfo);
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu_isar_feature(aa64_nv2, cpu)) {
|
||||
define_arm_cp_regs(cpu, nv2_reginfo);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cpu_isar_feature(any_predinv, cpu)) {
|
||||
|
Loading…
Reference in New Issue
Block a user