From: Michal Privoznik Date: Mon, 29 Sep 2025 08:20:20 +0000 (+0200) Subject: qemu_command: Move hyperv cmd line generation into a function X-Git-Tag: v11.9.0-rc1~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8b316fac497dc2a121788fef9d91b22bfd4e343c;p=thirdparty%2Flibvirt.git qemu_command: Move hyperv cmd line generation into a function Signed-off-by: Michal Privoznik Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f7af92fe35..542022b889 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6449,6 +6449,89 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver, return 0; } + +static int +qemuBuildCpuHypervCommandLine(virBuffer *buf, + const virDomainDef *def) +{ + size_t i; + + if (def->features[VIR_DOMAIN_FEATURE_HYPERV] == VIR_DOMAIN_HYPERV_MODE_NONE) + return 0; + + switch ((virDomainHyperVMode) def->features[VIR_DOMAIN_FEATURE_HYPERV]) { + case VIR_DOMAIN_HYPERV_MODE_CUSTOM: + break; + + case VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH: + virBufferAsprintf(buf, ",hv-%s=on", "passthrough"); + break; + + case VIR_DOMAIN_HYPERV_MODE_NONE: + case VIR_DOMAIN_HYPERV_MODE_LAST: + default: + virReportEnumRangeError(virDomainHyperVMode, + def->features[VIR_DOMAIN_FEATURE_HYPERV]); + return -1; + } + + for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) { + switch ((virDomainHyperv) i) { + case VIR_DOMAIN_HYPERV_RELAXED: + case VIR_DOMAIN_HYPERV_VAPIC: + case VIR_DOMAIN_HYPERV_VPINDEX: + case VIR_DOMAIN_HYPERV_RUNTIME: + case VIR_DOMAIN_HYPERV_SYNIC: + case VIR_DOMAIN_HYPERV_STIMER: + case VIR_DOMAIN_HYPERV_RESET: + case VIR_DOMAIN_HYPERV_FREQUENCIES: + case VIR_DOMAIN_HYPERV_REENLIGHTENMENT: + case VIR_DOMAIN_HYPERV_TLBFLUSH: + case VIR_DOMAIN_HYPERV_IPI: + case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: + case VIR_DOMAIN_HYPERV_EMSR_BITMAP: + case VIR_DOMAIN_HYPERV_XMM_INPUT: + if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) { + const char *name = virDomainHypervTypeToString(i); + g_autofree char *full_name = g_strdup_printf("hv-%s", name); + const char *qemu_name = virQEMUCapsCPUFeatureToQEMU(def->os.arch, + full_name); + virBufferAsprintf(buf, ",%s=on", qemu_name); + } + if ((i == VIR_DOMAIN_HYPERV_STIMER) && + (def->hyperv_stimer_direct == VIR_TRISTATE_SWITCH_ON)) + virBufferAsprintf(buf, ",%s=on", VIR_CPU_x86_HV_STIMER_DIRECT); + if (i == VIR_DOMAIN_HYPERV_TLBFLUSH) { + if (def->hyperv_tlbflush_direct == VIR_TRISTATE_SWITCH_ON) + virBufferAsprintf(buf, ",%s=on", VIR_CPU_x86_HV_TLBFLUSH_DIRECT); + if (def->hyperv_tlbflush_extended == VIR_TRISTATE_SWITCH_ON) + virBufferAsprintf(buf, ",%s=on", VIR_CPU_x86_HV_TLBFLUSH_EXT); + } + break; + + case VIR_DOMAIN_HYPERV_SPINLOCKS: + if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) + virBufferAsprintf(buf, ",%s=0x%x", + VIR_CPU_x86_HV_SPINLOCKS, + def->hyperv_spinlocks); + break; + + case VIR_DOMAIN_HYPERV_VENDOR_ID: + if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) + virBufferAsprintf(buf, ",hv-vendor-id=%s", + def->hyperv_vendor_id); + break; + + case VIR_DOMAIN_HYPERV_LAST: + break; + } + } + + return 0; +} + + static int qemuBuildCpuCommandLine(virCommand *cmd, virQEMUDriver *driver, @@ -6545,76 +6628,8 @@ qemuBuildCpuCommandLine(virCommand *cmd, VIR_TRISTATE_SWITCH_ON ? "on" : "off"); } - if (def->features[VIR_DOMAIN_FEATURE_HYPERV] != VIR_DOMAIN_HYPERV_MODE_NONE) { - switch ((virDomainHyperVMode) def->features[VIR_DOMAIN_FEATURE_HYPERV]) { - case VIR_DOMAIN_HYPERV_MODE_CUSTOM: - break; - - case VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH: - virBufferAsprintf(&buf, ",hv-%s=on", "passthrough"); - break; - - case VIR_DOMAIN_HYPERV_MODE_NONE: - case VIR_DOMAIN_HYPERV_MODE_LAST: - default: - virReportEnumRangeError(virDomainHyperVMode, - def->features[VIR_DOMAIN_FEATURE_HYPERV]); - return -1; - } - - for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) { - switch ((virDomainHyperv) i) { - case VIR_DOMAIN_HYPERV_RELAXED: - case VIR_DOMAIN_HYPERV_VAPIC: - case VIR_DOMAIN_HYPERV_VPINDEX: - case VIR_DOMAIN_HYPERV_RUNTIME: - case VIR_DOMAIN_HYPERV_SYNIC: - case VIR_DOMAIN_HYPERV_STIMER: - case VIR_DOMAIN_HYPERV_RESET: - case VIR_DOMAIN_HYPERV_FREQUENCIES: - case VIR_DOMAIN_HYPERV_REENLIGHTENMENT: - case VIR_DOMAIN_HYPERV_TLBFLUSH: - case VIR_DOMAIN_HYPERV_IPI: - case VIR_DOMAIN_HYPERV_EVMCS: - case VIR_DOMAIN_HYPERV_AVIC: - case VIR_DOMAIN_HYPERV_EMSR_BITMAP: - case VIR_DOMAIN_HYPERV_XMM_INPUT: - if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) { - const char *name = virDomainHypervTypeToString(i); - g_autofree char *full_name = g_strdup_printf("hv-%s", name); - const char *qemu_name = virQEMUCapsCPUFeatureToQEMU(def->os.arch, - full_name); - virBufferAsprintf(&buf, ",%s=on", qemu_name); - } - if ((i == VIR_DOMAIN_HYPERV_STIMER) && - (def->hyperv_stimer_direct == VIR_TRISTATE_SWITCH_ON)) - virBufferAsprintf(&buf, ",%s=on", VIR_CPU_x86_HV_STIMER_DIRECT); - if (i == VIR_DOMAIN_HYPERV_TLBFLUSH) { - if (def->hyperv_tlbflush_direct == VIR_TRISTATE_SWITCH_ON) - virBufferAsprintf(&buf, ",%s=on", VIR_CPU_x86_HV_TLBFLUSH_DIRECT); - if (def->hyperv_tlbflush_extended == VIR_TRISTATE_SWITCH_ON) - virBufferAsprintf(&buf, ",%s=on", VIR_CPU_x86_HV_TLBFLUSH_EXT); - } - break; - - case VIR_DOMAIN_HYPERV_SPINLOCKS: - if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) - virBufferAsprintf(&buf, ",%s=0x%x", - VIR_CPU_x86_HV_SPINLOCKS, - def->hyperv_spinlocks); - break; - - case VIR_DOMAIN_HYPERV_VENDOR_ID: - if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) - virBufferAsprintf(&buf, ",hv-vendor-id=%s", - def->hyperv_vendor_id); - break; - - case VIR_DOMAIN_HYPERV_LAST: - break; - } - } - } + if (qemuBuildCpuHypervCommandLine(&buf, def) < 0) + return -1; for (i = 0; i < def->npanics; i++) { if (def->panics[i]->model == VIR_DOMAIN_PANIC_MODEL_HYPERV) {