[libvirt] [PATCH v5 0/3] qemu: -dtb option support

Since v1.1 QEMU provides -dtb option to support loading device tree binary images. These patches update qemu commands/capabilities for dtb and provide docs/tests. Olivia Yin (3): conf: support <dtb> tag in XML domain file qemu: add dtb option supprt selinux: deal with dtb file docs/formatdomain.html.in | 5 +++ docs/schemas/domaincommon.rng | 6 ++++ src/conf/domain_conf.c | 4 ++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 8 ++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 6 ++++ src/security/security_dac.c | 8 +++++ src/security/security_selinux.c | 8 +++++ src/security/virt-aa-helper.c | 4 ++ tests/qemuhelptest.c | 30 +++++++++++++------ tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml | 28 ++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 15 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml

--- docs/formatdomain.html.in | 5 +++++ docs/schemas/domaincommon.rng | 6 ++++++ src/conf/domain_conf.c | 4 ++++ src/conf/domain_conf.h | 1 + 4 files changed, 16 insertions(+), 0 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 35b47f2..b38a668 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -232,6 +232,7 @@ <kernel>/root/f8-i386-vmlinuz</kernel> <initrd>/root/f8-i386-initrd</initrd> <cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/</cmdline> + <dtb>/root/ppc.dtb</dtb> </os> ...</pre> @@ -253,6 +254,10 @@ the kernel (or installer) at boottime. This is often used to specify an alternate primary console (eg serial port), or the installation media source / kickstart file</dd> + <dt><code>dtb</code></dt> + <dd>The contents of this element specify the fully-qualified path + to the (optional) device tree binary (dtb) image in the host OS. + <span class="since">Since 1.0.4</span></dd> </dl> <h4><a name="eleemntsOSContainer">Container boot</a></h4> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index c40263c..687f026 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -367,6 +367,7 @@ <value>g3beige</value> <value>mac99</value> <value>prep</value> + <value>ppce500v2</value> </choice> </attribute> </optional> @@ -835,6 +836,11 @@ <text/> </element> </optional> + <optional> + <element name="dtb"> + <ref name="absFilePath"/> + </element> + </optional> </interleave> </define> <define name="osbootdev"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 95d2ff2..0981a5e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1849,6 +1849,7 @@ void virDomainDefFree(virDomainDefPtr def) VIR_FREE(def->os.kernel); VIR_FREE(def->os.initrd); VIR_FREE(def->os.cmdline); + VIR_FREE(def->os.dtb); VIR_FREE(def->os.root); VIR_FREE(def->os.loader); VIR_FREE(def->os.bootloader); @@ -10234,6 +10235,7 @@ virDomainDefParseXML(virCapsPtr caps, def->os.kernel = virXPathString("string(./os/kernel[1])", ctxt); def->os.initrd = virXPathString("string(./os/initrd[1])", ctxt); def->os.cmdline = virXPathString("string(./os/cmdline[1])", ctxt); + def->os.dtb = virXPathString("string(./os/dtb[1])", ctxt); def->os.root = virXPathString("string(./os/root[1])", ctxt); def->os.loader = virXPathString("string(./os/loader[1])", ctxt); } @@ -14856,6 +14858,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, def->os.initrd); virBufferEscapeString(buf, " <cmdline>%s</cmdline>\n", def->os.cmdline); + virBufferEscapeString(buf, " <dtb>%s</dtb>\n", + def->os.dtb); virBufferEscapeString(buf, " <root>%s</root>\n", def->os.root); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0fe43c5..1c0b238 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1550,6 +1550,7 @@ struct _virDomainOSDef { char *kernel; char *initrd; char *cmdline; + char *dtb; char *root; char *loader; char *bootloader; -- 1.6.4

On Thu, Mar 14, 2013 at 12:49:42PM +0800, Olivia Yin wrote:
--- docs/formatdomain.html.in | 5 +++++ docs/schemas/domaincommon.rng | 6 ++++++ src/conf/domain_conf.c | 4 ++++ src/conf/domain_conf.h | 1 + 4 files changed, 16 insertions(+), 0 deletions(-)
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

The "dtb" option sets the filename for the device tree. If without this option support, "-dtb file" will be converted into <qemu:commandline> in domain XML file. For example, '-dtb /media/ram/test.dtb' will be converted into <qemu:commandline> <qemu:arg value='-dtb'/> <qemu:arg value='/media/ram/test.dtb'/> </qemu:commandline> This is not very friendly. This patchset add special <dtb> tag like <kernel> and <initrd> which is easier for user to write domain XML file. <os> <type arch='ppc' machine='ppce500v2'>hvm</type> <kernel>/media/ram/uImage</kernel> <initrd>/media/ram/ramdisk</initrd> <dtb>/media/ram/test.dtb</dtb> <cmdline>root=/dev/ram rw console=ttyS0,115200</cmdline> </os> --- src/qemu/qemu_capabilities.c | 8 ++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 6 ++++ tests/qemuhelptest.c | 30 +++++++++++++------ tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml | 28 ++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 8 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 79cfdb3..636608a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -210,7 +210,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "rng-random", /* 130 */ "rng-egd", - "virtio-ccw" + "virtio-ccw", + "dtb", ); struct _virQEMUCaps { @@ -1173,8 +1174,10 @@ virQEMUCapsComputeCmdFlags(const char *help, if (version >= 12000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_ROMBAR); - if (version >= 11000) + if (version >= 11000) { virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); + } if (version >= 1002000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); @@ -2299,6 +2302,7 @@ virQEMUCapsInitQMPBasic(virQEMUCapsPtr qemuCaps) virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV_BRIDGE); virQEMUCapsSet(qemuCaps, QEMU_CAPS_SECCOMP_SANDBOX); virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5c5dc5a..9f88593 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -172,6 +172,7 @@ enum virQEMUCapsFlags { virtio rng */ QEMU_CAPS_OBJECT_RNG_EGD = 131, /* EGD protocol daemon for rng */ QEMU_CAPS_VIRTIO_CCW = 132, /* -device virtio-*-ccw */ + QEMU_CAPS_DTB = 133, /* -dtb file */ QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e7f2325..a95d41c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5984,6 +5984,8 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL); if (def->os.cmdline) virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB) && def->os.dtb) + virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); } else { virCommandAddArgList(cmd, "-bootloader", def->os.bootloader, NULL); } @@ -9161,6 +9163,10 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, WANT_VALUE(); if (!(def->os.cmdline = strdup(val))) goto no_memory; + } else if (STREQ(arg, "-dtb")) { + WANT_VALUE(); + if (!(def->os.dtb = strdup(val))) + goto no_memory; } else if (STREQ(arg, "-boot")) { const char *token = NULL; WANT_VALUE(); diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 720a188..460c5fd 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -339,7 +339,8 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-0.12.1.2-rhel60", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -397,7 +398,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -440,7 +442,8 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC); + QEMU_CAPS_VNC, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-0.13.0", 13000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -506,7 +509,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -571,7 +575,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -643,7 +648,8 @@ mymain(void) QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_VGA, - QEMU_CAPS_DEVICE_CIRRUS_VGA); + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DTB); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -723,7 +729,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-1.1.0", 1001000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -811,7 +818,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-1.2.0", 1002000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -910,7 +918,8 @@ mymain(void) QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); DO_TEST("qemu-kvm-1.2.0", 1002000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -1014,7 +1023,8 @@ mymain(void) QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DTB); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args new file mode 100644 index 0000000..a66ac51 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append 'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb -usb -net none -serial pty -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml new file mode 100644 index 0000000..3674621 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml @@ -0,0 +1,28 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>49545eb3-75e1-2d0a-acdd-f0294406c99e</uuid> + <memory unit='KiB'>262144</memory> + <currentMemory unit='KiB'>262144</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='ppc' machine='ppce500v2'>hvm</type> + <kernel>/media/ram/uImage</kernel> + <initrd>/media/ram/ramdisk</initrd> + <cmdline>root=/dev/ram rw console=ttyS0,115200</cmdline> + <dtb>/media/ram/test.dtb</dtb> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-ppc</emulator> + <serial type='pty'> + <target port='0'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + </console> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index a9a5557..8f6a50d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -901,6 +901,8 @@ mymain(void) DO_TEST("virtio-rng-egd", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_EGD); + DO_TEST("ppc-dtb", QEMU_CAPS_KVM, QEMU_CAPS_DTB); + virObjectUnref(driver.config); virObjectUnref(driver.caps); virObjectUnref(driver.xmlconf); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 4e13db9..db15ee6 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -92,6 +92,36 @@ error: return -1; } +static int testQemuAddPPCGuest(virCapsPtr caps) +{ + static const char *machine[] = { "g3beige", + "mac99", + "prep", + "ppce500v2" }; + virCapsGuestMachinePtr *machines = NULL; + virCapsGuestPtr guest; + + machines = virCapabilitiesAllocMachines(machine, 1); + if (!machines) + goto error; + + guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_PPC, + "/usr/bin/qemu-system-ppc", NULL, + 1, machines); + if (!guest) + goto error; + + if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL)) + goto error; + + return 0; + +error: + /* No way to free a guest? */ + virCapabilitiesFreeMachines(machines, 1); + return -1; +} + static int testQemuAddS390Guest(virCapsPtr caps) { static const char *s390_machines[] = { "s390-virtio", @@ -242,6 +272,9 @@ virCapsPtr testQemuCapsInit(void) { if (testQemuAddPPC64Guest(caps)) goto cleanup; + if (testQemuAddPPCGuest(caps)) + goto cleanup; + if (testQemuAddS390Guest(caps)) goto cleanup; -- 1.6.4

