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 gpccr_el3;
|
||||||
uint64_t gptbr_el3;
|
uint64_t gptbr_el3;
|
||||||
uint64_t mfar_el3;
|
uint64_t mfar_el3;
|
||||||
|
|
||||||
|
/* NV2 register */
|
||||||
|
uint64_t vncr_el2;
|
||||||
} cp15;
|
} cp15;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@ -8131,6 +8131,28 @@ static const ARMCPRegInfo fgt_reginfo[] = {
|
|||||||
.access = PL2_RW, .accessfn = access_fgt,
|
.access = PL2_RW, .accessfn = access_fgt,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.fgt_exec[FGTREG_HFGITR]) },
|
.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 */
|
#endif /* TARGET_AARCH64 */
|
||||||
|
|
||||||
static CPAccessResult access_predinv(CPUARMState *env, const ARMCPRegInfo *ri,
|
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);
|
define_arm_cp_regs(cpu, rme_mte_reginfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpu_isar_feature(aa64_nv2, cpu)) {
|
||||||
|
define_arm_cp_regs(cpu, nv2_reginfo);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (cpu_isar_feature(any_predinv, cpu)) {
|
if (cpu_isar_feature(any_predinv, cpu)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user