aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2019-02-15 09:56:39 +0000
committerPeter Maydell <peter.maydell@linaro.org>2019-02-15 09:56:39 +0000
commitd040242effe47850060d2ef1c461ff637d88a84d (patch)
tree09e86b777ea002630674a6063a8886aacb0fb858
parent522641660c3de64ed8322b8636c58625cd564a3f (diff)
downloadqemu-d040242effe47850060d2ef1c461ff637d88a84d.zip
qemu-d040242effe47850060d2ef1c461ff637d88a84d.tar.gz
qemu-d040242effe47850060d2ef1c461ff637d88a84d.tar.bz2
target/arm: expose remaining CPUID registers as RAZ
There are a whole bunch more registers in the CPUID space which are currently not used but are exposed as RAZ. To avoid too much duplication we expand ARMCPRegUserSpaceInfo to understand glob patterns so we only need one entry to tweak whole ranges of registers. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20190205190224.2198-5-alex.bennee@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--target/arm/cpu.h3
-rw-r--r--target/arm/helper.c26
2 files changed, 26 insertions, 3 deletions
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 7c31e5a..f033441 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -2474,6 +2474,9 @@ typedef struct ARMCPRegUserSpaceInfo {
/* Name of register */
const char *name;
+ /* Is the name actually a glob pattern */
+ bool is_glob;
+
/* Only some bits are exported to user space */
uint64_t exported_bits;
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 77c7305..5ac335f 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -6109,19 +6109,27 @@ void register_cp_regs_for_features(ARMCPU *cpu)
.fixed_bits = 0x0000000000000011 },
{ .name = "ID_AA64PFR1_EL1",
.exported_bits = 0x00000000000000f0 },
+ { .name = "ID_AA64PFR*_EL1_RESERVED",
+ .is_glob = true },
{ .name = "ID_AA64ZFR0_EL1" },
{ .name = "ID_AA64MMFR0_EL1",
.fixed_bits = 0x00000000ff000000 },
{ .name = "ID_AA64MMFR1_EL1" },
+ { .name = "ID_AA64MMFR*_EL1_RESERVED",
+ .is_glob = true },
{ .name = "ID_AA64DFR0_EL1",
.fixed_bits = 0x0000000000000006 },
{ .name = "ID_AA64DFR1_EL1" },
- { .name = "ID_AA64AFR0_EL1" },
- { .name = "ID_AA64AFR1_EL1" },
+ { .name = "ID_AA64DFR*_EL1_RESERVED",
+ .is_glob = true },
+ { .name = "ID_AA64AFR*",
+ .is_glob = true },
{ .name = "ID_AA64ISAR0_EL1",
.exported_bits = 0x00fffffff0fffff0 },
{ .name = "ID_AA64ISAR1_EL1",
.exported_bits = 0x000000f0ffffffff },
+ { .name = "ID_AA64ISAR*_EL1_RESERVED",
+ .is_glob = true },
REGUSERINFO_SENTINEL
};
modify_arm_cp_regs(v8_idregs, v8_user_idregs);
@@ -7020,8 +7028,17 @@ void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods)
ARMCPRegInfo *r;
for (m = mods; m->name; m++) {
+ GPatternSpec *pat = NULL;
+ if (m->is_glob) {
+ pat = g_pattern_spec_new(m->name);
+ }
for (r = regs; r->type != ARM_CP_SENTINEL; r++) {
- if (strcmp(r->name, m->name) == 0) {
+ if (pat && g_pattern_match_string(pat, r->name)) {
+ r->type = ARM_CP_CONST;
+ r->access = PL0U_R;
+ r->resetvalue = 0;
+ /* continue */
+ } else if (strcmp(r->name, m->name) == 0) {
r->type = ARM_CP_CONST;
r->access = PL0U_R;
r->resetvalue &= m->exported_bits;
@@ -7029,6 +7046,9 @@ void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods)
break;
}
}
+ if (pat) {
+ g_pattern_spec_free(pat);
+ }
}
}