virQEMUCapsAccel kvm;
virQEMUCapsAccel hvf;
virQEMUCapsAccel tcg;
+ virQEMUCapsAccel mshv;
};
static virClass *virQEMUCapsClass;
virQEMUCapsHaveAccel(virQEMUCaps *qemuCaps)
{
return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) ||
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF);
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF) ||
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV);
}
return "kvm";
else if (type == VIR_DOMAIN_VIRT_HVF)
return "hvf";
+ else if (type == VIR_DOMAIN_VIRT_HYPERV)
+ return "mshv";
return "tcg";
}
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;
}
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;
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))
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;
virQEMUCapsAccelClear(&qemuCaps->kvm);
virQEMUCapsAccelClear(&qemuCaps->hvf);
virQEMUCapsAccelClear(&qemuCaps->tcg);
+ virQEMUCapsAccelClear(&qemuCaps->mshv);
}
void
virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
return true;
+ if (virtType == VIR_DOMAIN_VIRT_HYPERV &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV))
+ return true;
+
return false;
}
return !!qemuCaps->kvm.nmachineTypes ||
!!qemuCaps->hvf.nmachineTypes ||
+ !!qemuCaps->mshv.nmachineTypes ||
!!qemuCaps->tcg.nmachineTypes;
}
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;
}
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;
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)
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++) {
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;
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)) {
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_KVM);
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HVF);
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_QEMU);
+ virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HYPERV);
}