[libvirt] [PATCH v3 0/8] Support qemu-system-arm vexpress-a9

This series adds the bits needed to kick of a qemu-system-arm -machine vexpress-a9 guest. vexpress-a15 likely works as well but is untested. Patches 1-2 are related bugfixes/improvements. Patch 6 adds disk bus=sd, which is often the only way to specify storage for ARM boards. Patch 8 adds virtio-mmio address support, which enables virtio for ARM vexpress machine types. The rest are mostly about fixing CLI generations. Unfortunately qemu ARM boards don't quite work like x86 where we can mix and match devices, so -device is out of the picture (for non-virtio), meaning we have to fall back to CLI infrastrucure like -net nic and -serial. v3: Rebased series Add qemu.conf nographics_allow_host_audio for patch #1 Drop domain_conf.c default memballoon handling in patch #2, not #3 Cole Robinson (8): qemu: Set QEMU_AUDIO_DRV=none with -nographic domain_conf: Add default memballoon in PostParse callbacks qemu: Don't add default memballoon device on ARM qemu: Fix specifying char devs for ARM qemu: Don't try to allocate PCI addresses for ARM domain_conf: Add disk bus=sd, wire it up for qemu qemu: Fix networking for ARM guests qemu: Support virtio-mmio transport for virtio on ARM docs/formatdomain.html.in | 3 +- docs/schemas/domaincommon.rng | 20 ++++ src/conf/domain_conf.c | 29 +++-- src/conf/domain_conf.h | 2 + src/qemu/libvirtd_qemu.aug | 3 + src/qemu/qemu.conf | 9 ++ src/qemu/qemu_capabilities.c | 23 ++++ src/qemu/qemu_capabilities.h | 6 + src/qemu/qemu_cgroup.c | 2 +- src/qemu/qemu_command.c | 127 +++++++++++++++++---- src/qemu/qemu_conf.c | 1 + src/qemu/qemu_conf.h | 1 + src/qemu/qemu_domain.c | 32 +++++- src/qemu/qemu_process.c | 37 +++--- src/qemu/test_libvirtd_qemu.aug.in | 1 + src/xen/xen_driver.c | 9 ++ .../qemuxml2argv-arm-vexpressa9-basic.args | 8 ++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++ .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 + .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 ++++++++ .../qemuxml2argv-balloon-device-auto.args | 3 +- .../qemuxml2argv-balloon-device-period.args | 3 +- .../qemuxml2argv-balloon-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-bios.args | 2 +- .../qemuxml2argv-blkdeviotune.args | 3 +- .../qemuxml2argv-blkiotune-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-blkiotune.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-cdrom.args | 3 +- .../qemuxml2argv-boot-complex-bootindex.args | 2 +- .../qemuxml2argv-boot-complex.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.args | 3 +- ...xml2argv-boot-menu-disable-drive-bootindex.args | 3 +- .../qemuxml2argv-boot-menu-disable-drive.args | 3 +- .../qemuxml2argv-boot-menu-disable.args | 3 +- .../qemuxml2argv-boot-menu-enable.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-multi.args | 3 +- .../qemuxml2argv-boot-network.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-order.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-bootloader.args | 3 +- .../qemuxml2argv-channel-guestfwd.args | 3 +- .../qemuxml2argv-channel-virtio-auto.args | 3 +- .../qemuxml2argv-channel-virtio.args | 3 +- .../qemuxml2argv-clock-france.args | 4 +- .../qemuxml2argv-clock-localtime.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-clock-utc.args | 3 +- .../qemuxml2argv-clock-variable.args | 3 +- .../qemuxml2argv-console-compat-auto.args | 3 +- .../qemuxml2argv-console-compat-chardev.args | 3 +- .../qemuxml2argv-console-compat.args | 3 +- .../qemuxml2argv-console-sclp.args | 3 +- .../qemuxml2argv-console-virtio-ccw.args | 3 +- .../qemuxml2argv-console-virtio-many.args | 3 +- .../qemuxml2argv-console-virtio-s390.args | 3 +- .../qemuxml2argv-console-virtio.args | 3 +- .../qemuxml2argv-cpu-eoi-disabled.args | 3 +- .../qemuxml2argv-cpu-eoi-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 3 +- .../qemuxml2argv-cpu-exact2-nofallback.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 3 +- .../qemuxml2argv-cpu-fallback.args | 2 +- .../qemuxml2argv-cpu-host-kvmclock.args | 3 +- .../qemuxml2argv-cpu-host-model-fallback.args | 2 +- .../qemuxml2argv-cpu-host-model.args | 2 +- .../qemuxml2argv-cpu-host-passthrough.args | 2 +- .../qemuxml2argv-cpu-kvmclock.args | 3 +- .../qemuxml2argv-cpu-minimum1.args | 3 +- .../qemuxml2argv-cpu-minimum2.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 3 +- .../qemuxml2argv-cpu-topology1.args | 3 +- .../qemuxml2argv-cpu-topology2.args | 3 +- .../qemuxml2argv-cpu-topology3.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cputune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 3 +- .../qemuxml2argv-disk-blockio.args | 2 +- .../qemuxml2argv-disk-cdrom-empty.args | 3 +- .../qemuxml2argv-disk-cdrom-network-ftp.args | 3 +- .../qemuxml2argv-disk-cdrom-network-http.args | 3 +- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-cdrom-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-cdrom.args | 3 +- .../qemuxml2argv-disk-copy_on_read.args | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.args | 3 +- .../qemuxml2argv-disk-drive-boot-disk.args | 3 +- .../qemuxml2argv-disk-drive-cache-directsync.args | 3 +- .../qemuxml2argv-disk-drive-cache-unsafe.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wt.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wt.args | 3 +- .../qemuxml2argv-disk-drive-discard.args | 2 +- ...uxml2argv-disk-drive-error-policy-enospace.args | 3 +- .../qemuxml2argv-disk-drive-error-policy-stop.args | 3 +- ...gv-disk-drive-error-policy-wreport-rignore.args | 3 +- .../qemuxml2argv-disk-drive-fat.args | 3 +- .../qemuxml2argv-disk-drive-fmt-qcow.args | 3 +- .../qemuxml2argv-disk-drive-network-gluster.args | 3 +- ...qemuxml2argv-disk-drive-network-iscsi-auth.args | 3 +- .../qemuxml2argv-disk-drive-network-iscsi-lun.args | 2 +- .../qemuxml2argv-disk-drive-network-iscsi.args | 3 +- ...qemuxml2argv-disk-drive-network-nbd-export.args | 3 +- ...ml2argv-disk-drive-network-nbd-ipv6-export.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-ipv6.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-unix.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd.args | 3 +- .../qemuxml2argv-disk-drive-network-rbd-auth.args | 2 +- ...muxml2argv-disk-drive-network-rbd-ceph-env.args | 4 +- .../qemuxml2argv-disk-drive-network-rbd-ipv6.args | 2 +- .../qemuxml2argv-disk-drive-network-rbd.args | 2 +- .../qemuxml2argv-disk-drive-network-sheepdog.args | 3 +- .../qemuxml2argv-disk-drive-no-boot.args | 2 +- .../qemuxml2argv-disk-drive-readonly-disk.args | 3 +- ...qemuxml2argv-disk-drive-readonly-no-device.args | 3 +- .../qemuxml2argv-disk-drive-shared.args | 3 +- ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-floppy-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.args | 3 +- .../qemuxml2argv-disk-geometry.args | 3 +- .../qemuxml2argv-disk-ide-drive-split.args | 2 +- .../qemuxml2argv-disk-ide-wwn.args | 2 +- .../qemuxml2argv-disk-ioeventfd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-many.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-order.args | 3 +- .../qemuxml2argv-disk-sata-device.args | 3 +- .../qemuxml2argv-disk-scsi-device-auto.args | 3 +- .../qemuxml2argv-disk-scsi-device.args | 3 +- .../qemuxml2argv-disk-scsi-disk-split.args | 2 +- .../qemuxml2argv-disk-scsi-disk-vpd.args | 2 +- .../qemuxml2argv-disk-scsi-disk-wwn.args | 2 +- .../qemuxml2argv-disk-scsi-lun-passthrough.args | 3 +- .../qemuxml2argv-disk-scsi-megasas.args | 3 +- .../qemuxml2argv-disk-scsi-virtio-scsi.args | 3 +- .../qemuxml2argv-disk-scsi-vscsi.args | 3 +- .../qemuxml2argv-disk-snapshot.args | 3 +- .../qemuxml2argv-disk-usb-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-usb.args | 3 +- .../qemuxml2argv-disk-virtio-ccw-many.args | 3 +- .../qemuxml2argv-disk-virtio-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-s390.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-num_queues.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.args | 3 +- .../qemuxml2argv-eoi-disabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.args | 2 +- .../qemuxml2argv-floppy-drive-fat.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-fs9p.args | 3 +- .../qemuxml2argv-graphics-vnc-sasl.args | 3 +- .../qemuxml2argv-graphics-vnc-tls.args | 3 +- .../qemuxml2argv-graphics-vnc-websocket.args | 3 +- .../qemuxml2argv-hostdev-pci-address-device.args | 3 +- .../qemuxml2argv-hostdev-pci-address.args | 3 +- .../qemuxml2argv-hostdev-scsi-boot.args | 3 +- .../qemuxml2argv-hostdev-scsi-lsi.args | 3 +- .../qemuxml2argv-hostdev-scsi-readonly.args | 3 +- .../qemuxml2argv-hostdev-scsi-virtio-scsi.args | 3 +- ...muxml2argv-hostdev-usb-address-device-boot.args | 3 +- .../qemuxml2argv-hostdev-usb-address-device.args | 3 +- .../qemuxml2argv-hostdev-usb-address.args | 3 +- .../qemuxml2argv-hostdev-vfio.args | 3 +- .../qemuxml2argv-hotplug-base.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-hyperv-off.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-hyperv.args | 3 +- .../qemuxml2argv-input-usbmouse-addr.args | 3 +- .../qemuxml2argv-input-usbmouse.args | 3 +- .../qemuxml2argv-input-usbtablet.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvm.args | 2 +- .../qemuxml2argv-kvmclock+eoi-disabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvmclock.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-lease.args | 3 +- .../qemuxml2argv-machine-aliases1.args | 2 +- .../qemuxml2argv-machine-aliases2.args | 3 +- .../qemuxml2argv-machine-core-off.args | 3 +- .../qemuxml2argv-machine-core-on.args | 3 +- .../qemuxml2argv-machine-usb-opt.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-memtune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-metadata.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-migrate.args | 3 +- .../qemuxml2argv-minimal-s390.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-minimal.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.args | 3 +- .../qemuxml2argv-misc-disable-s3.args | 3 +- .../qemuxml2argv-misc-disable-suspends.args | 3 +- .../qemuxml2argv-misc-enable-s4.args | 3 +- .../qemuxml2argv-misc-no-reboot.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 2 +- .../qemuxml2argv-mlock-unsupported.args | 2 +- .../qemuxml2argv-monitor-json.args | 3 +- .../qemuxml2argv-multifunction-pci-device.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-client.args | 3 +- .../qemuxml2argv-net-eth-ifname.args | 3 +- .../qemuxml2argv-net-eth-names.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-eth.args | 3 +- .../qemuxml2argv-net-hostdev-vfio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-hostdev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-mcast.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-server.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-user.args | 3 +- .../qemuxml2argv-net-virtio-ccw.args | 3 +- .../qemuxml2argv-net-virtio-device.args | 3 +- .../qemuxml2argv-net-virtio-netdev.args | 3 +- .../qemuxml2argv-net-virtio-s390.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-no-shutdown.args | 2 +- .../qemuxml2argv-nographics-vga.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-nographics.args | 3 +- .../qemuxml2argv-nosharepages.args | 3 +- ...qemuxml2argv-numad-auto-memory-vcpu-cpuset.args | 3 +- ...d-auto-memory-vcpu-no-cpuset-and-placement.args | 3 +- ...muxml2argv-numad-auto-vcpu-static-numatune.args | 3 +- ...qemuxml2argv-numad-static-memory-auto-vcpu.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-numad.args | 3 +- .../qemuxml2argv-numatune-memory.args | 3 +- .../qemuxml2argv-parallel-parport-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp.args | 3 +- .../qemuxml2argv-pci-autoadd-addr.args | 2 +- .../qemuxml2argv-pci-autoadd-idx.args | 2 +- .../qemuxml2argv-pci-bridge-many-disks.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pcie-root.args | 3 +- .../qemuxml2argv-pcihole64-none.args | 2 +- .../qemuxml2argv-pcihole64-q35.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pcihole64.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 2 +- .../qemuxml2argv-pseries-basic.args | 2 +- .../qemuxml2argv-pseries-nvram.args | 3 +- .../qemuxml2argv-pseries-usb-default.args | 2 +- .../qemuxml2argv-pseries-usb-multi.args | 2 +- .../qemuxml2argv-pseries-vio-user-assigned.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-q35.args | 2 +- .../qemuxml2argv-qemu-ns-no-env.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns.args | 4 +- .../qemuxml2argv-reboot-timeout-disabled.args | 3 +- .../qemuxml2argv-reboot-timeout-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v1.args | 3 +- .../qemuxml2argv-restore-v2-fd.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v2.args | 3 +- .../qemuxml2argv-s390-piix-controllers.args | 2 +- .../qemuxml2argv-s390-usb-none.args | 2 +- .../qemuxml2argv-seclabel-dynamic-baselabel.args | 3 +- .../qemuxml2argv-seclabel-dynamic-labelskip.args | 3 +- .../qemuxml2argv-seclabel-dynamic-override.args | 3 +- .../qemuxml2argv-seclabel-dynamic.args | 3 +- .../qemuxml2argv-seclabel-none.args | 3 +- .../qemuxml2argv-seclabel-static-labelskip.args | 3 +- .../qemuxml2argv-seclabel-static-relabel.args | 3 +- .../qemuxml2argv-seclabel-static.args | 3 +- .../qemuxml2argv-serial-dev-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-dev.args | 3 +- .../qemuxml2argv-serial-file-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-file.args | 3 +- .../qemuxml2argv-serial-many-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-many.args | 3 +- .../qemuxml2argv-serial-pty-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-pty.args | 3 +- .../qemuxml2argv-serial-tcp-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-tcp.args | 3 +- .../qemuxml2argv-serial-udp-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-udp.args | 3 +- .../qemuxml2argv-serial-unix-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-unix.args | 3 +- .../qemuxml2argv-serial-vc-chardev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-serial-vc.args | 3 +- .../qemuxml2argv-smartcard-controller.args | 3 +- .../qemuxml2argv-smartcard-host-certificates.args | 3 +- .../qemuxml2argv-smartcard-host.args | 3 +- ...emuxml2argv-smartcard-passthrough-spicevmc.args | 3 +- .../qemuxml2argv-smartcard-passthrough-tcp.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smbios.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 3 +- .../qemuxml2argv-sound-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-sound.args | 3 +- .../qemuxml2argv-tpm-passthrough.args | 2 +- .../qemuxml2argv-usb-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-hub.args | 3 +- .../qemuxml2argv-usb-ich9-companion.args | 3 +- .../qemuxml2argv-usb-ich9-ehci-addr.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 3 +- .../qemuxml2argv-usb-piix3-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args | 3 +- .../qemuxml2argv-usb-redir-boot.args | 3 +- .../qemuxml2argv-usb-redir-filter.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-virtio-lun.args | 2 +- .../qemuxml2argv-virtio-rng-ccw.args | 3 +- .../qemuxml2argv-virtio-rng-default.args | 3 +- .../qemuxml2argv-virtio-rng-egd.args | 3 +- .../qemuxml2argv-virtio-rng-random.args | 3 +- .../qemuxml2argv-watchdog-device.args | 3 +- .../qemuxml2argv-watchdog-dump.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-watchdog.args | 3 +- tests/qemuxml2argvtest.c | 10 ++ .../qemuxmlns-qemu-ns-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-commandline-ns1.args | 2 +- .../qemuxmlns-qemu-ns-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain.args | 2 +- tests/testutilsqemu.c | 33 ++++++ 314 files changed, 948 insertions(+), 350 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml -- 1.8.3.1

