To support CPU feature in AArch64, we need to move some field from ARMCPU to ARMISARegisters, add more definitions of ID fields, and add suport query-cpu-model-expansion qmp command. Let's backport upstream patches to do these. Signed-off-by: Peng Liang <liangpeng10@huawei.com>
454 lines
17 KiB
Diff
454 lines
17 KiB
Diff
From 2bc630dc858bd0c010b7c375ebf1e8f4b4e0e346 Mon Sep 17 00:00:00 2001
|
|
From: Peter Maydell <peter.maydell@linaro.org>
|
|
Date: Fri, 14 Feb 2020 17:51:13 +0000
|
|
Subject: [PATCH 10/13] target/arm: Test correct register in aa32_pan and
|
|
aa32_ats1e1 checks
|
|
|
|
The isar_feature_aa32_pan and isar_feature_aa32_ats1e1 functions
|
|
are supposed to be testing fields in ID_MMFR3; but a cut-and-paste
|
|
error meant we were looking at MVFR0 instead.
|
|
|
|
Fix the functions to look at the right register; this requires
|
|
us to move at least id_mmfr3 to the ARMISARegisters struct; we
|
|
choose to move all the ID_MMFRn registers for consistency.
|
|
|
|
Fixes: 3d6ad6bb466f
|
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
|
Message-id: 20200214175116.9164-19-peter.maydell@linaro.org
|
|
---
|
|
hw/intc/armv7m_nvic.c | 8 ++--
|
|
target/arm/cpu.c | 96 +++++++++++++++++++++----------------------
|
|
target/arm/cpu.h | 14 +++----
|
|
target/arm/cpu64.c | 28 ++++++-------
|
|
target/arm/helper.c | 12 +++---
|
|
target/arm/kvm32.c | 17 ++++++++
|
|
target/arm/kvm64.c | 10 +++++
|
|
7 files changed, 106 insertions(+), 79 deletions(-)
|
|
|
|
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
|
|
index 0741db7b..f7ef6ad1 100644
|
|
--- a/hw/intc/armv7m_nvic.c
|
|
+++ b/hw/intc/armv7m_nvic.c
|
|
@@ -1227,13 +1227,13 @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
|
|
case 0xd4c: /* AFR0. */
|
|
return cpu->id_afr0;
|
|
case 0xd50: /* MMFR0. */
|
|
- return cpu->id_mmfr0;
|
|
+ return cpu->isar.id_mmfr0;
|
|
case 0xd54: /* MMFR1. */
|
|
- return cpu->id_mmfr1;
|
|
+ return cpu->isar.id_mmfr1;
|
|
case 0xd58: /* MMFR2. */
|
|
- return cpu->id_mmfr2;
|
|
+ return cpu->isar.id_mmfr2;
|
|
case 0xd5c: /* MMFR3. */
|
|
- return cpu->id_mmfr3;
|
|
+ return cpu->isar.id_mmfr3;
|
|
case 0xd60: /* ISAR0. */
|
|
return cpu->isar.id_isar0;
|
|
case 0xd64: /* ISAR1. */
|
|
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
|
|
index 119bd275..c3728e3d 100644
|
|
--- a/target/arm/cpu.c
|
|
+++ b/target/arm/cpu.c
|
|
@@ -1764,9 +1764,9 @@ static void arm1136_r2_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x1;
|
|
cpu->isar.id_dfr0 = 0x2;
|
|
cpu->id_afr0 = 0x3;
|
|
- cpu->id_mmfr0 = 0x01130003;
|
|
- cpu->id_mmfr1 = 0x10030302;
|
|
- cpu->id_mmfr2 = 0x01222110;
|
|
+ cpu->isar.id_mmfr0 = 0x01130003;
|
|
+ cpu->isar.id_mmfr1 = 0x10030302;
|
|
+ cpu->isar.id_mmfr2 = 0x01222110;
|
|
cpu->isar.id_isar0 = 0x00140011;
|
|
cpu->isar.id_isar1 = 0x12002111;
|
|
cpu->isar.id_isar2 = 0x11231111;
|
|
@@ -1796,9 +1796,9 @@ static void arm1136_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x1;
|
|
cpu->isar.id_dfr0 = 0x2;
|
|
cpu->id_afr0 = 0x3;
|
|
- cpu->id_mmfr0 = 0x01130003;
|
|
- cpu->id_mmfr1 = 0x10030302;
|
|
- cpu->id_mmfr2 = 0x01222110;
|
|
+ cpu->isar.id_mmfr0 = 0x01130003;
|
|
+ cpu->isar.id_mmfr1 = 0x10030302;
|
|
+ cpu->isar.id_mmfr2 = 0x01222110;
|
|
cpu->isar.id_isar0 = 0x00140011;
|
|
cpu->isar.id_isar1 = 0x12002111;
|
|
cpu->isar.id_isar2 = 0x11231111;
|
|
@@ -1829,9 +1829,9 @@ static void arm1176_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x11;
|
|
cpu->isar.id_dfr0 = 0x33;
|
|
cpu->id_afr0 = 0;
|
|
- cpu->id_mmfr0 = 0x01130003;
|
|
- cpu->id_mmfr1 = 0x10030302;
|
|
- cpu->id_mmfr2 = 0x01222100;
|
|
+ cpu->isar.id_mmfr0 = 0x01130003;
|
|
+ cpu->isar.id_mmfr1 = 0x10030302;
|
|
+ cpu->isar.id_mmfr2 = 0x01222100;
|
|
cpu->isar.id_isar0 = 0x0140011;
|
|
cpu->isar.id_isar1 = 0x12002111;
|
|
cpu->isar.id_isar2 = 0x11231121;
|
|
@@ -1859,9 +1859,9 @@ static void arm11mpcore_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x1;
|
|
cpu->isar.id_dfr0 = 0;
|
|
cpu->id_afr0 = 0x2;
|
|
- cpu->id_mmfr0 = 0x01100103;
|
|
- cpu->id_mmfr1 = 0x10020302;
|
|
- cpu->id_mmfr2 = 0x01222000;
|
|
+ cpu->isar.id_mmfr0 = 0x01100103;
|
|
+ cpu->isar.id_mmfr1 = 0x10020302;
|
|
+ cpu->isar.id_mmfr2 = 0x01222000;
|
|
cpu->isar.id_isar0 = 0x00100011;
|
|
cpu->isar.id_isar1 = 0x12002111;
|
|
cpu->isar.id_isar2 = 0x11221011;
|
|
@@ -1891,10 +1891,10 @@ static void cortex_m3_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00000200;
|
|
cpu->isar.id_dfr0 = 0x00100000;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x00000030;
|
|
- cpu->id_mmfr1 = 0x00000000;
|
|
- cpu->id_mmfr2 = 0x00000000;
|
|
- cpu->id_mmfr3 = 0x00000000;
|
|
+ cpu->isar.id_mmfr0 = 0x00000030;
|
|
+ cpu->isar.id_mmfr1 = 0x00000000;
|
|
+ cpu->isar.id_mmfr2 = 0x00000000;
|
|
+ cpu->isar.id_mmfr3 = 0x00000000;
|
|
cpu->isar.id_isar0 = 0x01141110;
|
|
cpu->isar.id_isar1 = 0x02111000;
|
|
cpu->isar.id_isar2 = 0x21112231;
|
|
@@ -1922,10 +1922,10 @@ static void cortex_m4_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00000200;
|
|
cpu->isar.id_dfr0 = 0x00100000;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x00000030;
|
|
- cpu->id_mmfr1 = 0x00000000;
|
|
- cpu->id_mmfr2 = 0x00000000;
|
|
- cpu->id_mmfr3 = 0x00000000;
|
|
+ cpu->isar.id_mmfr0 = 0x00000030;
|
|
+ cpu->isar.id_mmfr1 = 0x00000000;
|
|
+ cpu->isar.id_mmfr2 = 0x00000000;
|
|
+ cpu->isar.id_mmfr3 = 0x00000000;
|
|
cpu->isar.id_isar0 = 0x01141110;
|
|
cpu->isar.id_isar1 = 0x02111000;
|
|
cpu->isar.id_isar2 = 0x21112231;
|
|
@@ -1955,10 +1955,10 @@ static void cortex_m33_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00000210;
|
|
cpu->isar.id_dfr0 = 0x00200000;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x00101F40;
|
|
- cpu->id_mmfr1 = 0x00000000;
|
|
- cpu->id_mmfr2 = 0x01000000;
|
|
- cpu->id_mmfr3 = 0x00000000;
|
|
+ cpu->isar.id_mmfr0 = 0x00101F40;
|
|
+ cpu->isar.id_mmfr1 = 0x00000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01000000;
|
|
+ cpu->isar.id_mmfr3 = 0x00000000;
|
|
cpu->isar.id_isar0 = 0x01101110;
|
|
cpu->isar.id_isar1 = 0x02212000;
|
|
cpu->isar.id_isar2 = 0x20232232;
|
|
@@ -2006,10 +2006,10 @@ static void cortex_r5_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x001;
|
|
cpu->isar.id_dfr0 = 0x010400;
|
|
cpu->id_afr0 = 0x0;
|
|
- cpu->id_mmfr0 = 0x0210030;
|
|
- cpu->id_mmfr1 = 0x00000000;
|
|
- cpu->id_mmfr2 = 0x01200000;
|
|
- cpu->id_mmfr3 = 0x0211;
|
|
+ cpu->isar.id_mmfr0 = 0x0210030;
|
|
+ cpu->isar.id_mmfr1 = 0x00000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01200000;
|
|
+ cpu->isar.id_mmfr3 = 0x0211;
|
|
cpu->isar.id_isar0 = 0x02101111;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232141;
|
|
@@ -2061,10 +2061,10 @@ static void cortex_a8_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x11;
|
|
cpu->isar.id_dfr0 = 0x400;
|
|
cpu->id_afr0 = 0;
|
|
- cpu->id_mmfr0 = 0x31100003;
|
|
- cpu->id_mmfr1 = 0x20000000;
|
|
- cpu->id_mmfr2 = 0x01202000;
|
|
- cpu->id_mmfr3 = 0x11;
|
|
+ cpu->isar.id_mmfr0 = 0x31100003;
|
|
+ cpu->isar.id_mmfr1 = 0x20000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01202000;
|
|
+ cpu->isar.id_mmfr3 = 0x11;
|
|
cpu->isar.id_isar0 = 0x00101111;
|
|
cpu->isar.id_isar1 = 0x12112111;
|
|
cpu->isar.id_isar2 = 0x21232031;
|
|
@@ -2134,10 +2134,10 @@ static void cortex_a9_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x11;
|
|
cpu->isar.id_dfr0 = 0x000;
|
|
cpu->id_afr0 = 0;
|
|
- cpu->id_mmfr0 = 0x00100103;
|
|
- cpu->id_mmfr1 = 0x20000000;
|
|
- cpu->id_mmfr2 = 0x01230000;
|
|
- cpu->id_mmfr3 = 0x00002111;
|
|
+ cpu->isar.id_mmfr0 = 0x00100103;
|
|
+ cpu->isar.id_mmfr1 = 0x20000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01230000;
|
|
+ cpu->isar.id_mmfr3 = 0x00002111;
|
|
cpu->isar.id_isar0 = 0x00101111;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232041;
|
|
@@ -2199,10 +2199,10 @@ static void cortex_a7_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00011011;
|
|
cpu->isar.id_dfr0 = 0x02010555;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x10101105;
|
|
- cpu->id_mmfr1 = 0x40000000;
|
|
- cpu->id_mmfr2 = 0x01240000;
|
|
- cpu->id_mmfr3 = 0x02102211;
|
|
+ cpu->isar.id_mmfr0 = 0x10101105;
|
|
+ cpu->isar.id_mmfr1 = 0x40000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01240000;
|
|
+ cpu->isar.id_mmfr3 = 0x02102211;
|
|
/* a7_mpcore_r0p5_trm, page 4-4 gives 0x01101110; but
|
|
* table 4-41 gives 0x02101110, which includes the arm div insns.
|
|
*/
|
|
@@ -2245,10 +2245,10 @@ static void cortex_a15_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00011011;
|
|
cpu->isar.id_dfr0 = 0x02010555;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x10201105;
|
|
- cpu->id_mmfr1 = 0x20000000;
|
|
- cpu->id_mmfr2 = 0x01240000;
|
|
- cpu->id_mmfr3 = 0x02102211;
|
|
+ cpu->isar.id_mmfr0 = 0x10201105;
|
|
+ cpu->isar.id_mmfr1 = 0x20000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01240000;
|
|
+ cpu->isar.id_mmfr3 = 0x02102211;
|
|
cpu->isar.id_isar0 = 0x02101110;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232041;
|
|
@@ -2484,13 +2484,13 @@ static void arm_max_initfn(Object *obj)
|
|
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
|
|
cpu->isar.mvfr2 = t;
|
|
|
|
- t = cpu->id_mmfr3;
|
|
+ t = cpu->isar.id_mmfr3;
|
|
t = FIELD_DP32(t, ID_MMFR3, PAN, 2); /* ATS1E1 */
|
|
- cpu->id_mmfr3 = t;
|
|
+ cpu->isar.id_mmfr3 = t;
|
|
|
|
- t = cpu->id_mmfr4;
|
|
+ t = cpu->isar.id_mmfr4;
|
|
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
|
|
- cpu->id_mmfr4 = t;
|
|
+ cpu->isar.id_mmfr4 = t;
|
|
}
|
|
#endif
|
|
}
|
|
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
|
|
index 3040aa40..a78c30c3 100644
|
|
--- a/target/arm/cpu.h
|
|
+++ b/target/arm/cpu.h
|
|
@@ -857,6 +857,11 @@ struct ARMCPU {
|
|
uint32_t id_isar4;
|
|
uint32_t id_isar5;
|
|
uint32_t id_isar6;
|
|
+ uint32_t id_mmfr0;
|
|
+ uint32_t id_mmfr1;
|
|
+ uint32_t id_mmfr2;
|
|
+ uint32_t id_mmfr3;
|
|
+ uint32_t id_mmfr4;
|
|
uint32_t mvfr0;
|
|
uint32_t mvfr1;
|
|
uint32_t mvfr2;
|
|
@@ -882,11 +887,6 @@ struct ARMCPU {
|
|
uint64_t pmceid0;
|
|
uint64_t pmceid1;
|
|
uint32_t id_afr0;
|
|
- uint32_t id_mmfr0;
|
|
- uint32_t id_mmfr1;
|
|
- uint32_t id_mmfr2;
|
|
- uint32_t id_mmfr3;
|
|
- uint32_t id_mmfr4;
|
|
uint64_t id_aa64afr0;
|
|
uint64_t id_aa64afr1;
|
|
uint32_t clidr;
|
|
@@ -3490,12 +3490,12 @@ static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
|
|
|
|
static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
|
|
{
|
|
- return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) != 0;
|
|
+ return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) != 0;
|
|
}
|
|
|
|
static inline bool isar_feature_aa32_ats1e1(const ARMISARegisters *id)
|
|
{
|
|
- return FIELD_EX64(id->mvfr0, ID_MMFR3, PAN) >= 2;
|
|
+ return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) >= 2;
|
|
}
|
|
|
|
static inline bool isar_feature_aa32_pmu_8_1(const ARMISARegisters *id)
|
|
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
|
|
index a0d07fd7..d450b8c8 100644
|
|
--- a/target/arm/cpu64.c
|
|
+++ b/target/arm/cpu64.c
|
|
@@ -125,10 +125,10 @@ static void aarch64_a57_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00011011;
|
|
cpu->isar.id_dfr0 = 0x03010066;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x10101105;
|
|
- cpu->id_mmfr1 = 0x40000000;
|
|
- cpu->id_mmfr2 = 0x01260000;
|
|
- cpu->id_mmfr3 = 0x02102211;
|
|
+ cpu->isar.id_mmfr0 = 0x10101105;
|
|
+ cpu->isar.id_mmfr1 = 0x40000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01260000;
|
|
+ cpu->isar.id_mmfr3 = 0x02102211;
|
|
cpu->isar.id_isar0 = 0x02101110;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232042;
|
|
@@ -179,10 +179,10 @@ static void aarch64_a53_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00011011;
|
|
cpu->isar.id_dfr0 = 0x03010066;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x10101105;
|
|
- cpu->id_mmfr1 = 0x40000000;
|
|
- cpu->id_mmfr2 = 0x01260000;
|
|
- cpu->id_mmfr3 = 0x02102211;
|
|
+ cpu->isar.id_mmfr0 = 0x10101105;
|
|
+ cpu->isar.id_mmfr1 = 0x40000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01260000;
|
|
+ cpu->isar.id_mmfr3 = 0x02102211;
|
|
cpu->isar.id_isar0 = 0x02101110;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232042;
|
|
@@ -233,10 +233,10 @@ static void aarch64_a72_initfn(Object *obj)
|
|
cpu->id_pfr1 = 0x00011011;
|
|
cpu->isar.id_dfr0 = 0x03010066;
|
|
cpu->id_afr0 = 0x00000000;
|
|
- cpu->id_mmfr0 = 0x10201105;
|
|
- cpu->id_mmfr1 = 0x40000000;
|
|
- cpu->id_mmfr2 = 0x01260000;
|
|
- cpu->id_mmfr3 = 0x02102211;
|
|
+ cpu->isar.id_mmfr0 = 0x10201105;
|
|
+ cpu->isar.id_mmfr1 = 0x40000000;
|
|
+ cpu->isar.id_mmfr2 = 0x01260000;
|
|
+ cpu->isar.id_mmfr3 = 0x02102211;
|
|
cpu->isar.id_isar0 = 0x02101110;
|
|
cpu->isar.id_isar1 = 0x13112111;
|
|
cpu->isar.id_isar2 = 0x21232042;
|
|
@@ -383,9 +383,9 @@ static void aarch64_max_initfn(Object *obj)
|
|
u = FIELD_DP32(u, ID_ISAR6, SPECRES, 1);
|
|
cpu->isar.id_isar6 = u;
|
|
|
|
- u = cpu->id_mmfr3;
|
|
+ u = cpu->isar.id_mmfr3;
|
|
u = FIELD_DP32(u, ID_MMFR3, PAN, 2); /* ATS1E1 */
|
|
- cpu->id_mmfr3 = u;
|
|
+ cpu->isar.id_mmfr3 = u;
|
|
|
|
/*
|
|
* FIXME: We do not yet support ARMv8.2-fp16 for AArch32 yet,
|
|
diff --git a/target/arm/helper.c b/target/arm/helper.c
|
|
index 60ff7c0f..49cd7a7e 100644
|
|
--- a/target/arm/helper.c
|
|
+++ b/target/arm/helper.c
|
|
@@ -5906,19 +5906,19 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|
{ .name = "ID_MMFR0", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 4,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
- .resetvalue = cpu->id_mmfr0 },
|
|
+ .resetvalue = cpu->isar.id_mmfr0 },
|
|
{ .name = "ID_MMFR1", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 5,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
- .resetvalue = cpu->id_mmfr1 },
|
|
+ .resetvalue = cpu->isar.id_mmfr1 },
|
|
{ .name = "ID_MMFR2", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 6,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
- .resetvalue = cpu->id_mmfr2 },
|
|
+ .resetvalue = cpu->isar.id_mmfr2 },
|
|
{ .name = "ID_MMFR3", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 7,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
- .resetvalue = cpu->id_mmfr3 },
|
|
+ .resetvalue = cpu->isar.id_mmfr3 },
|
|
{ .name = "ID_ISAR0", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 0,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
@@ -5946,7 +5946,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|
{ .name = "ID_MMFR4", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 6,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
- .resetvalue = cpu->id_mmfr4 },
|
|
+ .resetvalue = cpu->isar.id_mmfr4 },
|
|
{ .name = "ID_ISAR6", .state = ARM_CP_STATE_BOTH,
|
|
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 2, .opc2 = 7,
|
|
.access = PL1_R, .type = ARM_CP_CONST,
|
|
@@ -6426,7 +6426,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|
define_arm_cp_regs(cpu, vmsa_pmsa_cp_reginfo);
|
|
define_arm_cp_regs(cpu, vmsa_cp_reginfo);
|
|
/* TTCBR2 is introduced with ARMv8.2-A32HPD. */
|
|
- if (FIELD_EX32(cpu->id_mmfr4, ID_MMFR4, HPDS) != 0) {
|
|
+ if (FIELD_EX32(cpu->isar.id_mmfr4, ID_MMFR4, HPDS) != 0) {
|
|
define_one_arm_cp_reg(cpu, &ttbcr2_reginfo);
|
|
}
|
|
}
|
|
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
|
|
index ee158830..2247148e 100644
|
|
--- a/target/arm/kvm32.c
|
|
+++ b/target/arm/kvm32.c
|
|
@@ -104,6 +104,23 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
|
|
* Fortunately there is not yet anything in there that affects migration.
|
|
*/
|
|
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0,
|
|
+ ARM_CP15_REG32(0, 0, 1, 4));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr1,
|
|
+ ARM_CP15_REG32(0, 0, 1, 5));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr2,
|
|
+ ARM_CP15_REG32(0, 0, 1, 6));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr3,
|
|
+ ARM_CP15_REG32(0, 0, 1, 7));
|
|
+ if (read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr4,
|
|
+ ARM_CP15_REG32(0, 0, 2, 6))) {
|
|
+ /*
|
|
+ * Older kernels don't support reading ID_MMFR4 (a new in v8
|
|
+ * register); assume it's zero.
|
|
+ */
|
|
+ ahcf->isar.id_mmfr4 = 0;
|
|
+ }
|
|
+
|
|
kvm_arm_destroy_scratch_host_vcpu(fdarray);
|
|
|
|
if (err < 0) {
|
|
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
|
|
index b794108a..276d1466 100644
|
|
--- a/target/arm/kvm64.c
|
|
+++ b/target/arm/kvm64.c
|
|
@@ -551,6 +551,14 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
|
|
* than skipping the reads and leaving 0, as we must avoid
|
|
* considering the values in every case.
|
|
*/
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0,
|
|
+ ARM64_SYS_REG(3, 0, 0, 1, 4));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr1,
|
|
+ ARM64_SYS_REG(3, 0, 0, 1, 5));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr2,
|
|
+ ARM64_SYS_REG(3, 0, 0, 1, 6));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr3,
|
|
+ ARM64_SYS_REG(3, 0, 0, 1, 7));
|
|
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar0,
|
|
ARM64_SYS_REG(3, 0, 0, 2, 0));
|
|
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar1,
|
|
@@ -563,6 +571,8 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
|
|
ARM64_SYS_REG(3, 0, 0, 2, 4));
|
|
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar5,
|
|
ARM64_SYS_REG(3, 0, 0, 2, 5));
|
|
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr4,
|
|
+ ARM64_SYS_REG(3, 0, 0, 2, 6));
|
|
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar6,
|
|
ARM64_SYS_REG(3, 0, 0, 2, 7));
|
|
|
|
--
|
|
2.25.1
|
|
|