mirror of https://github.com/xemu-project/xemu.git
target/arm: Honor HCR_EL2.TID3 trapping requirements
HCR_EL2.TID3 mandates that access from EL1 to a long list of id registers traps to EL2, and QEMU has so far ignored this requirement. This breaks (among other things) KVM guests that have PtrAuth enabled, while the hypervisor doesn't want to expose the feature to its guest. To achieve this, KVM traps the ID registers (ID_AA64ISAR1_EL1 in this case), and masks out the unsupported feature. QEMU not honoring the trap request means that the guest observes that the feature is present in the HW, starts using it, and dies a horrible death when KVM injects an UNDEF, because the feature *really* isn't supported. Do the right thing by trapping to EL2 if HCR_EL2.TID3 is set. Note that this change does not include trapping of the MVFR registers from AArch32 (they are accessed via the VMRS instruction and need to be handled in a different way). Reported-by: Will Deacon <will@kernel.org> Signed-off-by: Marc Zyngier <maz@kernel.org> Tested-by: Will Deacon <will@kernel.org> Message-id: 20191123115618.29230-1-maz@kernel.org [PMM: added missing accessfn line for ID_AA4PFR2_EL1_RESERVED; changed names of access functions to include _tid3] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
7cf95aed53
commit
6a4ef4e5d1
|
@ -5978,6 +5978,26 @@ static const ARMCPRegInfo predinv_reginfo[] = {
|
||||||
REGINFO_SENTINEL
|
REGINFO_SENTINEL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static CPAccessResult access_aa64_tid3(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
bool isread)
|
||||||
|
{
|
||||||
|
if ((arm_current_el(env) < 2) && (arm_hcr_el2_eff(env) & HCR_TID3)) {
|
||||||
|
return CP_ACCESS_TRAP_EL2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CP_ACCESS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CPAccessResult access_aa32_tid3(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
bool isread)
|
||||||
|
{
|
||||||
|
if (arm_feature(env, ARM_FEATURE_V8)) {
|
||||||
|
return access_aa64_tid3(env, ri, isread);
|
||||||
|
}
|
||||||
|
|
||||||
|
return CP_ACCESS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
void register_cp_regs_for_features(ARMCPU *cpu)
|
void register_cp_regs_for_features(ARMCPU *cpu)
|
||||||
{
|
{
|
||||||
/* Register all the coprocessor registers based on feature bits */
|
/* Register all the coprocessor registers based on feature bits */
|
||||||
|
@ -6001,6 +6021,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||||
{ .name = "ID_PFR0", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_PFR0", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_pfr0 },
|
.resetvalue = cpu->id_pfr0 },
|
||||||
/* ID_PFR1 is not a plain ARM_CP_CONST because we don't know
|
/* ID_PFR1 is not a plain ARM_CP_CONST because we don't know
|
||||||
* the value of the GIC field until after we define these regs.
|
* the value of the GIC field until after we define these regs.
|
||||||
|
@ -6008,63 +6029,78 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||||
{ .name = "ID_PFR1", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_PFR1", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_NO_RAW,
|
.access = PL1_R, .type = ARM_CP_NO_RAW,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.readfn = id_pfr1_read,
|
.readfn = id_pfr1_read,
|
||||||
.writefn = arm_cp_write_ignore },
|
.writefn = arm_cp_write_ignore },
|
||||||
{ .name = "ID_DFR0", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_DFR0", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_dfr0 },
|
.resetvalue = cpu->id_dfr0 },
|
||||||
{ .name = "ID_AFR0", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_AFR0", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_afr0 },
|
.resetvalue = cpu->id_afr0 },
|
||||||
{ .name = "ID_MMFR0", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_MMFR0", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_mmfr0 },
|
.resetvalue = cpu->id_mmfr0 },
|
||||||
{ .name = "ID_MMFR1", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_MMFR1", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_mmfr1 },
|
.resetvalue = cpu->id_mmfr1 },
|
||||||
{ .name = "ID_MMFR2", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_MMFR2", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_mmfr2 },
|
.resetvalue = cpu->id_mmfr2 },
|
||||||
{ .name = "ID_MMFR3", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_MMFR3", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_mmfr3 },
|
.resetvalue = cpu->id_mmfr3 },
|
||||||
{ .name = "ID_ISAR0", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR0", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar0 },
|
.resetvalue = cpu->isar.id_isar0 },
|
||||||
{ .name = "ID_ISAR1", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR1", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar1 },
|
.resetvalue = cpu->isar.id_isar1 },
|
||||||
{ .name = "ID_ISAR2", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR2", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar2 },
|
.resetvalue = cpu->isar.id_isar2 },
|
||||||
{ .name = "ID_ISAR3", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR3", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar3 },
|
.resetvalue = cpu->isar.id_isar3 },
|
||||||
{ .name = "ID_ISAR4", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR4", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar4 },
|
.resetvalue = cpu->isar.id_isar4 },
|
||||||
{ .name = "ID_ISAR5", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR5", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar5 },
|
.resetvalue = cpu->isar.id_isar5 },
|
||||||
{ .name = "ID_MMFR4", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_MMFR4", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->id_mmfr4 },
|
.resetvalue = cpu->id_mmfr4 },
|
||||||
{ .name = "ID_ISAR6", .state = ARM_CP_STATE_BOTH,
|
{ .name = "ID_ISAR6", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa32_tid3,
|
||||||
.resetvalue = cpu->isar.id_isar6 },
|
.resetvalue = cpu->isar.id_isar6 },
|
||||||
REGINFO_SENTINEL
|
REGINFO_SENTINEL
|
||||||
};
|
};
|
||||||
|
@ -6185,164 +6221,204 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
||||||
{ .name = "ID_AA64PFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_NO_RAW,
|
.access = PL1_R, .type = ARM_CP_NO_RAW,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.readfn = id_aa64pfr0_read,
|
.readfn = id_aa64pfr0_read,
|
||||||
.writefn = arm_cp_write_ignore },
|
.writefn = arm_cp_write_ignore },
|
||||||
{ .name = "ID_AA64PFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.id_aa64pfr1},
|
.resetvalue = cpu->isar.id_aa64pfr1},
|
||||||
{ .name = "ID_AA64PFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64PFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ZFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ZFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
/* At present, only SVEver == 0 is defined anyway. */
|
/* At present, only SVEver == 0 is defined anyway. */
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64PFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64PFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64PFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64PFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 4, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64DFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->id_aa64dfr0 },
|
.resetvalue = cpu->id_aa64dfr0 },
|
||||||
{ .name = "ID_AA64DFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->id_aa64dfr1 },
|
.resetvalue = cpu->id_aa64dfr1 },
|
||||||
{ .name = "ID_AA64DFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64DFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64DFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64AFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64AFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->id_aa64afr0 },
|
.resetvalue = cpu->id_aa64afr0 },
|
||||||
{ .name = "ID_AA64AFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64AFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->id_aa64afr1 },
|
.resetvalue = cpu->id_aa64afr1 },
|
||||||
{ .name = "ID_AA64AFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64AFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64AFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64AFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 5, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.id_aa64isar0 },
|
.resetvalue = cpu->isar.id_aa64isar0 },
|
||||||
{ .name = "ID_AA64ISAR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.id_aa64isar1 },
|
.resetvalue = cpu->isar.id_aa64isar1 },
|
||||||
{ .name = "ID_AA64ISAR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64ISAR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64ISAR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 6, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.id_aa64mmfr0 },
|
.resetvalue = cpu->isar.id_aa64mmfr0 },
|
||||||
{ .name = "ID_AA64MMFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.id_aa64mmfr1 },
|
.resetvalue = cpu->isar.id_aa64mmfr1 },
|
||||||
{ .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "ID_AA64MMFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "ID_AA64MMFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "MVFR0_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR0_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 0,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 0,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.mvfr0 },
|
.resetvalue = cpu->isar.mvfr0 },
|
||||||
{ .name = "MVFR1_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR1_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 1,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.mvfr1 },
|
.resetvalue = cpu->isar.mvfr1 },
|
||||||
{ .name = "MVFR2_EL1", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR2_EL1", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 2,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 2,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = cpu->isar.mvfr2 },
|
.resetvalue = cpu->isar.mvfr2 },
|
||||||
{ .name = "MVFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR3_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 3,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 3,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "MVFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 4,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 4,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "MVFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 5,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 5,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "MVFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR6_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 6,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 6,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "MVFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
{ .name = "MVFR7_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
|
||||||
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 7,
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 7,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST,
|
.access = PL1_R, .type = ARM_CP_CONST,
|
||||||
|
.accessfn = access_aa64_tid3,
|
||||||
.resetvalue = 0 },
|
.resetvalue = 0 },
|
||||||
{ .name = "PMCEID0", .state = ARM_CP_STATE_AA32,
|
{ .name = "PMCEID0", .state = ARM_CP_STATE_AA32,
|
||||||
.cp = 15, .opc1 = 0, .crn = 9, .crm = 12, .opc2 = 6,
|
.cp = 15, .opc1 = 0, .crn = 9, .crm = 12, .opc2 = 6,
|
||||||
|
|
Loading…
Reference in New Issue