This should be a no-op change for now. --- src/conf/domain_conf.c | 13 ------------- src/qemu/qemu_domain.c | 10 ++++++++++ src/xen/xen_driver.c | 9 +++++++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f8fbf79..fafbb89 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12184,19 +12184,6 @@ virDomainDefParseXML(xmlDocPtr xml, def->memballoon = memballoon; VIR_FREE(nodes); - } else { - if (def->virtType == VIR_DOMAIN_VIRT_XEN || - def->virtType == VIR_DOMAIN_VIRT_QEMU || - def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) { - virDomainMemballoonDefPtr memballoon; - if (VIR_ALLOC(memballoon) < 0) - goto error; - memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? - VIR_DOMAIN_MEMBALLOON_MODEL_XEN : - VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; - def->memballoon = memballoon; - } } /* Parse the RNG device */ diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7f4d17d..9260301 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -784,6 +784,16 @@ qemuDomainDefPostParse(virDomainDefPtr def, return -1; } } + + if (!def->memballoon) { + virDomainMemballoonDefPtr memballoon; + if (VIR_ALLOC(memballoon) < 0) + return -1; + + memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; + def->memballoon = memballoon; + } + return 0; } diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index cb64de6..6cb4f4f 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -340,6 +340,15 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def->os.type, "hvm")) dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; + if (!def->memballoon) { + virDomainMemballoonDefPtr memballoon; + if (VIR_ALLOC(memballoon) < 0) + return -1; + + memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_XEN; + def->memballoon = memballoon; + } + return 0; } -- 1.8.3.1

On 08/30/2013 10:41 AM, Cole Robinson wrote:
This should be a no-op change for now. --- src/conf/domain_conf.c | 13 ------------- src/qemu/qemu_domain.c | 10 ++++++++++ src/xen/xen_driver.c | 9 +++++++++ 3 files changed, 19 insertions(+), 13 deletions(-)
ACK; this one was originally posted pre-freeze, and as a no-op should be safe for 1.1.2; on the other hand, if the rest of the series ends up being too risky this late in freeze, it's better to wait on this one as well. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Fri, Aug 30, 2013 at 12:41:30PM -0400, Cole Robinson wrote:
This should be a no-op change for now. --- src/conf/domain_conf.c | 13 ------------- src/qemu/qemu_domain.c | 10 ++++++++++ src/xen/xen_driver.c | 9 +++++++++ 3 files changed, 19 insertions(+), 13 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 :|

