#include "qemu/osdep.h"
#include "qemu/units.h"
+#include "system/hw_accel.h"
#include "system/kvm.h"
+#include "system/qtest.h"
+#include "system/tcg.h"
#include "target/arm/internals.h"
#include "target/arm/cpregs.h"
FIELD_DP32_IDREG(isar, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
}
+
+/*
+ * -cpu max: a CPU with as many features enabled as our emulation supports.
+ * The version of '-cpu max' for qemu-system-aarch64 is defined in cpu64.c;
+ * this only needs to handle 32 bits, and need not care about KVM.
+ */
+static void cpu_max_initfn(Object *obj)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+
+#ifdef TARGET_AARCH64
+ const bool aarch64_enabled = true;
+#else
+ const bool aarch64_enabled = false;
+#endif /* !TARGET_AARCH64 */
+
+ if (hwaccel_enabled()) {
+ assert(aarch64_enabled);
+ /*
+ * When hardware acceleration enabled, '-cpu max' is
+ * identical to '-cpu host'
+ */
+ aarch64_host_initfn(obj);
+ return;
+ }
+
+ if (tcg_enabled() || qtest_enabled()) {
+ aarch64_aa32_a57_init(obj, !aarch64_enabled);
+ }
+
+ if (!aarch64_enabled) {
+ aa32_max_features(cpu);
+#ifdef CONFIG_USER_ONLY
+ /*
+ * Break with true ARMv8 and add back old-style VFP short-vector
+ * support. Only do this for user-mode, where -cpu max is the default,
+ * so that older v6 and v7 programs are more likely to work without
+ * adjustment.
+ */
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
+#endif
+ } else if (tcg_enabled()) {
+ assert(aarch64_enabled);
+ /*
+ * '-cpu max' for TCG: we currently do this as
+ * "A57 with extra things"
+ */
+ aarch64_max_tcg_initfn(obj);
+ }
+}
+
+static const ARMCPUInfo arm_max_cpu = {
+ .name = "max",
+ .initfn = cpu_max_initfn,
+};
+
+static void arm_max_cpu_register_types(void)
+{
+ arm_cpu_register(&arm_max_cpu);
+}
+
+type_init(arm_max_cpu_register_types)
}
#endif
-static void aarch64_host_initfn(Object *obj)
+void aarch64_host_initfn(Object *obj)
{
ARMCPU *cpu = ARM_CPU(obj);
}
}
-static void aarch64_max_initfn(Object *obj)
-{
- if (hwaccel_enabled()) {
- /* When hardware acceleration enabled, '-cpu max' is identical to '-cpu host' */
- aarch64_host_initfn(obj);
- return;
- }
-
- if (tcg_enabled() || qtest_enabled()) {
- aarch64_aa32_a57_init(obj, false);
- }
-
- /* '-cpu max' for TCG: we currently do this as "A57 with extra things" */
- if (tcg_enabled()) {
- aarch64_max_tcg_initfn(obj);
- }
-}
-
static const ARMCPUInfo aarch64_cpus[] = {
{ .name = "cortex-a57", .initfn = aarch64_a57_initfn },
{ .name = "cortex-a53", .initfn = aarch64_a53_initfn },
- { .name = "max", .initfn = aarch64_max_initfn },
#if defined(CONFIG_KVM) || defined(CONFIG_HVF) || defined(CONFIG_WHPX)
{ .name = "host", .initfn = aarch64_host_initfn },
#endif
void aarch64_add_sve_properties(Object *obj);
void aarch64_add_sme_properties(Object *obj);
void aarch64_aa32_a57_init(Object *obj, bool aa32_only);
+void aarch64_host_initfn(Object *obj);
/* Return true if the gdbstub is presenting an AArch64 CPU */
static inline bool arm_gdbstub_is_aarch64(ARMCPU *cpu)
cpu->reset_sctlr = 0x00000070;
}
-#ifndef TARGET_AARCH64
-/*
- * -cpu max: a CPU with as many features enabled as our emulation supports.
- * The version of '-cpu max' for qemu-system-aarch64 is defined in cpu64.c;
- * this only needs to handle 32 bits, and need not care about KVM.
- */
-static void arm_max_initfn(Object *obj)
-{
- ARMCPU *cpu = ARM_CPU(obj);
-
- /* Cortex-A57 advertising none of the aarch64 features */
- aarch64_aa32_a57_init(obj, true);
-
- aa32_max_features(cpu);
-
-#ifdef CONFIG_USER_ONLY
- /*
- * Break with true ARMv8 and add back old-style VFP short-vector support.
- * Only do this for user-mode, where -cpu max is the default, so that
- * older v6 and v7 programs are more likely to work without adjustment.
- */
- cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
-#endif
-}
-#endif /* !TARGET_AARCH64 */
-
static const ARMCPUInfo arm_tcg_cpus[] = {
{ .name = "arm926", .initfn = arm926_initfn },
{ .name = "arm946", .initfn = arm946_initfn },
{ .name = "ti925t", .initfn = ti925t_initfn },
{ .name = "sa1100", .initfn = sa1100_initfn },
{ .name = "sa1110", .initfn = sa1110_initfn },
-#ifndef TARGET_AARCH64
- { .name = "max", .initfn = arm_max_initfn },
-#endif
};
static void arm_tcg_cpu_register_types(void)
{
g_assert_not_reached();
}
+
+void aarch64_host_initfn(Object *obj)
+{
+ g_assert_not_reached();
+}
+
+void aarch64_max_tcg_initfn(Object *obj)
+{
+ g_assert_not_reached();
+}