aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/arm/virt.c69
-rw-r--r--target/arm/cpu.c9
-rw-r--r--target/arm/cpu.h4
-rw-r--r--target/arm/kvm.c35
-rw-r--r--target/arm/kvm64.c5
-rw-r--r--target/arm/kvm_arm.h19
6 files changed, 34 insertions, 107 deletions
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 06b514b..b99ae18 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2146,7 +2146,7 @@ static void machvirt_init(MachineState *machine)
exit(1);
}
- if (vms->mte && hvf_enabled()) {
+ if (vms->mte && (kvm_enabled() || hvf_enabled())) {
error_report("mach-virt: %s does not support providing "
"MTE to the guest CPU",
current_accel_name());
@@ -2216,48 +2216,39 @@ static void machvirt_init(MachineState *machine)
}
if (vms->mte) {
- if (tcg_enabled()) {
- /* Create the memory region only once, but link to all cpus. */
- if (!tag_sysmem) {
- /*
- * The property exists only if MemTag is supported.
- * If it is, we must allocate the ram to back that up.
- */
- if (!object_property_find(cpuobj, "tag-memory")) {
- error_report("MTE requested, but not supported "
- "by the guest CPU");
- exit(1);
- }
-
- tag_sysmem = g_new(MemoryRegion, 1);
- memory_region_init(tag_sysmem, OBJECT(machine),
- "tag-memory", UINT64_MAX / 32);
-
- if (vms->secure) {
- secure_tag_sysmem = g_new(MemoryRegion, 1);
- memory_region_init(secure_tag_sysmem, OBJECT(machine),
- "secure-tag-memory",
- UINT64_MAX / 32);
-
- /* As with ram, secure-tag takes precedence over tag. */
- memory_region_add_subregion_overlap(secure_tag_sysmem,
- 0, tag_sysmem, -1);
- }
+ /* Create the memory region only once, but link to all cpus. */
+ if (!tag_sysmem) {
+ /*
+ * The property exists only if MemTag is supported.
+ * If it is, we must allocate the ram to back that up.
+ */
+ if (!object_property_find(cpuobj, "tag-memory")) {
+ error_report("MTE requested, but not supported "
+ "by the guest CPU");
+ exit(1);
}
- object_property_set_link(cpuobj, "tag-memory",
- OBJECT(tag_sysmem), &error_abort);
+ tag_sysmem = g_new(MemoryRegion, 1);
+ memory_region_init(tag_sysmem, OBJECT(machine),
+ "tag-memory", UINT64_MAX / 32);
+
if (vms->secure) {
- object_property_set_link(cpuobj, "secure-tag-memory",
- OBJECT(secure_tag_sysmem),
- &error_abort);
- }
- } else if (kvm_enabled()) {
- if (!kvm_arm_mte_supported()) {
- error_report("MTE requested, but not supported by KVM");
- exit(1);
+ secure_tag_sysmem = g_new(MemoryRegion, 1);
+ memory_region_init(secure_tag_sysmem, OBJECT(machine),
+ "secure-tag-memory", UINT64_MAX / 32);
+
+ /* As with ram, secure-tag takes precedence over tag. */
+ memory_region_add_subregion_overlap(secure_tag_sysmem, 0,
+ tag_sysmem, -1);
}
- kvm_arm_enable_mte(cpuobj, &error_abort);
+ }
+
+ object_property_set_link(cpuobj, "tag-memory", OBJECT(tag_sysmem),
+ &error_abort);
+ if (vms->secure) {
+ object_property_set_link(cpuobj, "secure-tag-memory",
+ OBJECT(secure_tag_sysmem),
+ &error_abort);
}
}
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index f6a88e5..5182ed0 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1480,7 +1480,6 @@ void arm_cpu_post_init(Object *obj)
qdev_prop_allow_set_link_before_realize,
OBJ_PROP_LINK_STRONG);
}
- cpu->has_mte = true;
}
#endif
}
@@ -1617,7 +1616,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
}
if (cpu->tag_memory) {
error_setg(errp,
- "Cannot enable %s when guest CPUs has tag memory enabled",
+ "Cannot enable %s when guest CPUs has MTE enabled",
current_accel_name());
return;
}
@@ -1997,10 +1996,10 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
}
#ifndef CONFIG_USER_ONLY
- if (!cpu->has_mte && cpu_isar_feature(aa64_mte, cpu)) {
+ if (cpu->tag_memory == NULL && cpu_isar_feature(aa64_mte, cpu)) {
/*
- * Disable the MTE feature bits if we do not have the feature
- * setup by the machine.
+ * Disable the MTE feature bits if we do not have tag-memory
+ * provided by the machine.
*/
cpu->isar.id_aa64pfr1 =
FIELD_DP64(cpu->isar.id_aa64pfr1, ID_AA64PFR1, MTE, 0);
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index c3463e3..d469a26 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -935,9 +935,6 @@ struct ArchCPU {
*/
uint32_t psci_conduit;
- /* CPU has Memory Tag Extension */
- bool has_mte;
-
/* For v8M, initial value of the Secure VTOR */
uint32_t init_svtor;
/* For v8M, initial value of the Non-secure VTOR */
@@ -1056,7 +1053,6 @@ struct ArchCPU {
bool prop_pauth;
bool prop_pauth_impdef;
bool prop_lpa2;
- OnOffAuto prop_mte;
/* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */
uint32_t dcz_blocksize;
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 9553488..84da493 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -31,7 +31,6 @@
#include "hw/boards.h"
#include "hw/irq.h"
#include "qemu/log.h"
-#include "migration/blocker.h"
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
KVM_CAP_LAST_INFO
@@ -1065,37 +1064,3 @@ bool kvm_arch_cpu_check_are_resettable(void)
void kvm_arch_accel_class_init(ObjectClass *oc)
{
}
-
-void kvm_arm_enable_mte(Object *cpuobj, Error **errp)
-{
- static bool tried_to_enable;
- static bool succeeded_to_enable;
- Error *mte_migration_blocker = NULL;
- int ret;
-
- if (!tried_to_enable) {
- /*
- * MTE on KVM is enabled on a per-VM basis (and retrying doesn't make
- * sense), and we only want a single migration blocker as well.
- */
- tried_to_enable = true;
-
- ret = kvm_vm_enable_cap(kvm_state, KVM_CAP_ARM_MTE, 0);
- if (ret) {
- error_setg_errno(errp, -ret, "Failed to enable KVM_CAP_ARM_MTE");
- return;
- }
-
- /* TODO: add proper migration support with MTE enabled */
- error_setg(&mte_migration_blocker,
- "Live migration disabled due to MTE enabled");
- if (migrate_add_blocker(mte_migration_blocker, errp)) {
- error_free(mte_migration_blocker);
- return;
- }
- succeeded_to_enable = true;
- }
- if (succeeded_to_enable) {
- object_property_set_bool(cpuobj, "has_mte", true, NULL);
- }
-}
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index 1893f38..810db33 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -756,11 +756,6 @@ bool kvm_arm_steal_time_supported(void)
return kvm_check_extension(kvm_state, KVM_CAP_STEAL_TIME);
}
-bool kvm_arm_mte_supported(void)
-{
- return kvm_check_extension(kvm_state, KVM_CAP_ARM_MTE);
-}
-
QEMU_BUILD_BUG_ON(KVM_ARM64_SVE_VQ_MIN != 1);
uint32_t kvm_arm_sve_get_vls(CPUState *cs)
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
index 2083547..330fbe5 100644
--- a/target/arm/kvm_arm.h
+++ b/target/arm/kvm_arm.h
@@ -314,13 +314,6 @@ bool kvm_arm_pmu_supported(void);
bool kvm_arm_sve_supported(void);
/**
- * kvm_arm_mte_supported:
- *
- * Returns: true if KVM can enable MTE, and false otherwise.
- */
-bool kvm_arm_mte_supported(void);
-
-/**
* kvm_arm_get_max_vm_ipa_size:
* @ms: Machine state handle
* @fixed_ipa: True when the IPA limit is fixed at 40. This is the case
@@ -384,8 +377,6 @@ void kvm_arm_pvtime_init(CPUState *cs, uint64_t ipa);
int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
-void kvm_arm_enable_mte(Object *cpuobj, Error **errp);
-
#else
/*
@@ -412,11 +403,6 @@ static inline bool kvm_arm_steal_time_supported(void)
return false;
}
-static inline bool kvm_arm_mte_supported(void)
-{
- return false;
-}
-
/*
* These functions should never actually be called without KVM support.
*/
@@ -465,11 +451,6 @@ static inline uint32_t kvm_arm_sve_get_vls(CPUState *cs)
g_assert_not_reached();
}
-static inline void kvm_arm_enable_mte(Object *cpuobj, Error **errp)
-{
- g_assert_not_reached();
-}
-
#endif
static inline const char *gic_class_name(void)