From: Praveen K Paladugu <[email protected]> Qemu with mshv capabilities can launch VIR_DOMAIN_VIRT_HYPERV domains.
Signed-off-by: Praveen K Paladugu <[email protected]> --- src/qemu/qemu_capabilities.c | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c479a82473..3c22ef80a6 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -840,6 +840,7 @@ struct _virQEMUCaps { virQEMUCapsAccel kvm; virQEMUCapsAccel hvf; virQEMUCapsAccel tcg; + virQEMUCapsAccel mshv; }; static virClass *virQEMUCapsClass; @@ -938,7 +939,8 @@ bool virQEMUCapsHaveAccel(virQEMUCaps *qemuCaps) { return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) || - virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF); + virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF) || + virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV); } @@ -949,6 +951,8 @@ virQEMUCapsAccelStr(virDomainVirtType type) return "kvm"; else if (type == VIR_DOMAIN_VIRT_HVF) return "hvf"; + else if (type == VIR_DOMAIN_VIRT_HYPERV) + return "mshv"; return "tcg"; } @@ -962,6 +966,8 @@ virQEMUCapsGetAccel(virQEMUCaps *qemuCaps, return &qemuCaps->kvm; else if (type == VIR_DOMAIN_VIRT_HVF) return &qemuCaps->hvf; + else if (type == VIR_DOMAIN_VIRT_HYPERV) + return &qemuCaps->mshv; return &qemuCaps->tcg; } @@ -1069,6 +1075,8 @@ virQEMUCapsGetMachineTypesCaps(virQEMUCaps *qemuCaps, accel = &qemuCaps->kvm; else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) accel = &qemuCaps->hvf; + else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + accel = &qemuCaps->mshv; else accel = &qemuCaps->tcg; @@ -1177,6 +1185,10 @@ virQEMUCapsInitGuestFromBinary(virCaps *caps, virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HVF, NULL, NULL, 0, NULL); } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) { + virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV, + NULL, NULL, 0, NULL); + } if (ARCH_IS_X86(guestarch) || guestarch == VIR_ARCH_AARCH64 || ARCH_IS_LOONGARCH(guestarch)) @@ -2065,6 +2077,7 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps) virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm); virQEMUCapsAccelCopy(&ret->hvf, &qemuCaps->hvf); virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg); + virQEMUCapsAccelCopy(&ret->mshv, &qemuCaps->mshv); ret->gicCapabilities = g_new0(virGICCapability, qemuCaps->ngicCapabilities); ret->ngicCapabilities = qemuCaps->ngicCapabilities; @@ -2124,6 +2137,7 @@ void virQEMUCapsDispose(void *obj) virQEMUCapsAccelClear(&qemuCaps->kvm); virQEMUCapsAccelClear(&qemuCaps->hvf); virQEMUCapsAccelClear(&qemuCaps->tcg); + virQEMUCapsAccelClear(&qemuCaps->mshv); } void @@ -2346,6 +2360,10 @@ virQEMUCapsIsVirtTypeSupported(virQEMUCaps *qemuCaps, virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) return true; + if (virtType == VIR_DOMAIN_VIRT_HYPERV && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + return true; + return false; } @@ -2918,6 +2936,7 @@ virQEMUCapsHasMachines(virQEMUCaps *qemuCaps) return !!qemuCaps->kvm.nmachineTypes || !!qemuCaps->hvf.nmachineTypes || + !!qemuCaps->mshv.nmachineTypes || !!qemuCaps->tcg.nmachineTypes; } @@ -3483,6 +3502,8 @@ virQEMUCapsProbeAccels(virQEMUCaps *qemuCaps, virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF); else if (STREQ(enabled, "kvm")) virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); + else if (STREQ(enabled, "mshv")) + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MSHV); return 0; } @@ -4897,6 +4918,10 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_HVF) < 0) { return -1; } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV) && + virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_HYPERV) < 0) { + return -1; + } if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0) return -1; @@ -4916,6 +4941,8 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HVF); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HYPERV); virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0) @@ -5252,6 +5279,8 @@ virQEMUCapsFormatCache(virQEMUCaps *qemuCaps) virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_HVF); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_HYPERV); virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU); for (i = 0; i < qemuCaps->ngicCapabilities; i++) { @@ -5759,6 +5788,9 @@ virQEMUCapsGetVirtType(virQEMUCaps *qemuCaps) if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) return VIR_DOMAIN_VIRT_HVF; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + return VIR_DOMAIN_VIRT_HYPERV; + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG)) return VIR_DOMAIN_VIRT_QEMU; @@ -5995,6 +6027,9 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HVF); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HYPERV); + virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); if (virQEMUCapsHaveAccel(qemuCaps)) { @@ -7203,4 +7238,5 @@ virQEMUCapsStripMachineAliases(virQEMUCaps *qemuCaps) virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_KVM); virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HVF); virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_QEMU); + virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HYPERV); } -- 2.51.0
