|
@@ -63,6 +63,7 @@ static void aarch64_a35_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -231,6 +232,7 @@ static void aarch64_a55_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -299,6 +301,7 @@ static void aarch64_a72_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -354,6 +357,7 @@ static void aarch64_a76_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -423,6 +427,7 @@ static void aarch64_a64fx_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL3);
|
|
@@ -592,6 +597,7 @@ static void aarch64_neoverse_n1_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -663,6 +669,7 @@ static void aarch64_neoverse_v1_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -885,6 +892,7 @@ static void aarch64_a710_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -982,6 +990,7 @@ static void aarch64_neoverse_n2_initfn(Object *obj)
|
|
|
set_feature(&cpu->env, ARM_FEATURE_V8);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_NEON);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
|
|
|
+ set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
|
|
|
set_feature(&cpu->env, ARM_FEATURE_EL2);
|
|
@@ -1077,6 +1086,15 @@ void aarch64_max_tcg_initfn(Object *obj)
|
|
|
uint64_t t;
|
|
|
uint32_t u;
|
|
|
|
|
|
+ /*
|
|
|
+ * Unset ARM_FEATURE_BACKCOMPAT_CNTFRQ, which we would otherwise default
|
|
|
+ * to because we started with aarch64_a57_initfn(). A 'max' CPU might
|
|
|
+ * be a v8.6-or-later one, in which case the cntfrq must be 1GHz; and
|
|
|
+ * because it is our "may change" CPU type we are OK with it not being
|
|
|
+ * backwards-compatible with how it worked in old QEMU.
|
|
|
+ */
|
|
|
+ unset_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
|
|
|
+
|
|
|
/*
|
|
|
* Reset MIDR so the guest doesn't mistake our 'max' CPU type for a real
|
|
|
* one and try to apply errata workarounds or use impdef features we
|