And add test cases for a basic working ARM guest. --- docs/schemas/domaincommon.rng | 19 +++++++++++++ src/qemu/qemu_domain.c | 4 ++- .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 ++++ .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 6978dc7..68c3e4d 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -304,6 +304,7 @@ <ref name="hvmppc"/> <ref name="hvmppc64"/> <ref name="hvms390"/> + <ref name="hvmarm"/> </choice> </optional> <value>hvm</value> @@ -413,6 +414,24 @@ </optional> </group> </define> + <define name="hvmarm"> + <group> + <optional> + <attribute name="arch"> + <choice> + <value>armv7l</value> + </choice> + </attribute> + </optional> + <optional> + <attribute name="machine"> + <data type="string"> + <param name="pattern">[a-zA-Z0-9_\.\-]+</param> + </data> + </attribute> + </optional> + </group> + </define> <define name="osexe"> <element name="os"> <element name="type"> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9260301..cff6d70 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -703,6 +703,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, bool addImplicitSATA = false; bool addPCIRoot = false; bool addPCIeRoot = false; + bool addDefaultMemballoon = true; /* check for emulator and create a default one if needed */ if (!def->emulator && @@ -737,6 +738,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, case VIR_ARCH_ARMV7L: addDefaultUSB = false; + addDefaultMemballoon = false; break; case VIR_ARCH_ALPHA: @@ -785,7 +787,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, } } - if (!def->memballoon) { + if (addDefaultMemballoon && !def->memballoon) { virDomainMemballoonDefPtr memballoon; if (VIR_ALLOC(memballoon) < 0) return -1; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args new file mode 100644 index 0000000..794dba2 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd \ +-append console=ttyAMA0,115200n8 -dtb /arm.dtb -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml new file mode 100644 index 0000000..3f318c8 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml @@ -0,0 +1,26 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8</cmdline> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset="utc"/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-arm</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4e3508b..cb6106f 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1057,6 +1057,9 @@ mymain(void) QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_Q35_PCI_HOLE64_SIZE); + DO_TEST("arm-vexpressa9-nodevs", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + virObjectUnref(driver.config); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index fac83b2..92433ef 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -145,6 +145,36 @@ error: return -1; } +static int testQemuAddArmGuest(virCapsPtr caps) +{ + static const char *machines[] = { "vexpress-a9", + "vexpress-a15", + "versatilepb" }; + virCapsGuestMachinePtr *capsmachines = NULL; + virCapsGuestPtr guest; + + capsmachines = virCapabilitiesAllocMachines(machines, + ARRAY_CARDINALITY(machines)); + if (!capsmachines) + goto error; + + guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_ARMV7L, + "/usr/bin/qemu-system-arm", NULL, + ARRAY_CARDINALITY(machines), + capsmachines); + if (!guest) + goto error; + + if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL)) + goto error; + + return 0; + +error: + virCapabilitiesFreeMachines(capsmachines, ARRAY_CARDINALITY(machines)); + return -1; +} + virCapsPtr testQemuCapsInit(void) { virCapsPtr caps; @@ -270,6 +300,9 @@ virCapsPtr testQemuCapsInit(void) { if (testQemuAddS390Guest(caps)) goto cleanup; + if (testQemuAddArmGuest(caps)) + goto cleanup; + if (virTestGetDebug()) { char *caps_str; -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:31PM -0400, Cole Robinson wrote:
And add test cases for a basic working ARM guest. --- docs/schemas/domaincommon.rng | 19 +++++++++++++ src/qemu/qemu_domain.c | 4 ++- .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 ++++ .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml
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 :|

QEMU ARM boards don't give us any way to explicitly wire in a -chardev, so use the old style -serial options. Unfortunately this isn't as simple as just turning off the CHARDEV flag for qemu-system-arm, as upcoming virtio support _will_ use device/chardev. --- src/qemu/qemu_capabilities.c | 18 ++++++++++++++++++ src/qemu/qemu_capabilities.h | 4 ++++ src/qemu/qemu_command.c | 3 +-- src/qemu/qemu_process.c | 37 ++++++++++++++++++++++--------------- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 7888e2d..72df793 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2827,3 +2827,21 @@ virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps) { return qemuCaps->usedQMP; } + +bool +virQEMUCapsSupportsChardev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr chr ATTRIBUTE_UNUSED) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) || + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + return false; + + /* This may not be true for all ARM machine types, but at least + * the only supported serial devices of vexpress and versatile + * don't have the -chardev property wired up. */ + if (def->os.arch != VIR_ARCH_ARMV7L) + return false; + + return true; +} diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 69f3395..5180ee9 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -275,4 +275,8 @@ int virQEMUCapsParseDeviceStr(virQEMUCapsPtr qemuCaps, const char *str); VIR_ENUM_DECL(virQEMUCaps); bool virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps); +bool virQEMUCapsSupportsChardev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr chr); + #endif /* __QEMU_CAPABILITIES_H__*/ diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9dfdb73..a8e532c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8493,8 +8493,7 @@ qemuBuildCommandLine(virConnectPtr conn, char *devstr; /* Use -chardev with -device if they are available */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (virQEMUCapsSupportsChardev(def, qemuCaps, serial)) { virCommandAddArg(cmd, "-chardev"); if (!(devstr = qemuBuildChrChardevStr(&serial->source, serial->info.alias, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index dfe8142..abe0060 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1604,22 +1604,25 @@ qemuProcessExtractTTYPath(const char *haystack, } static int -qemuProcessLookupPTYs(virDomainChrDefPtr *devices, +qemuProcessLookupPTYs(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr *devices, int count, - virHashTablePtr paths, - bool chardevfmt) + virHashTablePtr paths) { size_t i; - const char *prefix = chardevfmt ? "char" : ""; for (i = 0; i < count; i++) { virDomainChrDefPtr chr = devices[i]; + bool chardevfmt = virQEMUCapsSupportsChardev(def, qemuCaps, chr); + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { char id[32]; const char *path; if (snprintf(id, sizeof(id), "%s%s", - prefix, chr->info.alias) >= sizeof(id)) + chardevfmt ? "char" : "", + chr->info.alias) >= sizeof(id)) return -1; path = (const char *) virHashLookup(paths, id); @@ -1653,19 +1656,21 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm, virQEMUCapsPtr qemuCaps, virHashTablePtr paths) { - bool chardevfmt = virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV); size_t i = 0; - if (qemuProcessLookupPTYs(vm->def->serials, vm->def->nserials, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->serials, vm->def->nserials, + paths) < 0) return -1; - if (qemuProcessLookupPTYs(vm->def->parallels, vm->def->nparallels, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->parallels, vm->def->nparallels, + paths) < 0) return -1; - if (qemuProcessLookupPTYs(vm->def->channels, vm->def->nchannels, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->channels, vm->def->nchannels, + paths) < 0) return -1; /* For historical reasons, console[0] can be just an alias * for serial[0]. That's why we need to update it as well. */ @@ -1683,8 +1688,9 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm, } } - if (qemuProcessLookupPTYs(vm->def->consoles + i, vm->def->nconsoles - i, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->consoles + i, vm->def->nconsoles - i, + paths) < 0) return -1; return 0; @@ -1774,7 +1780,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver, virHashTablePtr paths = NULL; qemuDomainObjPrivatePtr priv; - if (!virQEMUCapsUsedQMP(qemuCaps) && pos != -1) { + if (!virQEMUCapsUsedQMP(qemuCaps) + && pos != -1) { if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) return -1; -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:32PM -0400, Cole Robinson wrote:
QEMU ARM boards don't give us any way to explicitly wire in a -chardev, so use the old style -serial options.
Unfortunately this isn't as simple as just turning off the CHARDEV flag for qemu-system-arm, as upcoming virtio support _will_ use device/chardev. --- src/qemu/qemu_capabilities.c | 18 ++++++++++++++++++ src/qemu/qemu_capabilities.h | 4 ++++ src/qemu/qemu_command.c | 3 +-- src/qemu/qemu_process.c | 37 ++++++++++++++++++++++--------------- 4 files changed, 45 insertions(+), 17 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 :|

