From 1822d030c32d9857020ee8385b0a8808a29a472f Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Wed, 8 Oct 2025 09:56:50 +0200 Subject: [PATCH] qemu_validate: Reflect dependencies of hv-synic MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Per QEMU documentation (docs/system/i386/hyperv.rst): ``hv-synic`` Enables Hyper-V Synthetic interrupt controller Requires: ``hv-vpindex`` Reflect this dependency when validating domain definition. Signed-off-by: Michal Privoznik Reviewed-by: Ján Tomko --- src/qemu/qemu_validate.c | 42 ++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 8dac5c76d0..279f72f50a 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -88,6 +88,38 @@ qemuValidateDomainDefPSeriesFeature(const virDomainDef *def, } +#define CHECK_HV_FEAT(feat, requires) \ + if (def->hyperv_features[feat] == VIR_TRISTATE_SWITCH_ON && \ + def->hyperv_features[requires] != VIR_TRISTATE_SWITCH_ON) { \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("'%1$s' hyperv feature requires '%2$s' feature"), \ + virDomainHypervTypeToString(feat), \ + virDomainHypervTypeToString(requires)); \ + return -1; \ + } + +static int +qemuValidateDomainDefHypervFeatures(const virDomainDef *def) +{ + if (def->features[VIR_DOMAIN_FEATURE_HYPERV] == VIR_DOMAIN_HYPERV_MODE_NONE) + return 0; + + if (!ARCH_IS_X86(def->os.arch) && !qemuDomainIsARMVirt(def)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Hyperv features are not supported for architecture '%1$s' or machine type '%2$s'"), + virArchToString(def->os.arch), + def->os.machine); + return -1; + } + + CHECK_HV_FEAT(VIR_DOMAIN_HYPERV_SYNIC, VIR_DOMAIN_HYPERV_VPINDEX); + + return 0; +} + +#undef CHECK_HV_FEAT + + static int qemuValidateDomainDefFeatures(const virDomainDef *def, virQEMUCaps *qemuCaps) @@ -187,14 +219,8 @@ qemuValidateDomainDefFeatures(const virDomainDef *def, break; case VIR_DOMAIN_FEATURE_HYPERV: - if (def->features[i] != VIR_DOMAIN_HYPERV_MODE_NONE && - !ARCH_IS_X86(def->os.arch) && !qemuDomainIsARMVirt(def)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Hyperv features are not supported for architecture '%1$s' or machine type '%2$s'"), - virArchToString(def->os.arch), - def->os.machine); - return -1; - } + if (qemuValidateDomainDefHypervFeatures(def) < 0) + return -1; break; case VIR_DOMAIN_FEATURE_PMU: -- 2.47.3