
Add the ipiv switch in the "-machine" to allow the guest to more flexibly choose whether to enable ipiv. Signed-off-by: Jinqian Yang <yangjinqian1@huawei.com> --- hw/arm/virt.c | 20 ++++++++++++++++++++ include/hw/arm/virt.h | 1 + target/arm/kvm.c | 9 +++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index d8890e319f..576ee0afd0 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -3054,6 +3054,20 @@ static void virt_set_its(Object *obj, bool value, Error **errp) vms->its = value; } +static bool virt_get_ipiv(Object *obj, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + return vms->ipiv; +} + +static void virt_set_ipiv(Object *obj, bool value, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + vms->ipiv = value; +} + static void virt_get_dtb_randomness(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -4158,6 +4172,12 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) object_class_property_set_description(oc, "x-target-impl-cpus", "Describe target cpu impl in the format midr1:revidr1-midr2:revidr2" "Maximum 4 midr:revidr pair is supported"); + + object_class_property_add_bool(oc, "ipiv", + virt_get_ipiv, + virt_set_ipiv); + object_class_property_set_description(oc, "ipiv", + "Set on/off to enable/disable IPIV"); } static char *virt_get_kvm_type(Object *obj, Error **errp G_GNUC_UNUSED) diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index fee7c27e0c..a54b0057fb 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -225,6 +225,7 @@ struct VirtMachineState { bool cpu_hotplug_enabled; bool ras; bool mte; + bool ipiv; OnOffAuto dtb_randomness; bool pmu; int smmu_accel_count; diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 96b0784b90..d79b667e8c 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -338,10 +338,15 @@ int kvm_arch_get_default_type(MachineState *ms) return fixed_ipa ? 0 : size; } -static void kvm_update_ipiv_cap(KVMState *s) +static void kvm_update_ipiv_cap(MachineState *ms, KVMState *s) { + VirtMachineState *vms = VIRT_MACHINE(ms); int ret; + if (!vms->ipiv) { + return; + } + if (!kvm_check_extension(s, KVM_CAP_ARM_HISI_IPIV)) { return; } @@ -428,7 +433,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } kvm_arm_init_debug(s); - kvm_update_ipiv_cap(s); + kvm_update_ipiv_cap(ms, s); ret = kvm_arm_rme_init(ms); if (ret) { -- 2.33.0
participants (1)
-
Jinqian Yang