|
@@ -5326,6 +5326,11 @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
|
|
|
/* Clear RES0 bits. */
|
|
|
value &= valid_mask;
|
|
|
|
|
|
+ /* RW is RAO/WI if EL1 is AArch64 only */
|
|
|
+ if (!cpu_isar_feature(aa64_aa32_el1, cpu)) {
|
|
|
+ value |= HCR_RW;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* These bits change the MMU setup:
|
|
|
* HCR_VM enables stage 2 translation
|
|
@@ -5383,6 +5388,12 @@ static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
|
|
|
do_hcr_write(env, value, MAKE_64BIT_MASK(32, 32));
|
|
|
}
|
|
|
|
|
|
+static void hcr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
|
|
|
+{
|
|
|
+ /* hcr_write will set the RES1 bits on an AArch64-only CPU */
|
|
|
+ hcr_write(env, ri, 0);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Return the effective value of HCR_EL2, at the given security state.
|
|
|
* Bits that are not included here:
|
|
@@ -5618,6 +5629,7 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
|
|
|
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 0,
|
|
|
.access = PL2_RW, .fieldoffset = offsetof(CPUARMState, cp15.hcr_el2),
|
|
|
.nv2_redirect_offset = 0x78,
|
|
|
+ .resetfn = hcr_reset,
|
|
|
.writefn = hcr_write, .raw_writefn = raw_write },
|
|
|
{ .name = "HCR", .state = ARM_CP_STATE_AA32,
|
|
|
.type = ARM_CP_ALIAS | ARM_CP_IO,
|