mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
arm/kvm: add support for MTE
Extend the 'mte' property for the virt machine to cover KVM as
well. For KVM, we don't allocate tag memory, but instead enable
the capability.
If MTE has been enabled, we need to disable migration, as we do not
yet have a way to migrate the tags as well. Therefore, MTE will stay
off with KVM unless requested explicitly.
[gankulkarni: This patch is rework of commit b320e21c48
which broke TCG since it made the TCG -cpu max
report the presence of MTE to the guest even if the board hadn't
enabled MTE by wiring up the tag RAM. This meant that if the guest
then tried to use MTE QEMU would segfault accessing the
non-existent tag RAM.]
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Gustavo Romero <gustavo.romero@linaro.org>
Signed-off-by: Ganapatrao Kulkarni <gankulkarni@os.amperecomputing.com>
Message-id: 20241008114302.4855-1-gankulkarni@os.amperecomputing.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
fdf250e5a3
commit
918d0de072
5 changed files with 134 additions and 35 deletions
|
@ -2213,7 +2213,7 @@ static void machvirt_init(MachineState *machine)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
if (vms->mte && (kvm_enabled() || hvf_enabled())) {
|
||||
if (vms->mte && hvf_enabled()) {
|
||||
error_report("mach-virt: %s does not support providing "
|
||||
"MTE to the guest CPU",
|
||||
current_accel_name());
|
||||
|
@ -2283,39 +2283,51 @@ static void machvirt_init(MachineState *machine)
|
|||
}
|
||||
|
||||
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");
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
kvm_arm_enable_mte(cpuobj, &error_abort);
|
||||
} else {
|
||||
error_report("MTE requested, but not supported ");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue