From: Praveen K Paladugu <prapal@linux.microsoft.com>
Qemu with mshv capabilities can launch VIR_DOMAIN_VIRT_HYPERV domains.
Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
---
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
On Fri, Nov 07, 2025 at 02:13:53PM -0600, Praveen K Paladugu wrote: >From: Praveen K Paladugu <prapal@linux.microsoft.com> > >Qemu with mshv capabilities can launch VIR_DOMAIN_VIRT_HYPERV domains. > >Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com> Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
© 2016 - 2025 Red Hat, Inc.