On Thu, Mar 14, 2013 at 12:49:43PM +0800, Olivia Yin wrote:
The "dtb" option sets the filename for the device tree. If without this option support, "-dtb file" will be converted into <qemu:commandline> in domain XML file. For example, '-dtb /media/ram/test.dtb' will be converted into <qemu:commandline> <qemu:arg value='-dtb'/> <qemu:arg value='/media/ram/test.dtb'/> </qemu:commandline>
This is not very friendly. This patchset add special <dtb> tag like <kernel> and <initrd> which is easier for user to write domain XML file. <os> <type arch='ppc' machine='ppce500v2'>hvm</type> <kernel>/media/ram/uImage</kernel> <initrd>/media/ram/ramdisk</initrd> <dtb>/media/ram/test.dtb</dtb> <cmdline>root=/dev/ram rw console=ttyS0,115200</cmdline> </os> --- src/qemu/qemu_capabilities.c | 8 ++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 6 ++++ tests/qemuhelptest.c | 30 +++++++++++++------ tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml | 28 ++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 8 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml
ACK
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 79cfdb3..636608a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -210,7 +210,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
"rng-random", /* 130 */ "rng-egd", - "virtio-ccw" + "virtio-ccw", + "dtb", );
struct _virQEMUCaps { @@ -1173,8 +1174,10 @@ virQEMUCapsComputeCmdFlags(const char *help, if (version >= 12000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_ROMBAR);
- if (version >= 11000) + if (version >= 11000) { virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); + }
Doesn't '-dtb' show up in the -help output ? If it does, then it is preferrable to check for that, instead of using a version number based check
@@ -2299,6 +2302,7 @@ virQEMUCapsInitQMPBasic(virQEMUCapsPtr qemuCaps) virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV_BRIDGE); virQEMUCapsSet(qemuCaps, QEMU_CAPS_SECCOMP_SANDBOX); virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB);
This bit is fine for QMP. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 03/19/2013 06:24 AM, Daniel P. Berrange wrote:
On Thu, Mar 14, 2013 at 12:49:43PM +0800, Olivia Yin wrote:
s/supprt/support/ in the subject
The "dtb" option sets the filename for the device tree. If without this option support, "-dtb file" will be converted into <qemu:commandline> in domain XML file. For example, '-dtb /media/ram/test.dtb' will be converted into <qemu:commandline> <qemu:arg value='-dtb'/> <qemu:arg value='/media/ram/test.dtb'/> </qemu:commandline>
ACK
I will push these soon.
- "virtio-ccw" + "virtio-ccw", + "dtb",
Oops - we let the previous person to touch this enum forget to use a trailing comma. Oh well, not your fault.
- if (version >= 11000) + if (version >= 11000) { virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); + }
Doesn't '-dtb' show up in the -help output ? If it does, then it is preferrable to check for that, instead of using a version number based check
It does; in fact, it showed up in 1.1 (and NOT in 0.11). Here's what I will squash in: diff --git i/src/qemu/qemu_capabilities.c w/src/qemu/qemu_capabilities.c index 48fd971..50f8084 100644 --- i/src/qemu/qemu_capabilities.c +++ w/src/qemu/qemu_capabilities.c @@ -1087,6 +1087,9 @@ virQEMUCapsComputeCmdFlags(const char *help, if (strstr(help, "dump-guest-core=on|off")) virQEMUCapsSet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE); + if (strstr(help, "-dtb")) + virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); + /* * Handling of -incoming arg with varying features * -incoming tcp (kvm >= 79, qemu >= 0.10.0) @@ -1174,10 +1177,8 @@ virQEMUCapsComputeCmdFlags(const char *help, if (version >= 12000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_ROMBAR); - if (version >= 11000) { + if (version >= 11000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST); - virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); - } if (version >= 1002000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); diff --git i/tests/qemuhelptest.c w/tests/qemuhelptest.c index 1cceffa..059fa86 100644 --- i/tests/qemuhelptest.c +++ w/tests/qemuhelptest.c @@ -339,8 +339,7 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC, - QEMU_CAPS_DTB); + QEMU_CAPS_VNC); DO_TEST("qemu-kvm-0.12.1.2-rhel60", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -398,8 +397,7 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET, - QEMU_CAPS_DTB); + QEMU_CAPS_DEVICE_USB_NET); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -442,8 +440,7 @@ mymain(void) QEMU_CAPS_NO_ACPI, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_CPU_HOST, - QEMU_CAPS_VNC, - QEMU_CAPS_DTB); + QEMU_CAPS_VNC); DO_TEST("qemu-kvm-0.13.0", 13000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -509,8 +506,7 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET, - QEMU_CAPS_DTB); + QEMU_CAPS_DEVICE_USB_NET); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -575,8 +571,7 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET, - QEMU_CAPS_DTB); + QEMU_CAPS_DEVICE_USB_NET); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -648,8 +643,7 @@ mymain(void) QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_VGA, - QEMU_CAPS_DEVICE_CIRRUS_VGA, - QEMU_CAPS_DTB); + QEMU_CAPS_DEVICE_CIRRUS_VGA); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -729,8 +723,7 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET, - QEMU_CAPS_DTB); + QEMU_CAPS_DEVICE_USB_NET); DO_TEST("qemu-1.1.0", 1001000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 03/13/2013 10:49 PM, Olivia Yin wrote:
The "dtb" option sets the filename for the device tree. If without this option support, "-dtb file" will be converted into <qemu:commandline> in domain XML file. For example, '-dtb /media/ram/test.dtb' will be converted into <qemu:commandline> <qemu:arg value='-dtb'/> <qemu:arg value='/media/ram/test.dtb'/> </qemu:commandline>
+++ b/src/qemu/qemu_command.c @@ -5984,6 +5984,8 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL); if (def->os.cmdline) virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB) && def->os.dtb) + virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL);
This silently ignores def->os.dtb if set but qemu is too old. Instead, we should error out on the unsupported combination.
+++ b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append 'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb -usb -net none -serial pty -parallel none
Sheesh, this line is long. Backslash-newline is your friend. In addition to what I'm squashing after Dan's comments, I'm adding this: diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c index 0b56726..8626b62 100644 --- i/src/qemu/qemu_command.c +++ w/src/qemu/qemu_command.c @@ -6152,8 +6152,15 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL); if (def->os.cmdline) virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB) && def->os.dtb) - virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); + if (def->os.dtb) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB)) { + virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("dtb is not supported with this QEMU binary")); + goto error; + } + } } else { virCommandAddArgList(cmd, "-bootloader", def->os.bootloader, NULL); } diff --git i/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args w/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args index a66ac51..93e8f9c 100644 --- i/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args +++ w/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args @@ -1 +1,6 @@ -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append 'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb -usb -net none -serial pty -parallel none +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-kernel /media/ram/uImage -initrd /media/ram/ramdisk \ +-append 'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb \ +-usb -net none -serial pty -parallel none -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Hi Eric, You're so kind to help squash. Thank you very much. Exactly there's one more thing need fix is that 'ppce500v2' should be changed as 'ppce500' to align with qemu-1.4.0. What should I do next step? Should I post a new revision of patchset? Best Regards, Olivia
-----Original Message----- From: Eric Blake [mailto:eblake@redhat.com] Sent: Wednesday, March 20, 2013 5:24 AM To: Yin Olivia-R63875 Cc: libvir-list@redhat.com Subject: Re: [libvirt] [PATCH v5 2/3] qemu: add dtb option supprt
On 03/13/2013 10:49 PM, Olivia Yin wrote:
The "dtb" option sets the filename for the device tree. If without this option support, "-dtb file" will be converted into <qemu:commandline> in domain XML file. For example, '-dtb /media/ram/test.dtb' will be converted into <qemu:commandline> <qemu:arg value='-dtb'/> <qemu:arg value='/media/ram/test.dtb'/> </qemu:commandline>
+++ b/src/qemu/qemu_command.c @@ -5984,6 +5984,8 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL); if (def->os.cmdline) virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB) && def->os.dtb) + virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL);
This silently ignores def->os.dtb if set but qemu is too old. Instead, we should error out on the unsupported combination.
+++ b/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test +/usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c +-kernel /media/ram/uImage -initrd /media/ram/ramdisk -append +'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb -usb +-net none -serial pty -parallel none
Sheesh, this line is long. Backslash-newline is your friend.
In addition to what I'm squashing after Dan's comments, I'm adding this:
diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c index 0b56726..8626b62 100644 --- i/src/qemu/qemu_command.c +++ w/src/qemu/qemu_command.c @@ -6152,8 +6152,15 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL); if (def->os.cmdline) virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL); - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB) && def->os.dtb) - virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); + if (def->os.dtb) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DTB)) { + virCommandAddArgList(cmd, "-dtb", def->os.dtb, NULL); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("dtb is not supported with this QEMU binary")); + goto error; + } + } } else { virCommandAddArgList(cmd, "-bootloader", def->os.bootloader, NULL); } diff --git i/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args w/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args index a66ac51..93e8f9c 100644 --- i/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args +++ w/tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args @@ -1 +1,6 @@ -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu- system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -kernel /media/ram/uImage -initrd /media/ram/ramdisk -append 'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb -usb -net none -serial pty - parallel none +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu-system-ppc -S -M ppce500v2 -m 256 -smp 1 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-kernel /media/ram/uImage -initrd /media/ram/ramdisk \ -append +'root=/dev/ram rw console=ttyS0,115200' -dtb /media/ram/test.dtb \ -usb +-net none -serial pty -parallel none
-- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 03/19/2013 07:41 PM, Yin Olivia-R63875 wrote:
Hi Eric,
You're so kind to help squash. Thank you very much.
No problem. You can return the favor by helping review other outstanding patches.
Exactly there's one more thing need fix is that 'ppce500v2' should be changed as 'ppce500' to align with qemu-1.4.0.
What should I do next step? Should I post a new revision of patchset?
At this point, your original patches are already part of libvirt.git, so you will need to post the fix as a new patch. Starting a new thread will give it better visibility. Also, we tend to avoid top-posting on technical lists. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