--- src/qemu/qemu_command.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index a8e532c..87345c7 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1773,6 +1773,16 @@ cleanup: return ret; } +static bool +qemuDomainSupportsPCI(virDomainDefPtr def) { + if (def->os.arch != VIR_ARCH_ARMV7L) + return true; + + if (STREQ(def->os.machine, "versatilepb")) + return true; + + return false; +} int qemuDomainAssignPCIAddresses(virDomainDefPtr def, @@ -1838,8 +1848,10 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup; - if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) - goto cleanup; + if (qemuDomainSupportsPCI(def)) { + if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + } } if (obj && obj->privateData) { -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:33PM -0400, Cole Robinson wrote:
--- src/qemu/qemu_command.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 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 :|

This corresponds to '-sd' and '-drive if=sd' on the qemu command line. Needed for many ARM boards which don't provide any other way to pass in storage. --- docs/formatdomain.html.in | 3 ++- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 4 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 20 +++++++++++++++----- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index cce179d..af9b4ae 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1785,7 +1785,8 @@ as a device ordering hint. The optional <code>bus</code> attribute specifies the type of disk device to emulate; possible values are driver specific, with typical values being - "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus + "ide", "scsi", "virtio", "xen", "usb", "sata", or + "sd" <span class="since">"sd" since 1.1.2</span>. If omitted, the bus type is inferred from the style of the device name (e.g. a device named 'sda' will typically be exported using a SCSI bus). The optional attribute <code>tray</code> indicates the tray status of the diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 68c3e4d..79ea746 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1295,6 +1295,7 @@ <value>usb</value> <value>uml</value> <value>sata</value> + <value>sd</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fafbb89..2c62a2d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -239,7 +239,8 @@ VIR_ENUM_IMPL(virDomainDiskBus, VIR_DOMAIN_DISK_BUS_LAST, "xen", "usb", "uml", - "sata") + "sata", + "sd") VIR_ENUM_IMPL(virDomainDiskCache, VIR_DOMAIN_DISK_CACHE_LAST, "default", @@ -17308,6 +17309,7 @@ virDiskNameToBusDeviceIndex(const virDomainDiskDefPtr disk, case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: + case VIR_DOMAIN_DISK_BUS_SD: default: *busIdx = 0; *devIdx = idx; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 56739b7..380e2bb 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -509,6 +509,7 @@ enum virDomainDiskBus { VIR_DOMAIN_DISK_BUS_USB, VIR_DOMAIN_DISK_BUS_UML, VIR_DOMAIN_DISK_BUS_SATA, + VIR_DOMAIN_DISK_BUS_SD, VIR_DOMAIN_DISK_BUS_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 87345c7..6733709 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -73,7 +73,8 @@ VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST, "xen", "usb", "uml", - "sata") + "sata", + "sd") VIR_ENUM_DECL(qemuDiskCacheV1) @@ -646,6 +647,9 @@ static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk) case VIR_DOMAIN_DISK_BUS_XEN: ret = virAsprintf(&dev_name, "xenblk%d", devid); break; + case VIR_DOMAIN_DISK_BUS_SD: + ret = virAsprintf(&dev_name, "sd%d", devid); + break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported disk name mapping for bus '%s'"), @@ -3786,7 +3790,9 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, break; case VIR_DOMAIN_DISK_BUS_XEN: - /* Xen has no address type currently, so assign based on index */ + case VIR_DOMAIN_DISK_BUS_SD: + /* Xen and SD have no address type currently, so assign + * based on index */ break; } @@ -8190,12 +8196,13 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArg(cmd, "-drive"); /* Unfortunately it is not possible to use - -device for floppies, or Xen paravirt + -device for floppies, xen PV, or SD devices. Fortunately, those don't need static PCI addresses, so we don't really care that we can't use -device */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) { + if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN && + disk->bus != VIR_DOMAIN_DISK_BUS_SD) { withDeviceArg = true; } else { virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE); @@ -9892,6 +9899,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO; else if (STREQ(values[i], "xen")) def->bus = VIR_DOMAIN_DISK_BUS_XEN; + else if (STREQ(values[i], "sd")) + def->bus = VIR_DOMAIN_DISK_BUS_SD; } else if (STREQ(keywords[i], "media")) { if (STREQ(values[i], "cdrom")) { def->device = VIR_DOMAIN_DISK_DEVICE_CDROM; @@ -10041,7 +10050,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (def->bus == VIR_DOMAIN_DISK_BUS_IDE) { ignore_value(VIR_STRDUP(def->dst, "hda")); - } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI || + def->bus == VIR_DOMAIN_DISK_BUS_SD) { ignore_value(VIR_STRDUP(def->dst, "sda")); } else if (def->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) { ignore_value(VIR_STRDUP(def->dst, "vda")); -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:34PM -0400, Cole Robinson wrote:
This corresponds to '-sd' and '-drive if=sd' on the qemu command line. Needed for many ARM boards which don't provide any other way to pass in storage. --- docs/formatdomain.html.in | 3 ++- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 4 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 20 +++++++++++++++----- 5 files changed, 22 insertions(+), 7 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 :|

Similar to the chardev bit, ARM boards depend on the old style '-net nic' for actually instantiating net devices. But we can't block out -netdev altogether since it's needed for upcoming virtio support. And add tests for working ARM XML with console, disk, and networking. --- src/qemu/qemu_command.c | 34 ++++++++++++++++------ src/qemu/qemu_domain.c | 20 +++++++++++-- .../qemuxml2argv-arm-vexpressa9-basic.args | 8 +++++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6733709..787381b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -417,6 +417,26 @@ cleanup: return ret; } +static bool +qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + return false; + + /* arm boards require legacy -net nic */ + if (def->os.arch == VIR_ARCH_ARMV7L) + return false; + + return true; +} + +static bool +qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +{ + if (!qemuDomainSupportsNicdev(def, qemuCaps)) + return false; + return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV); +} /** * qemuOpenVhostNet: @@ -454,8 +474,7 @@ qemuOpenVhostNet(virDomainDefPtr def, * option), don't try to open the device. */ if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) { + qemuDomainSupportsNetdev(def, qemuCaps))) { if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("vhost-net is not supported with " @@ -7312,8 +7331,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, * * NB, no support for -netdev without use of -device */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (qemuDomainSupportsNetdev(def, qemuCaps)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -7321,7 +7339,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-netdev", host, NULL); } - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (qemuDomainSupportsNicdev(def, qemuCaps)) { bool multiqueue = tapfdSize > 1 || vhostfdSize > 1; if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex, @@ -7333,8 +7351,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-net", nic, NULL); } - if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) { + if (!qemuDomainSupportsNetdev(def, qemuCaps)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -8385,8 +8402,7 @@ qemuBuildCommandLine(virConnectPtr conn, int vlan; /* VLANs are not used with -netdev, so don't record them */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + if (qemuDomainSupportsNetdev(def, qemuCaps)) vlan = -1; else vlan = i; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cff6d70..30588fb 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -799,6 +799,23 @@ qemuDomainDefPostParse(virDomainDefPtr def, return 0; } +static const char * +qemuDomainDefaultNetModel(virDomainDefPtr def) { + if (def->os.arch == VIR_ARCH_S390 || + def->os.arch == VIR_ARCH_S390X) + return "virtio"; + + if (def->os.arch == VIR_ARCH_ARMV7L) { + if (STREQ(def->os.machine, "versatilepb")) + return "smc91c111"; + + /* Incomplete. vexpress (and a few others) use this, but not all + * arm boards */ + return "lan9118"; + } + + return "rtl8139"; +} static int qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, @@ -814,8 +831,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && !dev->data.net->model) { if (VIR_STRDUP(dev->data.net->model, - def->os.arch == VIR_ARCH_S390 || - def->os.arch == VIR_ARCH_S390X ? "virtio" : "rtl8139") < 0) + qemuDomainDefaultNetModel(def)) < 0) goto cleanup; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args new file mode 100644 index 0000000..a23fde4 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args @@ -0,0 +1,8 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd -append \ +'console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0' \ +-dtb /arm.dtb -usb -drive file=/arm.raw,if=sd,index=0 \ +-net nic,macaddr=52:54:00:09:a4:37,vlan=0,model=lan9118,name=net0 \ +-net user,vlan=0,name=hostnet0 -serial pty diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml new file mode 100644 index 0000000..ec9374f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml @@ -0,0 +1,34 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0</cmdline> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset="utc"/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-arm</emulator> + <disk type='file' device='disk'> + <source file='/arm.raw'/> + <target dev='sda' bus='sd'/> + </disk> + <interface type='user'> + <mac address='52:54:00:09:a4:37'/> + </interface> + <console type='pty'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index cb6106f..6ecabbf 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1059,6 +1059,9 @@ mymain(void) DO_TEST("arm-vexpressa9-nodevs", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + DO_TEST("arm-vexpressa9-basic", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, + QEMU_CAPS_DRIVE); virObjectUnref(driver.config); virObjectUnref(driver.caps); -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:35PM -0400, Cole Robinson wrote:
Similar to the chardev bit, ARM boards depend on the old style '-net nic' for actually instantiating net devices. But we can't block out -netdev altogether since it's needed for upcoming virtio support.
And add tests for working ARM XML with console, disk, and networking. --- src/qemu/qemu_command.c | 34 ++++++++++++++++------ src/qemu/qemu_domain.c | 20 +++++++++++-- .../qemuxml2argv-arm-vexpressa9-basic.args | 8 +++++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml
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 :|

Starting with qemu 1.6, the qemu-system-arm vexpress-a9 model has a hardcoded virtio-mmio transport which enables attaching all virtio devices. On the command line, we have to use virtio-XXX-device rather than virtio-XXX-pci, thankfully s390 already set the precedent here so it's fairly straight forward. At the XML level, this adds a new device address type virtio-mmio. The controller and addressing don't have any subelements at the moment because we they aren't needed for this usecase, but could be added later if needed. Add a test case for an ARM guest with one of every virtio device enabled. --- src/conf/domain_conf.c | 12 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 17 ++++-- src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 65 +++++++++++++++++----- .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 +++++++++++++++ tests/qemuxml2argvtest.c | 4 ++ 8 files changed, 139 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2c62a2d..3b51ae8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -210,7 +210,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST, "usb", "spapr-vio", "virtio-s390", - "ccw") + "ccw", + "virtio-mmio") VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST, "block", @@ -2390,6 +2391,7 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info, return 1; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: return 1; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: @@ -3031,6 +3033,9 @@ virDomainDeviceInfoFormat(virBufferPtr buf, info->addr.ccw.devno); break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + break; + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unknown address type '%d'"), info->type); @@ -3495,6 +3500,9 @@ virDomainDeviceInfoParseXML(xmlNodePtr node, goto cleanup; break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + break; + default: /* Should not happen */ virReportError(VIR_ERR_INTERNAL_ERROR, @@ -5827,6 +5835,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390 && + def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Controllers must use the 'pci' address type")); @@ -6387,6 +6396,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390 && + def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Network interfaces must use 'pci' address type")); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 380e2bb..1d70eba 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -207,6 +207,7 @@ enum virDomainDeviceAddressType { VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW, + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST }; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 72df793..a0f7773 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -237,6 +237,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "dmi-to-pci-bridge", "i440fx-pci-hole64-size", "q35-pci-hole64-size", + + "virtio-mmio", /* 155 */ ); struct _virQEMUCaps { @@ -1385,6 +1387,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "vfio-pci", QEMU_CAPS_DEVICE_VFIO_PCI }, { "scsi-generic", QEMU_CAPS_DEVICE_SCSI_GENERIC }, { "i82801b11-bridge", QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE }, + { "virtio-mmio", QEMU_CAPS_DEVICE_VIRTIO_MMIO }, }; static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = { @@ -2831,17 +2834,19 @@ virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps) bool virQEMUCapsSupportsChardev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - virDomainChrDefPtr chr ATTRIBUTE_UNUSED) + virDomainChrDefPtr chr) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) return false; - /* This may not be true for all ARM machine types, but at least - * the only supported serial devices of vexpress and versatile - * don't have the -chardev property wired up. */ if (def->os.arch != VIR_ARCH_ARMV7L) - return false; + return true; - return true; + /* This may not be true for all ARM machine types, but at least + * the only supported non-virtio serial devices of vexpress and versatile + * don't have the -chardev property wired up. */ + return (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO || + (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && + chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO)); } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5180ee9..e000ce5 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -194,6 +194,8 @@ enum virQEMUCapsFlags { QEMU_CAPS_I440FX_PCI_HOLE64_SIZE = 153, /* i440FX-pcihost.pci-hole64-size */ QEMU_CAPS_Q35_PCI_HOLE64_SIZE = 154, /* q35-pcihost.pci-hole64-size */ + QEMU_CAPS_DEVICE_VIRTIO_MMIO = 155, /* -device virtio-mmio */ + 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 787381b..efbfc97 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -418,22 +418,27 @@ cleanup: } static bool -qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +qemuDomainSupportsNicdev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainNetDefPtr net) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) return false; - /* arm boards require legacy -net nic */ - if (def->os.arch == VIR_ARCH_ARMV7L) + /* non-virtio ARM nics require legacy -net nic */ + if (def->os.arch == VIR_ARCH_ARMV7L && + net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) return false; return true; } static bool -qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +qemuDomainSupportsNetdev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainNetDefPtr net) { - if (!qemuDomainSupportsNicdev(def, qemuCaps)) + if (!qemuDomainSupportsNicdev(def, qemuCaps, net)) return false; return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV); } @@ -474,7 +479,7 @@ qemuOpenVhostNet(virDomainDefPtr def, * option), don't try to open the device. */ if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) && - qemuDomainSupportsNetdev(def, qemuCaps))) { + qemuDomainSupportsNetdev(def, qemuCaps, net))) { if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("vhost-net is not supported with " @@ -1154,8 +1159,8 @@ cleanup: } static void -qemuDomainPrimeS390VirtioDevices(virDomainDefPtr def, - enum virDomainDeviceAddressType type) +qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def, + enum virDomainDeviceAddressType type) { /* declare address-less virtio devices to be of address type 'type' @@ -1289,7 +1294,7 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def, if (STREQLEN(def->os.machine, "s390-ccw", 8) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW)) { - qemuDomainPrimeS390VirtioDevices( + qemuDomainPrimeVirtioDeviceAddresses( def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW); if (!(addrs = qemuDomainCCWAddressSetCreate())) @@ -1304,7 +1309,7 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def, goto cleanup; } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_S390)) { /* deal with legacy virtio-s390 */ - qemuDomainPrimeS390VirtioDevices( + qemuDomainPrimeVirtioDeviceAddresses( def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390); } @@ -1327,6 +1332,18 @@ cleanup: return ret; } +static int +qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps) +{ + if (def->os.arch == VIR_ARCH_ARMV7L && + STRPREFIX(def->os.machine, "vexpress-") && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO)) { + qemuDomainPrimeVirtioDeviceAddresses( + def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO); + } + return 0; +} static int qemuSpaprVIOFindByReg(virDomainDefPtr def ATTRIBUTE_UNUSED, @@ -1912,6 +1929,10 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, if (rc) return rc; + rc = qemuDomainAssignARMVirtioMMIOAddresses(def, qemuCaps); + if (rc) + return rc; + return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); } @@ -4367,6 +4388,9 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } else if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) { virBufferAddLit(&opt, "virtio-blk-s390"); + } else if (disk->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) { + virBufferAddLit(&opt, "virtio-blk-device"); } else { virBufferAddLit(&opt, "virtio-blk-pci"); } @@ -4645,6 +4669,9 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, else if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) virBufferAddLit(&buf, "virtio-scsi-s390"); + else if (def->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + virBufferAddLit(&buf, "virtio-scsi-device"); else virBufferAddLit(&buf, "virtio-scsi-pci"); break; @@ -4674,6 +4701,9 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, } else if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) { virBufferAddLit(&buf, "virtio-serial-s390"); + } else if (def->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) { + virBufferAddLit(&buf, "virtio-serial-device"); } else { virBufferAddLit(&buf, "virtio-serial"); } @@ -4806,6 +4836,8 @@ qemuBuildNicDevStr(virDomainDefPtr def, nic = "virtio-net-ccw"; else if (net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) nic = "virtio-net-s390"; + else if (net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + nic = "virtio-net-device"; else nic = "virtio-net-pci"; @@ -5054,6 +5086,9 @@ qemuBuildMemballoonDevStr(virDomainDefPtr def, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: virBufferAddLit(&buf, "virtio-balloon-ccw"); break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + virBufferAddLit(&buf, "virtio-balloon-device"); + break; default: virReportError(VIR_ERR_XML_ERROR, _("memballoon unsupported with address type '%s'"), @@ -6055,6 +6090,8 @@ qemuBuildRNGDeviceArgs(virCommandPtr cmd, virBufferAsprintf(&buf, "virtio-rng-ccw,rng=%s", dev->info.alias); else if (dev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) virBufferAsprintf(&buf, "virtio-rng-s390,rng=%s", dev->info.alias); + else if (dev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + virBufferAsprintf(&buf, "virtio-rng-device,rng=%s", dev->info.alias); else virBufferAsprintf(&buf, "virtio-rng-pci,rng=%s", dev->info.alias); @@ -7331,7 +7368,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, * * NB, no support for -netdev without use of -device */ - if (qemuDomainSupportsNetdev(def, qemuCaps)) { + if (qemuDomainSupportsNetdev(def, qemuCaps, net)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -7339,7 +7376,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-netdev", host, NULL); } - if (qemuDomainSupportsNicdev(def, qemuCaps)) { + if (qemuDomainSupportsNicdev(def, qemuCaps, net)) { bool multiqueue = tapfdSize > 1 || vhostfdSize > 1; if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex, @@ -7351,7 +7388,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-net", nic, NULL); } - if (!qemuDomainSupportsNetdev(def, qemuCaps)) { + if (!qemuDomainSupportsNetdev(def, qemuCaps, net)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -8402,7 +8439,7 @@ qemuBuildCommandLine(virConnectPtr conn, int vlan; /* VLANs are not used with -netdev, so don't record them */ - if (qemuDomainSupportsNetdev(def, qemuCaps)) + if (qemuDomainSupportsNetdev(def, qemuCaps, net)) vlan = -1; else vlan = i; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args new file mode 100644 index 0000000..62de9d3 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args @@ -0,0 +1,14 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd -append \ +'console=ttyAMA0,115200n8 rw root=/dev/vda3 rootwait physmap.enabled=0' \ +-dtb /arm.dtb -device virtio-serial-device,id=virtio-serial0 -usb \ +-drive file=/arm.raw,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-device,drive=drive-virtio-disk0,id=virtio-disk0 \ +-device virtio-net-device,vlan=0,id=net0,mac=52:54:00:09:a4:37 \ +-net user,vlan=0,name=hostnet0 -serial pty -chardev pty,id=charconsole1 \ +-device virtconsole,chardev=charconsole1,id=console1 \ +-device virtio-balloon-device,id=balloon0 \ +-object rng-random,id=rng0,filename=/dev/random \ +-device virtio-rng-device,rng=rng0 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml new file mode 100644 index 0000000..2acf3c9 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml @@ -0,0 +1,45 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8 rw root=/dev/vda3 rootwait physmap.enabled=0</cmdline> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset="utc"/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-arm</emulator> + <disk type='file' device='disk'> + <source file='/arm.raw'/> + <target dev='vda' bus='virtio'/> + </disk> + <interface type='user'> + <mac address='52:54:00:09:a4:37'/> + <model type='virtio'/> + </interface> + <console type='pty'/> + <console type='pty'> + <target type='virtio' port='0'/> + </console> + <memballoon model='virtio'/> + <!-- + This actually doesn't work in practice because vexpress only has + 4 virtio slots available, rng makes 5 --> + <rng model='virtio'> + <backend model='random'>/dev/random</backend> + </rng> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 6ecabbf..ae8cc3b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1062,6 +1062,10 @@ mymain(void) DO_TEST("arm-vexpressa9-basic", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, QEMU_CAPS_DRIVE); + DO_TEST("arm-vexpressa9-virtio", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE_VIRTIO_MMIO, + QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM); virObjectUnref(driver.config); virObjectUnref(driver.caps); -- 1.8.3.1

