|
@@ -2213,7 +2213,7 @@ static void machvirt_init(MachineState *machine)
|
|
exit(1);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
- if (vms->mte && (kvm_enabled() || hvf_enabled())) {
|
|
|
|
|
|
+ if (vms->mte && hvf_enabled()) {
|
|
error_report("mach-virt: %s does not support providing "
|
|
error_report("mach-virt: %s does not support providing "
|
|
"MTE to the guest CPU",
|
|
"MTE to the guest CPU",
|
|
current_accel_name());
|
|
current_accel_name());
|
|
@@ -2283,39 +2283,51 @@ static void machvirt_init(MachineState *machine)
|
|
}
|
|
}
|
|
|
|
|
|
if (vms->mte) {
|
|
if (vms->mte) {
|
|
- /* 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);
|
|
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- tag_sysmem = g_new(MemoryRegion, 1);
|
|
|
|
- memory_region_init(tag_sysmem, OBJECT(machine),
|
|
|
|
- "tag-memory", UINT64_MAX / 32);
|
|
|
|
-
|
|
|
|
|
|
+ object_property_set_link(cpuobj, "tag-memory",
|
|
|
|
+ OBJECT(tag_sysmem), &error_abort);
|
|
if (vms->secure) {
|
|
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);
|
|
|
|
|
|
+ object_property_set_link(cpuobj, "secure-tag-memory",
|
|
|
|
+ OBJECT(secure_tag_sysmem),
|
|
|
|
+ &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);
|
|
|
|
|
|
+ } else if (kvm_enabled()) {
|
|
|
|
+ if (!kvm_arm_mte_supported()) {
|
|
|
|
+ error_report("MTE requested, but not supported by KVM");
|
|
|
|
+ exit(1);
|
|
|
|
+ }
|
|
|
|
+ kvm_arm_enable_mte(cpuobj, &error_abort);
|
|
|
|
+ } else {
|
|
|
|
+ error_report("MTE requested, but not supported ");
|
|
|
|
+ exit(1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|