From b7621b7e96d01c9040fefdc31017ab38c2bc826a Mon Sep 17 00:00:00 2001 From: Pavel Fedin Date: Wed, 30 Sep 2015 14:04:10 +0300 Subject: [PATCH] qemu: Add support for gic-version machine option Support for GICv3 has been recently introduced in qemu using gic-version option for the 'virt' machine. The option can actually take values of '2', '3' and 'host', however, since in libvirt this is a numeric parameter, we limit it only to 2 and 3. Value of 2 is not added to the command line in order to keep backward compatibility with older qemu versions. Signed-off-by: Pavel Fedin --- src/qemu/qemu_command.c | 44 +++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index bb1835c2f5..2f0f7d4693 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7702,19 +7702,6 @@ qemuBuildCpuArgStr(virQEMUDriverPtr driver, have_cpu = true; } - if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON) { - if (def->gic_version && def->gic_version != 2) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("gic version '%u' is not supported"), - def->gic_version); - goto cleanup; - } - - /* There's no command line argument currently to turn on/off GIC. It's - * done automatically by qemu-system-aarch64. But if this changes, lets - * put the code here. */ - } - if (virBufferCheckError(&buf) < 0) goto cleanup; @@ -7931,6 +7918,37 @@ qemuBuildMachineArgStr(virCommandPtr cmd, return -1; } + if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON) { + if (def->gic_version) { + if ((def->os.arch != VIR_ARCH_ARMV7L && + def->os.arch != VIR_ARCH_AARCH64) || + (STRNEQ(def->os.machine, "virt") && + !STRPREFIX(def->os.machine, "virt-"))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("gic-version option is available " + "only for ARM virt machine")); + virBufferFreeAndReset(&buf); + return -1; + } + + /* 2 is the default, so we don't put it as option for + * backwards compatibility + */ + if (def->gic_version != 2) { + if (!virQEMUCapsGet(qemuCaps, + QEMU_CAPS_MACH_VIRT_GIC_VERSION)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("gic-version option is not available " + "with this QEMU binary")); + virBufferFreeAndReset(&buf); + return -1; + } + + virBufferAsprintf(&buf, ",gic-version=%d", def->gic_version); + } + } + } + virCommandAddArgBuffer(cmd, &buf); } -- GitLab