On Fri, Aug 30, 2013 at 12:41:36PM -0400, Cole Robinson wrote:
Starting with qemu 1.6, the qemu-system-arm vexpress-a9 model has a hardcoded virtio-mmio transport which enables attaching all virtio devices.
On the command line, we have to use virtio-XXX-device rather than virtio-XXX-pci, thankfully s390 already set the precedent here so it's fairly straight forward.
At the XML level, this adds a new device address type virtio-mmio. The controller and addressing don't have any subelements at the moment because we they aren't needed for this usecase, but could be added later if needed.
Add a test case for an ARM guest with one of every virtio device enabled. --- src/conf/domain_conf.c | 12 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 17 ++++-- src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 65 +++++++++++++++++----- .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 +++++++++++++++ tests/qemuxml2argvtest.c | 4 ++ 8 files changed, 139 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml
ACK
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 380e2bb..1d70eba 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -207,6 +207,7 @@ enum virDomainDeviceAddressType { VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW, + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST };
So there's no kind of address properties needed for the MMIO address type ? 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 :|

On 09/02/2013 08:52 AM, Daniel P. Berrange wrote:
On Fri, Aug 30, 2013 at 12:41:36PM -0400, Cole Robinson wrote:
Starting with qemu 1.6, the qemu-system-arm vexpress-a9 model has a hardcoded virtio-mmio transport which enables attaching all virtio devices.
On the command line, we have to use virtio-XXX-device rather than virtio-XXX-pci, thankfully s390 already set the precedent here so it's fairly straight forward.
At the XML level, this adds a new device address type virtio-mmio. The controller and addressing don't have any subelements at the moment because we they aren't needed for this usecase, but could be added later if needed.
Add a test case for an ARM guest with one of every virtio device enabled. --- src/conf/domain_conf.c | 12 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 17 ++++-- src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 65 +++++++++++++++++----- .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 +++++++++++++++ tests/qemuxml2argvtest.c | 4 ++ 8 files changed, 139 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml
ACK
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 380e2bb..1d70eba 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -207,6 +207,7 @@ enum virDomainDeviceAddressType { VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW, + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST };
So there's no kind of address properties needed for the MMIO address type ?
There may be, when the qemu-system-arm -m virt machine lands, which AIUI will behave more like qemu-system-x86, allowing us to fully specify topology on the command line. Right now the only virtio-mmio user (vexpress) hardcodes creation in the qemu board init code. We might be able to explicitly specify addressing of virtio devices with -device, but if we can it's not obvious to me, and it's pretty pointless since we don't have that same control over the rest of the board config. Long term I think the only qemu arm machine type we will really want to 'support' is -M virt since it's closer to what we are used to with x86. - Cole

