[libvirt] [PATCH v2 0/2] Introduce GIC for aarch64

diff to v1: - John's review worked in (hopefully) Michal Privoznik (2): Introduce GIC feature qemu: Implement GIC docs/formatdomain.html.in | 10 ++++++ docs/schemas/domaincommon.rng | 11 ++++++- src/conf/domain_conf.c | 37 +++++++++++++++++++++- src/conf/domain_conf.h | 2 ++ src/qemu/qemu_command.c | 13 ++++++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.args | 6 ++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml | 26 +++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 8 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml -- 2.3.6

Some platforms, like aarch64, don't have APIC but GIC. So there's no reason to have <apic/> feature turned on. However, we are still missing <gic/> feature. This commit introduces the feature to XML parser and formatter, adds documentation and updates RNG schema. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- docs/formatdomain.html.in | 10 ++++++++++ docs/schemas/domaincommon.rng | 11 ++++++++++- src/conf/domain_conf.c | 37 ++++++++++++++++++++++++++++++++++++- src/conf/domain_conf.h | 2 ++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index d484152..fe7f9c5 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1439,6 +1439,7 @@ <hidden state='on'/> </kvm> <pvspinlock/> + <gic version='2'/> </features> ...</pre> @@ -1545,6 +1546,15 @@ the emulation of VMWare IO port, for vmmouse etc. <span class="since">Since 1.2.16</span> </dd> + <dt><code>gic</code></dt> + <dd>Enable for architectures using a General Interrupt + Controller instead of APIC in order to handle interrupts. + For example, the 'aarch64' architecture uses + <code>gic</code> instead of <code>apic</code>. The optional + attribute <code>version</code> specifies the GIC version; + however, it may not be supported by all hypervisors. <span + class="since">Since 1.2.16</span> + </dd> </dl> <h3><a name="elementsTime">Time keeping</a></h3> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 64d22ea..c151e92 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3965,7 +3965,7 @@ </element> </define> <!-- - A set of optional features: PAE, APIC, ACPI, + A set of optional features: PAE, APIC, ACPI, GIC, HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support --> <define name="features"> @@ -4035,6 +4035,15 @@ </optional> </element> </optional> + <optional> + <element name="gic"> + <optional> + <attribute name="version"> + <ref name="positiveInteger"/> + </attribute> + </optional> + </element> + </optional> </interleave> </element> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fe8b8ca..4cd36a1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -144,7 +144,8 @@ VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "pvspinlock", "capabilities", "pmu", - "vmport") + "vmport", + "gic") VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, VIR_DOMAIN_CAPABILITIES_POLICY_LAST, "default", @@ -14511,6 +14512,22 @@ virDomainDefParseXML(xmlDocPtr xml, ctxt->node = node; break; + case VIR_DOMAIN_FEATURE_GIC: + node = ctxt->node; + ctxt->node = nodes[i]; + if ((tmp = virXPathString("string(./@version)", ctxt))) { + if (virStrToLong_uip(tmp, NULL, 10, &def->gic_version) < 0 || + def->gic_version == 0) { + virReportError(VIR_ERR_XML_ERROR, + _("malformed gic version: %s"), tmp); + goto error; + } + VIR_FREE(tmp); + } + def->features[val] = VIR_TRISTATE_SWITCH_ON; + ctxt->node = node; + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; @@ -16593,6 +16610,14 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, return false; } + /* GIC version */ + if (src->gic_version != dst->gic_version) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Source GIC version '%u' does not match destination '%u'"), + src->gic_version, dst->gic_version); + return false; + } + /* hyperv */ if (src->features[VIR_DOMAIN_FEATURE_HYPERV] == VIR_TRISTATE_SWITCH_ON) { for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) { @@ -21232,6 +21257,16 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAddLit(buf, "</capabilities>\n"); break; + case VIR_DOMAIN_FEATURE_GIC: + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { + virBufferAddLit(buf, "<gic"); + if (def->gic_version) + virBufferAsprintf(buf, " version='%u'", + def->gic_version); + virBufferAddLit(buf, "/>\n"); + } + break; + /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d2e3534..af594a0 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1649,6 +1649,7 @@ typedef enum { VIR_DOMAIN_FEATURE_CAPABILITIES, VIR_DOMAIN_FEATURE_PMU, VIR_DOMAIN_FEATURE_VMPORT, + VIR_DOMAIN_FEATURE_GIC, VIR_DOMAIN_FEATURE_LAST } virDomainFeature; @@ -2179,6 +2180,7 @@ struct _virDomainDef { int hyperv_features[VIR_DOMAIN_HYPERV_LAST]; int kvm_features[VIR_DOMAIN_KVM_LAST]; unsigned int hyperv_spinlocks; + unsigned int gic_version; /* by default 2 */ /* These options are of type virTristateSwitch: ON = keep, OFF = drop */ int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST]; -- 2.3.6

The only version that's supported in QEMU is version 2, currently. Fortunately, it is enabled by aarch64 automatically, so there's nothing for us that needs to be put onto command line. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_command.c | 13 +++++++++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.args | 6 +++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml | 26 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 4 files changed, 47 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 952a10e..c32d8c6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7202,6 +7202,19 @@ 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; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args new file mode 100644 index 0000000..e61cd1e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args @@ -0,0 +1,6 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-aarch64 -S -M virt -no-kvm -cpu cortex-a53 -m 1024 -smp 1 \ +-nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -boot c \ +-kernel /aarch64.kernel -initrd /aarch64.initrd -append console=ttyAMA0 -usb \ +-net nic,macaddr=52:54:00:09:a4:37,vlan=0,model=virtio,name=net0 \ +-net user,vlan=0,name=hostnet0 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml new file mode 100644 index 0000000..08d3d71 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml @@ -0,0 +1,26 @@ +<domain type="qemu"> + <name>aarch64test</name> + <uuid>6ba410c5-1e5c-4d57-bee7-2228e7ffa32f</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <features> + <acpi/> + <gic version='2'/> + </features> + <cpu match='exact'> + <model>cortex-a53</model> + </cpu> + <os> + <type arch="aarch64" machine="virt">hvm</type> + <kernel>/aarch64.kernel</kernel> + <initrd>/aarch64.initrd</initrd> + <cmdline>console=ttyAMA0</cmdline> + </os> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <interface type='user'> + <mac address='52:54:00:09:a4:37'/> + </interface> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4678261..97c7fba 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1541,6 +1541,8 @@ mymain(void) DO_TEST("aarch64-cpu-model-host", QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_KVM); + DO_TEST("aarch64-gic", QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, + QEMU_CAPS_KVM); DO_TEST("kvm-pit-device", QEMU_CAPS_KVM_PIT_TICK_POLICY); DO_TEST("kvm-pit-delay", QEMU_CAPS_NO_KVM_PIT); -- 2.3.6

On 05/04/2015 08:09 AM, Michal Privoznik wrote:
diff to v1: - John's review worked in (hopefully)
Michal Privoznik (2): Introduce GIC feature qemu: Implement GIC
docs/formatdomain.html.in | 10 ++++++ docs/schemas/domaincommon.rng | 11 ++++++- src/conf/domain_conf.c | 37 +++++++++++++++++++++- src/conf/domain_conf.h | 2 ++ src/qemu/qemu_command.c | 13 ++++++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.args | 6 ++++ .../qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml | 26 +++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 8 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic.xml
As long as you remove the comment in domain_conf.h: + unsigned int gic_version; /* by default 2 */ ACK series John
participants (2)
-
John Ferlan
-
Michal Privoznik