++ more migration experts! On Mon, 8 Feb 2021 at 11:20, Haibo Xu <[email protected]> wrote: > > Enable the virt machine feature "mte" to work with > KVM guest. This feature is still hiden from the user > in this patch, and will be available in a later patch. > > Signed-off-by: Haibo Xu <[email protected]> > --- > hw/arm/virt.c | 22 +++++++++++----------- > target/arm/cpu.c | 2 +- > target/arm/kvm.c | 9 +++++++++ > target/arm/kvm64.c | 7 +++++++ > 4 files changed, 28 insertions(+), 12 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 399da73454..623d5e9397 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -1974,18 +1974,18 @@ static void machvirt_init(MachineState *machine) > } > > if (vms->mte) { > + /* > + * 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); > + } > + > /* 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 (!tag_sysmem && !kvm_enabled()) { > tag_sysmem = g_new(MemoryRegion, 1); > memory_region_init(tag_sysmem, OBJECT(machine), > "tag-memory", UINT64_MAX / 32); > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > index 40142ac141..50f3223944 100644 > --- a/target/arm/cpu.c > +++ b/target/arm/cpu.c > @@ -1831,7 +1831,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error > **errp) > cpu->secure_memory); > } > > - if (cpu->tag_memory != NULL) { > + if (cpu->tag_memory != NULL && !kvm_enabled()) { > cpu_address_space_init(cs, ARMASIdx_TagNS, "cpu-tag-memory", > cpu->tag_memory); > if (has_secure) { > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index ffe186de8d..33630b2b70 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -32,6 +32,7 @@ > #include "hw/boards.h" > #include "hw/irq.h" > #include "qemu/log.h" > +#include "hw/arm/virt.h" > > const KVMCapabilityInfo kvm_arch_required_capabilities[] = { > KVM_CAP_LAST_INFO > @@ -272,6 +273,14 @@ int kvm_arch_init(MachineState *ms, KVMState *s) > } > } > > + if (kvm_check_extension(s, KVM_CAP_ARM_MTE) && > + object_dynamic_cast(OBJECT(ms), TYPE_VIRT_MACHINE) && > + VIRT_MACHINE(ms)->mte) { > + if (kvm_vm_enable_cap(s, KVM_CAP_ARM_MTE, 0)) { > + error_report("Failed to enable KVM_CAP_ARM_MTE cap"); > + } > + } > + > return ret; > } > > diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c > index 3c37fc4fb6..23f34034db 100644 > --- a/target/arm/kvm64.c > +++ b/target/arm/kvm64.c > @@ -500,6 +500,7 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures > *ahcf) > */ > int fdarray[3]; > bool sve_supported; > + bool mte_supported; > uint64_t features = 0; > uint64_t t; > int err; > @@ -646,6 +647,7 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures > *ahcf) > } > > sve_supported = ioctl(fdarray[0], KVM_CHECK_EXTENSION, KVM_CAP_ARM_SVE) > > 0; > + mte_supported = ioctl(fdarray[0], KVM_CHECK_EXTENSION, KVM_CAP_ARM_MTE) > > 0; > > kvm_arm_destroy_scratch_host_vcpu(fdarray); > > @@ -659,6 +661,11 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures > *ahcf) > t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1); > ahcf->isar.id_aa64pfr0 = t; > } > + if (mte_supported) { > + t = ahcf->isar.id_aa64pfr1; > + t = FIELD_DP64(t, ID_AA64PFR1, MTE, 2); > + ahcf->isar.id_aa64pfr1 = t; > + } > > /* > * We can assume any KVM supporting CPU is at least a v8 > -- > 2.17.1 >