On 08/30/2013 12:41 PM, Cole Robinson wrote:
This series adds the bits needed to kick of a qemu-system-arm -machine vexpress-a9 guest. vexpress-a15 likely works as well but is untested.
Patches 1-2 are related bugfixes/improvements.
Patch 6 adds disk bus=sd, which is often the only way to specify storage for ARM boards.
Patch 8 adds virtio-mmio address support, which enables virtio for ARM vexpress machine types.
The rest are mostly about fixing CLI generations. Unfortunately qemu ARM boards don't quite work like x86 where we can mix and match devices, so -device is out of the picture (for non-virtio), meaning we have to fall back to CLI infrastrucure like -net nic and -serial.
v3: Rebased series Add qemu.conf nographics_allow_host_audio for patch #1 Drop domain_conf.c default memballoon handling in patch #2, not #3
Cole Robinson (8): qemu: Set QEMU_AUDIO_DRV=none with -nographic domain_conf: Add default memballoon in PostParse callbacks qemu: Don't add default memballoon device on ARM qemu: Fix specifying char devs for ARM qemu: Don't try to allocate PCI addresses for ARM domain_conf: Add disk bus=sd, wire it up for qemu qemu: Fix networking for ARM guests qemu: Support virtio-mmio transport for virtio on ARM
docs/formatdomain.html.in | 3 +- docs/schemas/domaincommon.rng | 20 ++++ src/conf/domain_conf.c | 29 +++-- src/conf/domain_conf.h | 2 + src/qemu/libvirtd_qemu.aug | 3 + src/qemu/qemu.conf | 9 ++ src/qemu/qemu_capabilities.c | 23 ++++ src/qemu/qemu_capabilities.h | 6 + src/qemu/qemu_cgroup.c | 2 +- src/qemu/qemu_command.c | 127 +++++++++++++++++---- src/qemu/qemu_conf.c | 1 + src/qemu/qemu_conf.h | 1 + src/qemu/qemu_domain.c | 32 +++++- src/qemu/qemu_process.c | 37 +++--- src/qemu/test_libvirtd_qemu.aug.in | 1 + src/xen/xen_driver.c | 9 ++ .../qemuxml2argv-arm-vexpressa9-basic.args | 8 ++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++ .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 + .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 ++++++++ .../qemuxml2argv-balloon-device-auto.args | 3 +- .../qemuxml2argv-balloon-device-period.args | 3 +- .../qemuxml2argv-balloon-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-bios.args | 2 +- .../qemuxml2argv-blkdeviotune.args | 3 +- .../qemuxml2argv-blkiotune-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-blkiotune.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-cdrom.args | 3 +- .../qemuxml2argv-boot-complex-bootindex.args | 2 +- .../qemuxml2argv-boot-complex.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.args | 3 +- ...xml2argv-boot-menu-disable-drive-bootindex.args | 3 +- .../qemuxml2argv-boot-menu-disable-drive.args | 3 +- .../qemuxml2argv-boot-menu-disable.args | 3 +- .../qemuxml2argv-boot-menu-enable.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-multi.args | 3 +- .../qemuxml2argv-boot-network.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-order.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-bootloader.args | 3 +- .../qemuxml2argv-channel-guestfwd.args | 3 +- .../qemuxml2argv-channel-virtio-auto.args | 3 +- .../qemuxml2argv-channel-virtio.args | 3 +- .../qemuxml2argv-clock-france.args | 4 +- .../qemuxml2argv-clock-localtime.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-clock-utc.args | 3 +- .../qemuxml2argv-clock-variable.args | 3 +- .../qemuxml2argv-console-compat-auto.args | 3 +- .../qemuxml2argv-console-compat-chardev.args | 3 +- .../qemuxml2argv-console-compat.args | 3 +- .../qemuxml2argv-console-sclp.args | 3 +- .../qemuxml2argv-console-virtio-ccw.args | 3 +- .../qemuxml2argv-console-virtio-many.args | 3 +- .../qemuxml2argv-console-virtio-s390.args | 3 +- .../qemuxml2argv-console-virtio.args | 3 +- .../qemuxml2argv-cpu-eoi-disabled.args | 3 +- .../qemuxml2argv-cpu-eoi-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 3 +- .../qemuxml2argv-cpu-exact2-nofallback.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 3 +- .../qemuxml2argv-cpu-fallback.args | 2 +- .../qemuxml2argv-cpu-host-kvmclock.args | 3 +- .../qemuxml2argv-cpu-host-model-fallback.args | 2 +- .../qemuxml2argv-cpu-host-model.args | 2 +- .../qemuxml2argv-cpu-host-passthrough.args | 2 +- .../qemuxml2argv-cpu-kvmclock.args | 3 +- .../qemuxml2argv-cpu-minimum1.args | 3 +- .../qemuxml2argv-cpu-minimum2.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 3 +- .../qemuxml2argv-cpu-topology1.args | 3 +- .../qemuxml2argv-cpu-topology2.args | 3 +- .../qemuxml2argv-cpu-topology3.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cputune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 3 +- .../qemuxml2argv-disk-blockio.args | 2 +- .../qemuxml2argv-disk-cdrom-empty.args | 3 +- .../qemuxml2argv-disk-cdrom-network-ftp.args | 3 +- .../qemuxml2argv-disk-cdrom-network-http.args | 3 +- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-cdrom-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-cdrom.args | 3 +- .../qemuxml2argv-disk-copy_on_read.args | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.args | 3 +- .../qemuxml2argv-disk-drive-boot-disk.args | 3 +- .../qemuxml2argv-disk-drive-cache-directsync.args | 3 +- .../qemuxml2argv-disk-drive-cache-unsafe.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wt.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wt.args | 3 +- .../qemuxml2argv-disk-drive-discard.args | 2 +- ...uxml2argv-disk-drive-error-policy-enospace.args | 3 +- .../qemuxml2argv-disk-drive-error-policy-stop.args | 3 +- ...gv-disk-drive-error-policy-wreport-rignore.args | 3 +- .../qemuxml2argv-disk-drive-fat.args | 3 +- .../qemuxml2argv-disk-drive-fmt-qcow.args | 3 +- .../qemuxml2argv-disk-drive-network-gluster.args | 3 +- ...qemuxml2argv-disk-drive-network-iscsi-auth.args | 3 +- .../qemuxml2argv-disk-drive-network-iscsi-lun.args | 2 +- .../qemuxml2argv-disk-drive-network-iscsi.args | 3 +- ...qemuxml2argv-disk-drive-network-nbd-export.args | 3 +- ...ml2argv-disk-drive-network-nbd-ipv6-export.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-ipv6.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-unix.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd.args | 3 +- .../qemuxml2argv-disk-drive-network-rbd-auth.args | 2 +- ...muxml2argv-disk-drive-network-rbd-ceph-env.args | 4 +- .../qemuxml2argv-disk-drive-network-rbd-ipv6.args | 2 +- .../qemuxml2argv-disk-drive-network-rbd.args | 2 +- .../qemuxml2argv-disk-drive-network-sheepdog.args | 3 +- .../qemuxml2argv-disk-drive-no-boot.args | 2 +- .../qemuxml2argv-disk-drive-readonly-disk.args | 3 +- ...qemuxml2argv-disk-drive-readonly-no-device.args | 3 +- .../qemuxml2argv-disk-drive-shared.args | 3 +- ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-floppy-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.args | 3 +- .../qemuxml2argv-disk-geometry.args | 3 +- .../qemuxml2argv-disk-ide-drive-split.args | 2 +- .../qemuxml2argv-disk-ide-wwn.args | 2 +- .../qemuxml2argv-disk-ioeventfd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-many.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-order.args | 3 +- .../qemuxml2argv-disk-sata-device.args | 3 +- .../qemuxml2argv-disk-scsi-device-auto.args | 3 +- .../qemuxml2argv-disk-scsi-device.args | 3 +- .../qemuxml2argv-disk-scsi-disk-split.args | 2 +- .../qemuxml2argv-disk-scsi-disk-vpd.args | 2 +- .../qemuxml2argv-disk-scsi-disk-wwn.args | 2 +- .../qemuxml2argv-disk-scsi-lun-passthrough.args | 3 +- .../qemuxml2argv-disk-scsi-megasas.args | 3 +- .../qemuxml2argv-disk-scsi-virtio-scsi.args | 3 +- .../qemuxml2argv-disk-scsi-vscsi.args | 3 +- .../qemuxml2argv-disk-snapshot.args | 3 +- .../qemuxml2argv-disk-usb-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-usb.args | 3 +- .../qemuxml2argv-disk-virtio-ccw-many.args | 3 +- .../qemuxml2argv-disk-virtio-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-s390.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-num_queues.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.args | 3 +- .../qemuxml2argv-eoi-disabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.args | 2 +- .../qemuxml2argv-floppy-drive-fat.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-fs9p.args | 3 +- .../qemuxml2argv-graphics-vnc-sasl.args | 3 +- .../qemuxml2argv-graphics-vnc-tls.args | 3 +- .../qemuxml2argv-graphics-vnc-websocket.args | 3 +- .../qemuxml2argv-hostdev-pci-address-device.args | 3 +- .../qemuxml2argv-hostdev-pci-address.args | 3 +- .../qemuxml2argv-hostdev-scsi-boot.args | 3 +- .../qemuxml2argv-hostdev-scsi-lsi.args | 3 +- .../qemuxml2argv-hostdev-scsi-readonly.args | 3 +- .../qemuxml2argv-hostdev-scsi-virtio-scsi.args | 3 +- ...muxml2argv-hostdev-usb-address-device-boot.args | 3 +- .../qemuxml2argv-hostdev-usb-address-device.args | 3 +- .../qemuxml2argv-hostdev-usb-address.args | 3 +- .../qemuxml2argv-hostdev-vfio.args | 3 +- .../qemuxml2argv-hotplug-base.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-hyperv-off.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-hyperv.args | 3 +- .../qemuxml2argv-input-usbmouse-addr.args | 3 +- .../qemuxml2argv-input-usbmouse.args | 3 +- .../qemuxml2argv-input-usbtablet.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvm.args | 2 +- .../qemuxml2argv-kvmclock+eoi-disabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvmclock.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-lease.args | 3 +- .../qemuxml2argv-machine-aliases1.args | 2 +- .../qemuxml2argv-machine-aliases2.args | 3 +- .../qemuxml2argv-machine-core-off.args | 3 +- .../qemuxml2argv-machine-core-on.args | 3 +- .../qemuxml2argv-machine-usb-opt.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-memtune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-metadata.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-migrate.args | 3 +- .../qemuxml2argv-minimal-s390.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-minimal.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.args | 3 +- .../qemuxml2argv-misc-disable-s3.args | 3 +- .../qemuxml2argv-misc-disable-suspends.args | 3 +- .../qemuxml2argv-misc-enable-s4.args | 3 +- .../qemuxml2argv-misc-no-reboot.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 2 +- .../qemuxml2argv-mlock-unsupported.args | 2 +- .../qemuxml2argv-monitor-json.args | 3 +- .../qemuxml2argv-multifunction-pci-device.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-client.args | 3 +- .../qemuxml2argv-net-eth-ifname.args | 3 +- .../qemuxml2argv-net-eth-names.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-eth.args | 3 +- .../qemuxml2argv-net-hostdev-vfio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-hostdev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-mcast.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-server.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-user.args | 3 +- .../qemuxml2argv-net-virtio-ccw.args | 3 +- .../qemuxml2argv-net-virtio-device.args | 3 +- .../qemuxml2argv-net-virtio-netdev.args | 3 +- .../qemuxml2argv-net-virtio-s390.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-no-shutdown.args | 2 +- .../qemuxml2argv-nographics-vga.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-nographics.args | 3 +- .../qemuxml2argv-nosharepages.args | 3 +- ...qemuxml2argv-numad-auto-memory-vcpu-cpuset.args | 3 +- ...d-auto-memory-vcpu-no-cpuset-and-placement.args | 3 +- ...muxml2argv-numad-auto-vcpu-static-numatune.args | 3 +- ...qemuxml2argv-numad-static-memory-auto-vcpu.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-numad.args | 3 +- .../qemuxml2argv-numatune-memory.args | 3 +- .../qemuxml2argv-parallel-parport-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp.args | 3 +- .../qemuxml2argv-pci-autoadd-addr.args | 2 +- .../qemuxml2argv-pci-autoadd-idx.args | 2 +- .../qemuxml2argv-pci-bridge-many-disks.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pcie-root.args | 3 +- .../qemuxml2argv-pcihole64-none.args | 2 +- .../qemuxml2argv-pcihole64-q35.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pcihole64.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 2 +- .../qemuxml2argv-pseries-basic.args | 2 +- .../qemuxml2argv-pseries-nvram.args | 3 +- .../qemuxml2argv-pseries-usb-default.args | 2 +- .../qemuxml2argv-pseries-usb-multi.args | 2 +- .../qemuxml2argv-pseries-vio-user-assigned.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-q35.args | 2 +- .../qemuxml2argv-qemu-ns-no-env.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns.args | 4 +- .../qemuxml2argv-reboot-timeout-disabled.args | 3 +- .../qemuxml2argv-reboot-timeout-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v1.args | 3 +- .../qemuxml2argv-restore-v2-fd.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v2.args | 3 +- .../qemuxml2argv-s390-piix-controllers.args | 2 +- .../qemuxml2argv-s390-usb-none.args | 2 +- .../qemuxml2argv-seclabel-dynamic-baselabel.args | 3 +- .../qemuxml2argv-seclabel-dynamic-labelskip.args | 3 +- .../qemuxml2argv-seclabel-dynamic-override.args | 3 +- .../qemuxml2argv-seclabel-dynamic.args | 3 +- .../qemuxml2argv-seclabel-none.args | 3 +- .../qemuxml2argv-seclabel-static-labelskip.args | 3 +- .../qemuxml2argv-seclabel-static-relabel.args | 3 +- .../qemuxml2argv-seclabel-static.args | 3 +- .../qemuxml2argv-serial-dev-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-dev.args | 3 +- .../qemuxml2argv-serial-file-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-file.args | 3 +- .../qemuxml2argv-serial-many-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-many.args | 3 +- .../qemuxml2argv-serial-pty-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-pty.args | 3 +- .../qemuxml2argv-serial-tcp-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-tcp.args | 3 +- .../qemuxml2argv-serial-udp-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-udp.args | 3 +- .../qemuxml2argv-serial-unix-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-unix.args | 3 +- .../qemuxml2argv-serial-vc-chardev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-serial-vc.args | 3 +- .../qemuxml2argv-smartcard-controller.args | 3 +- .../qemuxml2argv-smartcard-host-certificates.args | 3 +- .../qemuxml2argv-smartcard-host.args | 3 +- ...emuxml2argv-smartcard-passthrough-spicevmc.args | 3 +- .../qemuxml2argv-smartcard-passthrough-tcp.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smbios.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 3 +- .../qemuxml2argv-sound-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-sound.args | 3 +- .../qemuxml2argv-tpm-passthrough.args | 2 +- .../qemuxml2argv-usb-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-hub.args | 3 +- .../qemuxml2argv-usb-ich9-companion.args | 3 +- .../qemuxml2argv-usb-ich9-ehci-addr.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 3 +- .../qemuxml2argv-usb-piix3-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args | 3 +- .../qemuxml2argv-usb-redir-boot.args | 3 +- .../qemuxml2argv-usb-redir-filter.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-virtio-lun.args | 2 +- .../qemuxml2argv-virtio-rng-ccw.args | 3 +- .../qemuxml2argv-virtio-rng-default.args | 3 +- .../qemuxml2argv-virtio-rng-egd.args | 3 +- .../qemuxml2argv-virtio-rng-random.args | 3 +- .../qemuxml2argv-watchdog-device.args | 3 +- .../qemuxml2argv-watchdog-dump.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-watchdog.args | 3 +- tests/qemuxml2argvtest.c | 10 ++ .../qemuxmlns-qemu-ns-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-commandline-ns1.args | 2 +- .../qemuxmlns-qemu-ns-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain.args | 2 +- tests/testutilsqemu.c | 33 ++++++ 314 files changed, 948 insertions(+), 350 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml
I've pushed this series now. Thanks, Cole

