target/arm: Improve masking of HCR/HCR2 RES0 bits
Don't merely start with v8.0, handle v7VE as well. Ensure that writes from aarch32 mode do not change bits in the other half of the register. Protect reads of aa64 id registers with ARM_FEATURE_AARCH64. Suggested-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200229012811.24129-2-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
f4228077e8
commit
d1fb4da208
@ -5086,11 +5086,15 @@ static const ARMCPRegInfo el3_no_el2_v8_cp_reginfo[] = {
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
|
||||
static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
|
||||
{
|
||||
ARMCPU *cpu = env_archcpu(env);
|
||||
/* Begin with bits defined in base ARMv8.0. */
|
||||
uint64_t valid_mask = MAKE_64BIT_MASK(0, 34);
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_V8)) {
|
||||
valid_mask |= MAKE_64BIT_MASK(0, 34); /* ARMv8.0 */
|
||||
} else {
|
||||
valid_mask |= MAKE_64BIT_MASK(0, 28); /* ARMv7VE */
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_EL3)) {
|
||||
valid_mask &= ~HCR_HCD;
|
||||
@ -5104,14 +5108,17 @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
|
||||
*/
|
||||
valid_mask &= ~HCR_TSC;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_vh, cpu)) {
|
||||
valid_mask |= HCR_E2H;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_lor, cpu)) {
|
||||
valid_mask |= HCR_TLOR;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_pauth, cpu)) {
|
||||
valid_mask |= HCR_API | HCR_APK;
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
|
||||
if (cpu_isar_feature(aa64_vh, cpu)) {
|
||||
valid_mask |= HCR_E2H;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_lor, cpu)) {
|
||||
valid_mask |= HCR_TLOR;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_pauth, cpu)) {
|
||||
valid_mask |= HCR_API | HCR_APK;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear RES0 bits. */
|
||||
@ -5143,12 +5150,17 @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
|
||||
arm_cpu_update_vfiq(cpu);
|
||||
}
|
||||
|
||||
static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
|
||||
{
|
||||
do_hcr_write(env, value, 0);
|
||||
}
|
||||
|
||||
static void hcr_writehigh(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Handle HCR2 write, i.e. write to high half of HCR_EL2 */
|
||||
value = deposit64(env->cp15.hcr_el2, 32, 32, value);
|
||||
hcr_write(env, NULL, value);
|
||||
do_hcr_write(env, value, MAKE_64BIT_MASK(0, 32));
|
||||
}
|
||||
|
||||
static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
@ -5156,7 +5168,7 @@ static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
{
|
||||
/* Handle HCR write, i.e. write to low half of HCR_EL2 */
|
||||
value = deposit64(env->cp15.hcr_el2, 0, 32, value);
|
||||
hcr_write(env, NULL, value);
|
||||
do_hcr_write(env, value, MAKE_64BIT_MASK(32, 32));
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user