--- src/security/security_dac.c | 8 ++++++++ src/security/security_selinux.c | 8 ++++++++ src/security/virt-aa-helper.c | 4 ++++ 3 files changed, 20 insertions(+), 0 deletions(-) diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 0b274b7..35b90da 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -760,6 +760,10 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr, virSecurityDACRestoreSecurityFileLabel(def->os.initrd) < 0) rc = -1; + if (def->os.dtb && + virSecurityDACRestoreSecurityFileLabel(def->os.dtb) < 0) + rc = -1; + return rc; } @@ -822,6 +826,10 @@ virSecurityDACSetSecurityAllLabel(virSecurityManagerPtr mgr, virSecurityDACSetOwnership(def->os.initrd, user, group) < 0) return -1; + if (def->os.dtb && + virSecurityDACSetOwnership(def->os.dtb, user, group) < 0) + return -1; + return 0; } diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index a042b26..0dbfd35 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1720,6 +1720,10 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr, virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.initrd) < 0) rc = -1; + if (def->os.dtb && + virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.dtb) < 0) + rc = -1; + return rc; } @@ -2116,6 +2120,10 @@ virSecuritySELinuxSetSecurityAllLabel(virSecurityManagerPtr mgr, virSecuritySELinuxSetFilecon(def->os.initrd, data->content_context) < 0) return -1; + if (def->os.dtb && + virSecuritySELinuxSetFilecon(def->os.dtb, data->content_context) < 0) + return -1; + if (stdin_path) { if (virSecuritySELinuxSetFilecon(stdin_path, data->content_context) < 0 && virStorageFileIsSharedFSType(stdin_path, diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index c1a3ec9..f764f77 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -993,6 +993,10 @@ get_files(vahControl * ctl) if (vah_add_file(&buf, ctl->def->os.initrd, "r") != 0) goto clean; + if (ctl->def->os.dtb) + if (vah_add_file(&buf, ctl->def->os.dtb, "r") != 0) + goto clean; + if (ctl->def->os.loader && ctl->def->os.loader) if (vah_add_file(&buf, ctl->def->os.loader, "r") != 0) goto clean; -- 1.6.4

On Thu, Mar 14, 2013 at 12:49:44PM +0800, Olivia Yin wrote:
--- src/security/security_dac.c | 8 ++++++++ src/security/security_selinux.c | 8 ++++++++ src/security/virt-aa-helper.c | 4 ++++ 3 files changed, 20 insertions(+), 0 deletions(-)
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Hi Eric & Daniel, Could you please help review these patches? Best Regards, Olivia
-----Original Message----- From: Yin Olivia-R63875 Sent: Thursday, March 14, 2013 12:50 PM To: libvir-list@redhat.com Cc: Yin Olivia-R63875 Subject: [PATCH v5 0/3] qemu: -dtb option support
Since v1.1 QEMU provides -dtb option to support loading device tree binary images. These patches update qemu commands/capabilities for dtb and provide docs/tests.
Olivia Yin (3): conf: support <dtb> tag in XML domain file qemu: add dtb option supprt selinux: deal with dtb file
docs/formatdomain.html.in | 5 +++ docs/schemas/domaincommon.rng | 6 ++++ src/conf/domain_conf.c | 4 ++ src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 8 ++++- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 6 ++++ src/security/security_dac.c | 8 +++++ src/security/security_selinux.c | 8 +++++ src/security/virt-aa-helper.c | 4 ++ tests/qemuhelptest.c | 30 +++++++++++++----- - tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 1 + tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml | 28 ++++++++++++++++++ tests/qemuxml2argvtest.c | 2 + tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 15 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.xml
participants (4)
-
Daniel P. Berrange
-
Eric Blake
-
Olivia Yin
-
Yin Olivia-R63875