On Fri, Aug 30, 2013 at 12:41:28PM -0400, Cole Robinson wrote:
This series adds the bits needed to kick of a qemu-system-arm -machine vexpress-a9 guest. vexpress-a15 likely works as well but is untested.
Patches 1-2 are related bugfixes/improvements.
Did patch 1/8 get eaten somewhere? I can't find it in my local mbox or in the mail archives: http://www.redhat.com/archives/libvir-list/2013-August/msg01627.html Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW

On Sun, Sep 08, 2013 at 10:15:05PM +0100, Richard W.M. Jones wrote:
On Fri, Aug 30, 2013 at 12:41:28PM -0400, Cole Robinson wrote:
This series adds the bits needed to kick of a qemu-system-arm -machine vexpress-a9 guest. vexpress-a15 likely works as well but is untested.
Patches 1-2 are related bugfixes/improvements.
Did patch 1/8 get eaten somewhere? I can't find it in my local mbox or in the mail archives:
http://www.redhat.com/archives/libvir-list/2013-August/msg01627.html
Don't worry, found it here: http://www.redhat.com/archives/libvir-list/2013-August/msg01636.html Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org

I tried this patchset and it works at least as far as being able to get the libguestfs appliance up and running on ARM (with KVM) using the libvirt backend. Virtio-scsi & virtio-serial work. Some issues however: - Why is arch="armv7l"? Why not just "arm", or "armv7hl"? - I had to force the <emulator> to be /usr/bin/qemu-system-arm. Otherwise libvirt tries to run /usr/bin/qemu-kvm. May be related to RHBZ#1005581. https://github.com/libguestfs/libguestfs/commit/37e1e0da5acb34c902d55cde13c5... https://bugzilla.redhat.com/show_bug.cgi?id=1005581 - I had to add -machine kernel_irqchip=off (for KVM): https://github.com/libguestfs/libguestfs/commit/f8d89bc42fbd930c61e4f6a81d9a... http://www.mail-archive.com/arm@lists.fedoraproject.org/msg05546.html - Setting <cpu mode="host-model"/> confuses libvirt completely. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#)

On Mon, Sep 09, 2013 at 09:09:56AM +0100, Richard W.M. Jones wrote:
I tried this patchset and it works at least as far as being able to get the libguestfs appliance up and running on ARM (with KVM) using the libvirt backend. Virtio-scsi & virtio-serial work.
Some issues however:
- Why is arch="armv7l"? Why not just "arm", or "armv7hl"?
The kernel reported uname is 'armv7l', so libvirt matches that. IIUC 'armv7hl' is an RPM invention to show that the armv7l binaries were compiled with hard floating point impl. 'arm' alone is too generic - there are ABI incompatible versions armv5, armv6 which we need to distinguish, as well as big-endian v7 (eg armv7b).
- I had to force the <emulator> to be /usr/bin/qemu-system-arm. Otherwise libvirt tries to run /usr/bin/qemu-kvm. May be related to RHBZ#1005581. https://github.com/libguestfs/libguestfs/commit/37e1e0da5acb34c902d55cde13c5... https://bugzilla.redhat.com/show_bug.cgi?id=1005581
If it exists, /usr/bin/qemu-kvm should always point to the qemu-system-NNN which matches the host arch. So if it is pointing to the x86 emulator that is broken Fedora packaging
- I had to add -machine kernel_irqchip=off (for KVM): https://github.com/libguestfs/libguestfs/commit/f8d89bc42fbd930c61e4f6a81d9a... http://www.mail-archive.com/arm@lists.fedoraproject.org/msg05546.html
I'd say that's something for QEMU / KVM guys to fix. If the kernel IRQ chip is known broken for ARM, QEMU shouldn't be trying to use it.
- Setting <cpu mode="host-model"/> confuses libvirt completely.
Yeah, CPU model stuff for non-x86 seems somewhat problematic in my experiance. 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 Mon, Sep 09, 2013 at 10:28:39AM +0100, Daniel P. Berrange wrote:
On Mon, Sep 09, 2013 at 09:09:56AM +0100, Richard W.M. Jones wrote:
I tried this patchset and it works at least as far as being able to get the libguestfs appliance up and running on ARM (with KVM) using the libvirt backend. Virtio-scsi & virtio-serial work.
Some issues however:
- Why is arch="armv7l"? Why not just "arm", or "armv7hl"?
The kernel reported uname is 'armv7l', so libvirt matches that.
IIUC 'armv7hl' is an RPM invention to show that the armv7l binaries were compiled with hard floating point impl.
'arm' alone is too generic - there are ABI incompatible versions armv5, armv6 which we need to distinguish, as well as big-endian v7 (eg armv7b).
- I had to force the <emulator> to be /usr/bin/qemu-system-arm. Otherwise libvirt tries to run /usr/bin/qemu-kvm. May be related to RHBZ#1005581. https://github.com/libguestfs/libguestfs/commit/37e1e0da5acb34c902d55cde13c5... https://bugzilla.redhat.com/show_bug.cgi?id=1005581
If it exists, /usr/bin/qemu-kvm should always point to the qemu-system-NNN which matches the host arch. So if it is pointing to the x86 emulator that is broken Fedora packaging
- I had to add -machine kernel_irqchip=off (for KVM): https://github.com/libguestfs/libguestfs/commit/f8d89bc42fbd930c61e4f6a81d9a... http://www.mail-archive.com/arm@lists.fedoraproject.org/msg05546.html
I'd say that's something for QEMU / KVM guys to fix. If the kernel IRQ chip is known broken for ARM, QEMU shouldn't be trying to use it.
- Setting <cpu mode="host-model"/> confuses libvirt completely.
Yeah, CPU model stuff for non-x86 seems somewhat problematic in my experiance.
One more: - Hotplugging (adding a virtio-scsi disk) doesn't work on ARM: could not attach disk to libvirt domain: internal error: SCSI controller 0 was missing its PCI address [code=1 domain=10] at /home/rjones/d/libguestfs/tests/hotplug/test-hot-add.pl line 50. The libvirt XML fragment we're trying to add is approximately this one (I can get the precise one if you need it): <disk device="disk" type="file"> <source file="..."/> <target dev="sda" bus="scsi"/> <driver name="qemu" type="raw" cache="unsafe"/> <address type="drive" controller="0" bus="0" target="0" unit="0"/> </disk> The controller (which is not part of the XML fragment of course, but was part of the original domain) is: <controller type="scsi" index="0" model="virtio-scsi"/> Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org

On Mon, Sep 09, 2013 at 11:59:25AM +0100, Richard W.M. Jones wrote:
On Mon, Sep 09, 2013 at 10:28:39AM +0100, Daniel P. Berrange wrote:
On Mon, Sep 09, 2013 at 09:09:56AM +0100, Richard W.M. Jones wrote:
I tried this patchset and it works at least as far as being able to get the libguestfs appliance up and running on ARM (with KVM) using the libvirt backend. Virtio-scsi & virtio-serial work.
Some issues however:
- Why is arch="armv7l"? Why not just "arm", or "armv7hl"?
The kernel reported uname is 'armv7l', so libvirt matches that.
IIUC 'armv7hl' is an RPM invention to show that the armv7l binaries were compiled with hard floating point impl.
'arm' alone is too generic - there are ABI incompatible versions armv5, armv6 which we need to distinguish, as well as big-endian v7 (eg armv7b).
- I had to force the <emulator> to be /usr/bin/qemu-system-arm. Otherwise libvirt tries to run /usr/bin/qemu-kvm. May be related to RHBZ#1005581. https://github.com/libguestfs/libguestfs/commit/37e1e0da5acb34c902d55cde13c5... https://bugzilla.redhat.com/show_bug.cgi?id=1005581
If it exists, /usr/bin/qemu-kvm should always point to the qemu-system-NNN which matches the host arch. So if it is pointing to the x86 emulator that is broken Fedora packaging
- I had to add -machine kernel_irqchip=off (for KVM): https://github.com/libguestfs/libguestfs/commit/f8d89bc42fbd930c61e4f6a81d9a... http://www.mail-archive.com/arm@lists.fedoraproject.org/msg05546.html
I'd say that's something for QEMU / KVM guys to fix. If the kernel IRQ chip is known broken for ARM, QEMU shouldn't be trying to use it.
- Setting <cpu mode="host-model"/> confuses libvirt completely.
Yeah, CPU model stuff for non-x86 seems somewhat problematic in my experiance.
One more:
- Hotplugging (adding a virtio-scsi disk) doesn't work on ARM:
could not attach disk to libvirt domain: internal error: SCSI controller 0 was missing its PCI address [code=1 domain=10] at /home/rjones/d/libguestfs/tests/hotplug/test-hot-add.pl line 50.
Sounds like something is mistakenly assuming PCI here. Please file a bug for this one against libvirt. 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 Mon, Sep 09, 2013 at 12:02:37PM +0100, Daniel P. Berrange wrote:
On Mon, Sep 09, 2013 at 11:59:25AM +0100, Richard W.M. Jones wrote:
- Hotplugging (adding a virtio-scsi disk) doesn't work on ARM:
could not attach disk to libvirt domain: internal error: SCSI controller 0 was missing its PCI address [code=1 domain=10] at /home/rjones/d/libguestfs/tests/hotplug/test-hot-add.pl line 50.
Sounds like something is mistakenly assuming PCI here. Please file a bug for this one against libvirt.
https://bugzilla.redhat.com/show_bug.cgi?id=1005768 Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
participants (4)
-
Cole Robinson
-
Daniel P. Berrange
-
Eric Blake
-
Richard W.M. Jones