Merge lp:~qrilka/ubuntu/precise/libvirt/libvirt-fix-1092826 into lp:ubuntu/precise/libvirt

Proposed by Kirill Zaborsky
Status: Work in progress
Proposed branch: lp:~qrilka/ubuntu/precise/libvirt/libvirt-fix-1092826
Merge into: lp:ubuntu/precise/libvirt
Diff against target: 20791 lines (+20549/-6)
28 files modified
.pc/.quilt_patches (+1/-0)
.pc/.quilt_series (+1/-0)
.pc/applied-patches (+2/-0)
.pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu/qemu_command.c (+7527/-0)
.pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu/qemu_driver.c (+11642/-0)
.pc/ubuntu/storage-fix-a-potential-crash-when-creating-vol-object/src/storage/storage_backend_logical.c (+827/-0)
debian/README.Debian (+20/-0)
debian/apparmor/libvirt-qemu (+3/-0)
debian/apparmor/usr.sbin.libvirtd (+1/-0)
debian/changelog (+48/-0)
debian/control (+1/-1)
debian/libvirt-bin.apport (+1/-1)
debian/libvirt-bin.dirs (+1/-0)
debian/libvirt-bin.dnsmasq (+4/-0)
debian/libvirt-bin.install (+2/-1)
debian/libvirt-bin.manpages (+1/-0)
debian/libvirt-bin.postinst (+3/-0)
debian/libvirt-bin.postrm (+4/-0)
debian/libvirt-migrate-qemu-machinetype (+196/-0)
debian/libvirt-migrate-qemu-machinetype.1 (+78/-0)
debian/patches/fix-poll.patch (+77/-0)
debian/patches/series (+3/-0)
debian/patches/ubuntu/qemu-warn-on-pc-0.12.patch (+44/-0)
debian/patches/ubuntu/storage-fix-a-potential-crash-when-creating-vol-object (+38/-0)
debian/rules (+6/-1)
src/qemu/qemu_command.c (+7/-1)
src/qemu/qemu_driver.c (+8/-0)
src/storage/storage_backend_logical.c (+3/-1)
To merge this branch: bzr merge lp:~qrilka/ubuntu/precise/libvirt/libvirt-fix-1092826
Reviewer Review Type Date Requested Status
Jamie Strandboge Needs Fixing
Ubuntu branches Pending
Review via email: mp+141163@code.launchpad.net

Description of the change

Fix for LP: #1092826

To post a comment you must log in.
Revision history for this message
Jamie Strandboge (jdstrand) wrote :

Thanks for your patch! Unfortunately it cannot be incorporated into Ubuntu in its current state:
 * debian/patches/fix-poll.patch does not include DEP-3 comments
 * debian/changelog should reference precise-proposed, not precise
 * the patch does not apply cleanly to 0.9.8-2ubuntu17.5, the version that is currently in precise

Please feel free to make these changes and resubmit. Thanks!

review: Needs Fixing
Revision history for this message
Jamie Strandboge (jdstrand) wrote :

Also:
 * the version '0.9.8-2ubuntu17.4ppa1' is incorrect. It should be 0.9.8-2ubuntu17.6 since 0.9.8-2ubuntu17.5 is currently in precise-updates.

Unmerged revisions

211. By Kirill Zaborsky

adds proper handling for EINTR signal (LP: #1092826)

210. By Serge Hallyn

* storage-fix-a-potential-crash-when-creating-vol-object: avoid a crash
  on bad free() on error lvm storage. (LP: #1035320)
* add pm-utils as suggests to avoid log spamming with messages about
  pm-is-supported not being found. (LP: #994476)

209. By Serge Hallyn

debian/apparmor/libvirt-qemu: add ceph.conf (LP: #1026404)

208. By Serge Hallyn

* debian/libvirt-bin.install, debian/rules: name the apport file
  source_libvirt.py, not source_libvirt-bin.py. (LP: #1007405)
* install /etc/dnsmasq.d/libvirt to configure system wide dnsmasq to not
  listen on the libvirt bridge. (Following Stéphane's lxc example)
  (LP: #928524) (LP: #231060)
  - postinst: restart dnsmasq; postrm: remove dnsmasq.d/libvirt file and
    restart dnsmasq; rules, libvirt-bin.dirs and libvirt-bin.install:
    install new debian/libvirt-bin.dnsmasq file.
* Warn user about bad pc-0.12 machine type, and help user transition.
  (LP: #1001625)
  - qemu-warn-on-pc-0.12.patch: When defining or starting a VM which uses the
    pc-0.12 machine type, warn in libvirtd.log.
  - debian/libvirt-migrate-qemu-machinetype: automatically migrate QEMU VMs
    to newest machine type. This is not done automatically as there will
    be some users who have good reason to stay with pc-0.12.

207. By Serge Hallyn

debian/apparmor/usr.sbin.libvirtd: allow execution of /lib/udev/scsi_id
(LP: #992378)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file '.pc/.quilt_patches'
--- .pc/.quilt_patches 1970-01-01 00:00:00 +0000
+++ .pc/.quilt_patches 2012-12-22 20:09:19 +0000
@@ -0,0 +1,1 @@
1debian/patches
02
=== added file '.pc/.quilt_series'
--- .pc/.quilt_series 1970-01-01 00:00:00 +0000
+++ .pc/.quilt_series 2012-12-22 20:09:19 +0000
@@ -0,0 +1,1 @@
1series
02
=== modified file '.pc/applied-patches'
--- .pc/applied-patches 2012-04-05 11:43:15 +0000
+++ .pc/applied-patches 2012-12-22 20:09:19 +0000
@@ -34,3 +34,5 @@
34ubuntu/9024-qemu-allow-snapshotting-of-sheepdog-and-rbd-disks.patch34ubuntu/9024-qemu-allow-snapshotting-of-sheepdog-and-rbd-disks.patch
35ubuntu/9025-qemu-change-rbd-auth_supported-separation-character-.patch35ubuntu/9025-qemu-change-rbd-auth_supported-separation-character-.patch
36ubuntu/xen-config-no-vfb-for-hvm.patch36ubuntu/xen-config-no-vfb-for-hvm.patch
37ubuntu/qemu-warn-on-pc-0.12.patch
38ubuntu/storage-fix-a-potential-crash-when-creating-vol-object
3739
=== added directory '.pc/ubuntu/qemu-warn-on-pc-0.12.patch'
=== added directory '.pc/ubuntu/qemu-warn-on-pc-0.12.patch/src'
=== added directory '.pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu'
=== added file '.pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu/qemu_command.c'
--- .pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu/qemu_command.c 1970-01-01 00:00:00 +0000
+++ .pc/ubuntu/qemu-warn-on-pc-0.12.patch/src/qemu/qemu_command.c 2012-12-22 20:09:19 +0000
@@ -0,0 +1,7527 @@
1/*
2 * qemu_command.c: QEMU command generation
3 *
4 * Copyright (C) 2006-2011 Red Hat, Inc.
5 * Copyright (C) 2006 Daniel P. Berrange
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 * Author: Daniel P. Berrange <berrange@redhat.com>
22 */
23
24#include <config.h>
25
26#include "qemu_command.h"
27#include "qemu_capabilities.h"
28#include "qemu_bridge_filter.h"
29#include "cpu/cpu.h"
30#include "memory.h"
31#include "logging.h"
32#include "virterror_internal.h"
33#include "util.h"
34#include "virfile.h"
35#include "uuid.h"
36#include "c-ctype.h"
37#include "domain_nwfilter.h"
38#include "domain_audit.h"
39#include "domain_conf.h"
40#include "network/bridge_driver.h"
41#include "virnetdevtap.h"
42#include "base64.h"
43
44#include <sys/utsname.h>
45#include <sys/stat.h>
46#include <fcntl.h>
47
48#define VIR_FROM_THIS VIR_FROM_QEMU
49
50
51VIR_ENUM_DECL(virDomainDiskQEMUBus)
52VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
53 "ide",
54 "floppy",
55 "scsi",
56 "virtio",
57 "xen",
58 "usb",
59 "uml",
60 "sata")
61
62
63VIR_ENUM_DECL(qemuDiskCacheV1)
64VIR_ENUM_DECL(qemuDiskCacheV2)
65
66VIR_ENUM_IMPL(qemuDiskCacheV1, VIR_DOMAIN_DISK_CACHE_LAST,
67 "default",
68 "off",
69 "off", /* writethrough not supported, so for safety, disable */
70 "on", /* Old 'on' was equivalent to 'writeback' */
71 "off", /* directsync not supported, for safety, disable */
72 "off"); /* unsafe not supported, for safety, disable */
73
74VIR_ENUM_IMPL(qemuDiskCacheV2, VIR_DOMAIN_DISK_CACHE_LAST,
75 "default",
76 "none",
77 "writethrough",
78 "writeback",
79 "directsync",
80 "unsafe");
81
82VIR_ENUM_DECL(qemuVideo)
83
84VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
85 "std",
86 "cirrus",
87 "vmware",
88 "", /* no arg needed for xen */
89 "", /* don't support vbox */
90 "qxl");
91
92VIR_ENUM_DECL(qemuControllerModelUSB)
93
94VIR_ENUM_IMPL(qemuControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
95 "piix3-usb-uhci",
96 "piix4-usb-uhci",
97 "usb-ehci",
98 "ich9-usb-ehci1",
99 "ich9-usb-uhci1",
100 "ich9-usb-uhci2",
101 "ich9-usb-uhci3",
102 "vt82c686b-usb-uhci",
103 "pci-ohci");
104
105VIR_ENUM_DECL(qemuDomainFSDriver)
106VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
107 "local",
108 "local",
109 "handle");
110
111
112static void
113uname_normalize (struct utsname *ut)
114{
115 uname(ut);
116
117 /* Map i386, i486, i586 to i686. */
118 if (ut->machine[0] == 'i' &&
119 ut->machine[1] != '\0' &&
120 ut->machine[2] == '8' &&
121 ut->machine[3] == '6' &&
122 ut->machine[4] == '\0')
123 ut->machine[1] = '6';
124}
125
126
127/**
128 * qemuPhysIfaceConnect:
129 * @def: the definition of the VM (needed by 802.1Qbh and audit)
130 * @driver: pointer to the qemud_driver
131 * @net: pointer to he VM's interface description with direct device type
132 * @qemuCaps: flags for qemu
133 * @vmop: VM operation type
134 *
135 * Returns a filedescriptor on success or -1 in case of error.
136 */
137int
138qemuPhysIfaceConnect(virDomainDefPtr def,
139 struct qemud_driver *driver,
140 virDomainNetDefPtr net,
141 virBitmapPtr qemuCaps,
142 enum virNetDevVPortProfileOp vmop)
143{
144 int rc;
145 char *res_ifname = NULL;
146 int vnet_hdr = 0;
147
148 if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNET_HDR) &&
149 net->model && STREQ(net->model, "virtio"))
150 vnet_hdr = 1;
151
152 rc = virNetDevMacVLanCreateWithVPortProfile(
153 net->ifname, net->mac,
154 virDomainNetGetActualDirectDev(net),
155 virDomainNetGetActualDirectMode(net),
156 true, vnet_hdr, def->uuid,
157 virDomainNetGetActualDirectVirtPortProfile(net),
158 &res_ifname,
159 vmop, driver->stateDir,
160 virDomainNetGetActualBandwidth(net));
161 if (rc >= 0) {
162 virDomainAuditNetDevice(def, net, res_ifname, true);
163 VIR_FREE(net->ifname);
164 net->ifname = res_ifname;
165 }
166
167 return rc;
168}
169
170
171int
172qemuNetworkIfaceConnect(virDomainDefPtr def,
173 virConnectPtr conn,
174 struct qemud_driver *driver,
175 virDomainNetDefPtr net,
176 virBitmapPtr qemuCaps)
177{
178 char *brname = NULL;
179 int err;
180 int tapfd = -1;
181 int vnet_hdr = 0;
182 bool template_ifname = false;
183 unsigned char tapmac[VIR_MAC_BUFLEN];
184 int actualType = virDomainNetGetActualType(net);
185
186 if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
187 int active, fail = 0;
188 virErrorPtr errobj;
189 virNetworkPtr network = virNetworkLookupByName(conn,
190 net->data.network.name);
191 if (!network)
192 return -1;
193
194 active = virNetworkIsActive(network);
195 if (active != 1) {
196 fail = 1;
197
198 if (active == 0)
199 qemuReportError(VIR_ERR_INTERNAL_ERROR,
200 _("Network '%s' is not active."),
201 net->data.network.name);
202 }
203
204 if (!fail) {
205 brname = virNetworkGetBridgeName(network);
206 if (brname == NULL)
207 fail = 1;
208 }
209
210 /* Make sure any above failure is preserved */
211 errobj = virSaveLastError();
212 virNetworkFree(network);
213 virSetError(errobj);
214 virFreeError(errobj);
215
216 if (fail)
217 return -1;
218
219 } else if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
220 if (!(brname = strdup(virDomainNetGetActualBridgeName(net)))) {
221 virReportOOMError();
222 return -1;
223 }
224 } else {
225 qemuReportError(VIR_ERR_INTERNAL_ERROR,
226 _("Network type %d is not supported"),
227 virDomainNetGetActualType(net));
228 return -1;
229 }
230
231 if (!net->ifname ||
232 STRPREFIX(net->ifname, VIR_NET_GENERATED_PREFIX) ||
233 strchr(net->ifname, '%')) {
234 VIR_FREE(net->ifname);
235 if (!(net->ifname = strdup(VIR_NET_GENERATED_PREFIX "%d"))) {
236 virReportOOMError();
237 goto cleanup;
238 }
239 /* avoid exposing vnet%d in getXMLDesc or error outputs */
240 template_ifname = true;
241 }
242
243 if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNET_HDR) &&
244 net->model && STREQ(net->model, "virtio"))
245 vnet_hdr = 1;
246
247 memcpy(tapmac, net->mac, VIR_MAC_BUFLEN);
248 tapmac[0] = 0xFE; /* Discourage bridge from using TAP dev MAC */
249 err = virNetDevTapCreateInBridgePort(brname, &net->ifname, tapmac,
250 vnet_hdr, true, &tapfd);
251 virDomainAuditNetDevice(def, net, "/dev/net/tun", tapfd >= 0);
252 if (err < 0) {
253 if (template_ifname)
254 VIR_FREE(net->ifname);
255 tapfd = -1;
256 }
257
258 if (driver->macFilter) {
259 if ((err = networkAllowMacOnPort(driver, net->ifname, net->mac))) {
260 virReportSystemError(err,
261 _("failed to add ebtables rule to allow MAC address on '%s'"),
262 net->ifname);
263 }
264 }
265
266 if (tapfd >= 0 &&
267 virNetDevBandwidthSet(net->ifname,
268 virDomainNetGetActualBandwidth(net)) < 0) {
269 qemuReportError(VIR_ERR_INTERNAL_ERROR,
270 _("cannot set bandwidth limits on %s"),
271 net->ifname);
272 VIR_FORCE_CLOSE(tapfd);
273 goto cleanup;
274 }
275
276 if (tapfd >= 0) {
277 if ((net->filter) && (net->ifname)) {
278 err = virDomainConfNWFilterInstantiate(conn, net);
279 if (err)
280 VIR_FORCE_CLOSE(tapfd);
281 }
282 }
283
284cleanup:
285 VIR_FREE(brname);
286
287 return tapfd;
288}
289
290
291int
292qemuOpenVhostNet(virDomainDefPtr def,
293 virDomainNetDefPtr net,
294 virBitmapPtr qemuCaps,
295 int *vhostfd)
296{
297 *vhostfd = -1; /* assume we won't use vhost */
298
299 /* If the config says explicitly to not use vhost, return now */
300 if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
301 return 0;
302 }
303
304 /* If qemu doesn't support vhost-net mode (including the -netdev command
305 * option), don't try to open the device.
306 */
307 if (!(qemuCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
308 qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
309 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
310 if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
311 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
312 "%s", _("vhost-net is not supported with "
313 "this QEMU binary"));
314 return -1;
315 }
316 return 0;
317 }
318
319 /* If the nic model isn't virtio, don't try to open. */
320 if (!(net->model && STREQ(net->model, "virtio"))) {
321 if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
322 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
323 "%s", _("vhost-net is only supported for "
324 "virtio network interfaces"));
325 return -1;
326 }
327 return 0;
328 }
329
330 *vhostfd = open("/dev/vhost-net", O_RDWR);
331 virDomainAuditNetDevice(def, net, "/dev/vhost-net", *vhostfd >= 0);
332
333 /* If the config says explicitly to use vhost and we couldn't open it,
334 * report an error.
335 */
336 if ((*vhostfd < 0) &&
337 (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST)) {
338 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
339 "%s", _("vhost-net was requested for an interface, "
340 "but is unavailable"));
341 return -1;
342 }
343 return 0;
344}
345
346
347static int qemuDomainDeviceAliasIndex(virDomainDeviceInfoPtr info,
348 const char *prefix)
349{
350 int idx;
351
352 if (!info->alias)
353 return -1;
354 if (!STRPREFIX(info->alias, prefix))
355 return -1;
356
357 if (virStrToLong_i(info->alias + strlen(prefix), NULL, 10, &idx) < 0)
358 return -1;
359
360 return idx;
361}
362
363
364int qemuDomainNetVLAN(virDomainNetDefPtr def)
365{
366 return qemuDomainDeviceAliasIndex(&def->info, "net");
367}
368
369
370/* Names used before -drive existed */
371static int qemuAssignDeviceDiskAliasLegacy(virDomainDiskDefPtr disk)
372{
373 char *dev_name;
374
375 if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
376 STREQ(disk->dst, "hdc"))
377 dev_name = strdup("cdrom");
378 else
379 dev_name = strdup(disk->dst);
380
381 if (!dev_name) {
382 virReportOOMError();
383 return -1;
384 }
385
386 disk->info.alias = dev_name;
387 return 0;
388}
389
390
391char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
392 virBitmapPtr qemuCaps)
393{
394 char *ret;
395
396 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
397 if (virAsprintf(&ret, "%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0) {
398 virReportOOMError();
399 return NULL;
400 }
401 } else {
402 if (!(ret = strdup(disk->info.alias))) {
403 virReportOOMError();
404 return NULL;
405 }
406 }
407 return ret;
408}
409
410
411/* Names used before -drive supported the id= option */
412static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk)
413{
414 int busid, devid;
415 int ret;
416 char *dev_name;
417
418 if (virDiskNameToBusDeviceIndex(disk, &busid, &devid) < 0) {
419 qemuReportError(VIR_ERR_INTERNAL_ERROR,
420 _("cannot convert disk '%s' to bus/device index"),
421 disk->dst);
422 return -1;
423 }
424
425 switch (disk->bus) {
426 case VIR_DOMAIN_DISK_BUS_IDE:
427 if (disk->device== VIR_DOMAIN_DISK_DEVICE_DISK)
428 ret = virAsprintf(&dev_name, "ide%d-hd%d", busid, devid);
429 else
430 ret = virAsprintf(&dev_name, "ide%d-cd%d", busid, devid);
431 break;
432 case VIR_DOMAIN_DISK_BUS_SCSI:
433 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
434 ret = virAsprintf(&dev_name, "scsi%d-hd%d", busid, devid);
435 else
436 ret = virAsprintf(&dev_name, "scsi%d-cd%d", busid, devid);
437 break;
438 case VIR_DOMAIN_DISK_BUS_FDC:
439 ret = virAsprintf(&dev_name, "floppy%d", devid);
440 break;
441 case VIR_DOMAIN_DISK_BUS_VIRTIO:
442 ret = virAsprintf(&dev_name, "virtio%d", devid);
443 break;
444 case VIR_DOMAIN_DISK_BUS_XEN:
445 ret = virAsprintf(&dev_name, "xenblk%d", devid);
446 break;
447 default:
448 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
449 _("Unsupported disk name mapping for bus '%s'"),
450 virDomainDiskBusTypeToString(disk->bus));
451 return -1;
452 }
453
454 if (ret == -1) {
455 virReportOOMError();
456 return -1;
457 }
458
459 disk->info.alias = dev_name;
460
461 return 0;
462}
463
464
465/* Our custom -drive naming scheme used with id= */
466static int qemuAssignDeviceDiskAliasCustom(virDomainDiskDefPtr disk)
467{
468 const char *prefix = virDomainDiskBusTypeToString(disk->bus);
469 if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
470 if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix,
471 disk->info.addr.drive.controller,
472 disk->info.addr.drive.bus,
473 disk->info.addr.drive.unit) < 0)
474 goto no_memory;
475 } else {
476 int idx = virDiskNameToIndex(disk->dst);
477 if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0)
478 goto no_memory;
479 }
480
481 return 0;
482
483no_memory:
484 virReportOOMError();
485 return -1;
486}
487
488
489int
490qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, virBitmapPtr qemuCaps)
491{
492 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE)) {
493 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
494 return qemuAssignDeviceDiskAliasCustom(def);
495 else
496 return qemuAssignDeviceDiskAliasFixed(def);
497 } else {
498 return qemuAssignDeviceDiskAliasLegacy(def);
499 }
500}
501
502
503int
504qemuAssignDeviceNetAlias(virDomainDefPtr def, virDomainNetDefPtr net, int idx)
505{
506 if (idx == -1) {
507 int i;
508 idx = 0;
509 for (i = 0 ; i < def->nnets ; i++) {
510 int thisidx;
511 if ((thisidx = qemuDomainDeviceAliasIndex(&def->nets[i]->info, "net")) < 0) {
512 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
513 _("Unable to determine device index for network device"));
514 return -1;
515 }
516 if (thisidx >= idx)
517 idx = thisidx + 1;
518 }
519 }
520
521 if (virAsprintf(&net->info.alias, "net%d", idx) < 0) {
522 virReportOOMError();
523 return -1;
524 }
525
526 return 0;
527}
528
529
530int
531qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr hostdev, int idx)
532{
533 if (idx == -1) {
534 int i;
535 idx = 0;
536 for (i = 0 ; i < def->nhostdevs ; i++) {
537 int thisidx;
538 if ((thisidx = qemuDomainDeviceAliasIndex(&def->hostdevs[i]->info, "hostdev")) < 0) {
539 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
540 _("Unable to determine device index for hostdev device"));
541 return -1;
542 }
543 if (thisidx >= idx)
544 idx = thisidx + 1;
545 }
546 }
547
548 if (virAsprintf(&hostdev->info.alias, "hostdev%d", idx) < 0) {
549 virReportOOMError();
550 return -1;
551 }
552
553 return 0;
554}
555
556
557int
558qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, virDomainRedirdevDefPtr redirdev, int idx)
559{
560 if (idx == -1) {
561 int i;
562 idx = 0;
563 for (i = 0 ; i < def->nredirdevs ; i++) {
564 int thisidx;
565 if ((thisidx = qemuDomainDeviceAliasIndex(&def->redirdevs[i]->info, "redir")) < 0) {
566 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
567 _("Unable to determine device index for redirected device"));
568 return -1;
569 }
570 if (thisidx >= idx)
571 idx = thisidx + 1;
572 }
573 }
574
575 if (virAsprintf(&redirdev->info.alias, "redir%d", idx) < 0) {
576 virReportOOMError();
577 return -1;
578 }
579
580 return 0;
581}
582
583
584int
585qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller)
586{
587 const char *prefix = virDomainControllerTypeToString(controller->type);
588
589 if (virAsprintf(&controller->info.alias, "%s%d", prefix,
590 controller->idx) < 0) {
591 virReportOOMError();
592 return -1;
593 }
594
595 return 0;
596}
597
598
599int
600qemuAssignDeviceAliases(virDomainDefPtr def, virBitmapPtr qemuCaps)
601{
602 int i;
603
604 for (i = 0; i < def->ndisks ; i++) {
605 if (qemuAssignDeviceDiskAlias(def->disks[i], qemuCaps) < 0)
606 return -1;
607 }
608 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NET_NAME) ||
609 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
610 for (i = 0; i < def->nnets ; i++) {
611 if (qemuAssignDeviceNetAlias(def, def->nets[i], i) < 0)
612 return -1;
613 }
614 }
615
616 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
617 return 0;
618
619 for (i = 0; i < def->nfss ; i++) {
620 if (virAsprintf(&def->fss[i]->info.alias, "fs%d", i) < 0)
621 goto no_memory;
622 }
623 for (i = 0; i < def->nsounds ; i++) {
624 if (virAsprintf(&def->sounds[i]->info.alias, "sound%d", i) < 0)
625 goto no_memory;
626 }
627 for (i = 0; i < def->nhostdevs ; i++) {
628 if (qemuAssignDeviceHostdevAlias(def, def->hostdevs[i], i) < 0)
629 return -1;
630 }
631 for (i = 0; i < def->nredirdevs ; i++) {
632 if (qemuAssignDeviceRedirdevAlias(def, def->redirdevs[i], i) < 0)
633 return -1;
634 }
635 for (i = 0; i < def->nvideos ; i++) {
636 if (virAsprintf(&def->videos[i]->info.alias, "video%d", i) < 0)
637 goto no_memory;
638 }
639 for (i = 0; i < def->ncontrollers ; i++) {
640 if (qemuAssignDeviceControllerAlias(def->controllers[i]) < 0)
641 return -1;
642 }
643 for (i = 0; i < def->ninputs ; i++) {
644 if (virAsprintf(&def->inputs[i]->info.alias, "input%d", i) < 0)
645 goto no_memory;
646 }
647 for (i = 0; i < def->nparallels ; i++) {
648 if (virAsprintf(&def->parallels[i]->info.alias, "parallel%d", i) < 0)
649 goto no_memory;
650 }
651 for (i = 0; i < def->nserials ; i++) {
652 if (virAsprintf(&def->serials[i]->info.alias, "serial%d", i) < 0)
653 goto no_memory;
654 }
655 for (i = 0; i < def->nchannels ; i++) {
656 if (virAsprintf(&def->channels[i]->info.alias, "channel%d", i) < 0)
657 goto no_memory;
658 }
659 for (i = 0; i < def->nconsoles ; i++) {
660 if (virAsprintf(&def->consoles[i]->info.alias, "console%d", i) < 0)
661 goto no_memory;
662 }
663 for (i = 0; i < def->nhubs ; i++) {
664 if (virAsprintf(&def->hubs[i]->info.alias, "hub%d", i) < 0)
665 goto no_memory;
666 }
667 for (i = 0; i < def->nsmartcards ; i++) {
668 if (virAsprintf(&def->smartcards[i]->info.alias, "smartcard%d", i) < 0)
669 goto no_memory;
670 }
671 if (def->watchdog) {
672 if (virAsprintf(&def->watchdog->info.alias, "watchdog%d", 0) < 0)
673 goto no_memory;
674 }
675 if (def->memballoon) {
676 if (virAsprintf(&def->memballoon->info.alias, "balloon%d", 0) < 0)
677 goto no_memory;
678 }
679
680 return 0;
681
682 no_memory:
683 virReportOOMError();
684 return -1;
685}
686
687
688#define QEMU_PCI_ADDRESS_LAST_SLOT 31
689#define QEMU_PCI_ADDRESS_LAST_FUNCTION 8
690struct _qemuDomainPCIAddressSet {
691 virHashTablePtr used;
692 int nextslot;
693};
694
695
696static char *qemuPCIAddressAsString(virDomainDeviceInfoPtr dev)
697{
698 char *addr;
699
700 if (dev->addr.pci.domain != 0 ||
701 dev->addr.pci.bus != 0) {
702 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
703 _("Only PCI domain 0 and bus 0 are available"));
704 return NULL;
705 }
706
707 if (virAsprintf(&addr, "%d:%d:%d.%d",
708 dev->addr.pci.domain,
709 dev->addr.pci.bus,
710 dev->addr.pci.slot,
711 dev->addr.pci.function) < 0) {
712 virReportOOMError();
713 return NULL;
714 }
715 return addr;
716}
717
718
719static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
720 virDomainDeviceInfoPtr dev,
721 void *opaque)
722{
723 int ret = -1;
724 char *addr = NULL;
725 qemuDomainPCIAddressSetPtr addrs = opaque;
726
727 if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
728 return 0;
729
730 addr = qemuPCIAddressAsString(dev);
731 if (!addr)
732 goto cleanup;
733
734 if (virHashLookup(addrs->used, addr)) {
735 if (dev->addr.pci.function != 0) {
736 qemuReportError(VIR_ERR_XML_ERROR,
737 _("Attempted double use of PCI Address '%s' "
738 "(may need \"multifunction='on'\" for device on function 0"),
739 addr);
740 } else {
741 qemuReportError(VIR_ERR_XML_ERROR,
742 _("Attempted double use of PCI Address '%s'"), addr);
743 }
744 goto cleanup;
745 }
746
747 VIR_DEBUG("Remembering PCI addr %s", addr);
748 if (virHashAddEntry(addrs->used, addr, addr) < 0)
749 goto cleanup;
750 addr = NULL;
751
752 if ((dev->addr.pci.function == 0) &&
753 (dev->addr.pci.multi != VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)) {
754 /* a function 0 w/o multifunction=on must reserve the entire slot */
755 int function;
756 virDomainDeviceInfo temp_dev = *dev;
757
758 for (function = 1; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
759 temp_dev.addr.pci.function = function;
760 addr = qemuPCIAddressAsString(&temp_dev);
761 if (!addr)
762 goto cleanup;
763
764 if (virHashLookup(addrs->used, addr)) {
765 qemuReportError(VIR_ERR_XML_ERROR,
766 _("Attempted double use of PCI Address '%s'"
767 "(need \"multifunction='off'\" for device on function 0)"),
768 addr);
769 goto cleanup;
770 }
771
772 VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", addr);
773 if (virHashAddEntry(addrs->used, addr, addr))
774 goto cleanup;
775 addr = NULL;
776 }
777 }
778 ret = 0;
779cleanup:
780 VIR_FREE(addr);
781 return ret;
782}
783
784
785int
786qemuDomainAssignPCIAddresses(virDomainDefPtr def)
787{
788 int ret = -1;
789 virBitmapPtr qemuCaps = NULL;
790 qemuDomainPCIAddressSetPtr addrs = NULL;
791
792 if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
793 NULL,
794 &qemuCaps) < 0)
795 goto cleanup;
796
797 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
798 if (!(addrs = qemuDomainPCIAddressSetCreate(def)))
799 goto cleanup;
800
801 if (qemuAssignDevicePCISlots(def, addrs) < 0)
802 goto cleanup;
803 }
804
805 ret = 0;
806
807cleanup:
808 qemuCapsFree(qemuCaps);
809 qemuDomainPCIAddressSetFree(addrs);
810
811 return ret;
812}
813
814
815static void
816qemuDomainPCIAddressSetFreeEntry(void *payload,
817 const void *name ATTRIBUTE_UNUSED)
818{
819 VIR_FREE(payload);
820}
821
822qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def)
823{
824 qemuDomainPCIAddressSetPtr addrs;
825
826 if (VIR_ALLOC(addrs) < 0)
827 goto no_memory;
828
829 if (!(addrs->used = virHashCreate(10, qemuDomainPCIAddressSetFreeEntry)))
830 goto error;
831
832 if (virDomainDeviceInfoIterate(def, qemuCollectPCIAddress, addrs) < 0)
833 goto error;
834
835 return addrs;
836
837no_memory:
838 virReportOOMError();
839error:
840 qemuDomainPCIAddressSetFree(addrs);
841 return NULL;
842}
843
844/* check whether the slot is used by the other device
845 * Return 0 if the slot is not used by the other device, or -1 if the slot
846 * is used by the other device.
847 */
848static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs,
849 virDomainDeviceInfoPtr dev)
850{
851 char *addr;
852 virDomainDeviceInfo temp_dev;
853 int function;
854
855 temp_dev = *dev;
856 for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
857 temp_dev.addr.pci.function = function;
858 addr = qemuPCIAddressAsString(&temp_dev);
859 if (!addr)
860 return -1;
861
862 if (virHashLookup(addrs->used, addr)) {
863 VIR_FREE(addr);
864 return -1;
865 }
866
867 VIR_FREE(addr);
868 }
869
870 return 0;
871}
872
873int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs,
874 virDomainDeviceInfoPtr dev)
875{
876 char *addr;
877
878 addr = qemuPCIAddressAsString(dev);
879 if (!addr)
880 return -1;
881
882 VIR_DEBUG("Reserving PCI addr %s", addr);
883
884 if (virHashLookup(addrs->used, addr)) {
885 qemuReportError(VIR_ERR_INTERNAL_ERROR,
886 _("unable to reserve PCI address %s"), addr);
887 VIR_FREE(addr);
888 return -1;
889 }
890
891 if (virHashAddEntry(addrs->used, addr, addr)) {
892 VIR_FREE(addr);
893 return -1;
894 }
895
896 if (dev->addr.pci.slot > addrs->nextslot) {
897 addrs->nextslot = dev->addr.pci.slot + 1;
898 if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot)
899 addrs->nextslot = 0;
900 }
901
902 return 0;
903}
904
905int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs,
906 int slot, int function)
907{
908 virDomainDeviceInfo dev;
909
910 dev.addr.pci.domain = 0;
911 dev.addr.pci.bus = 0;
912 dev.addr.pci.slot = slot;
913 dev.addr.pci.function = function;
914
915 return qemuDomainPCIAddressReserveAddr(addrs, &dev);
916}
917
918int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs,
919 int slot)
920{
921 int function;
922
923 for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
924 if (qemuDomainPCIAddressReserveFunction(addrs, slot, function) < 0)
925 goto cleanup;
926 }
927
928 return 0;
929
930cleanup:
931 for (function--; function >= 0; function--) {
932 qemuDomainPCIAddressReleaseFunction(addrs, slot, function);
933 }
934 return -1;
935}
936
937int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs,
938 virDomainDeviceInfoPtr dev)
939{
940 int ret = 0;
941 if (dev->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
942 /* We do not support hotplug multi-function PCI device now, so we should
943 * reserve the whole slot. The function of the PCI device must be 0.
944 */
945 if (dev->addr.pci.function != 0) {
946 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
947 _("Only PCI device addresses with function=0"
948 " are supported"));
949 return -1;
950 }
951
952 ret = qemuDomainPCIAddressReserveSlot(addrs, dev->addr.pci.slot);
953 } else {
954 ret = qemuDomainPCIAddressSetNextAddr(addrs, dev);
955 }
956 return ret;
957}
958
959
960int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs,
961 virDomainDeviceInfoPtr dev)
962{
963 char *addr;
964 int ret;
965
966 addr = qemuPCIAddressAsString(dev);
967 if (!addr)
968 return -1;
969
970 ret = virHashRemoveEntry(addrs->used, addr);
971
972 VIR_FREE(addr);
973
974 return ret;
975}
976
977int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs,
978 int slot, int function)
979{
980 virDomainDeviceInfo dev;
981
982 dev.addr.pci.domain = 0;
983 dev.addr.pci.bus = 0;
984 dev.addr.pci.slot = slot;
985 dev.addr.pci.function = function;
986
987 return qemuDomainPCIAddressReleaseAddr(addrs, &dev);
988}
989
990int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot)
991{
992 virDomainDeviceInfo dev;
993 char *addr;
994 int ret = 0;
995 unsigned int *function = &dev.addr.pci.function;
996
997 dev.addr.pci.domain = 0;
998 dev.addr.pci.bus = 0;
999 dev.addr.pci.slot = slot;
1000
1001 for (*function = 0; *function < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*function)++) {
1002 addr = qemuPCIAddressAsString(&dev);
1003 if (!addr)
1004 return -1;
1005
1006 if (!virHashLookup(addrs->used, addr)) {
1007 VIR_FREE(addr);
1008 continue;
1009 }
1010
1011 VIR_FREE(addr);
1012
1013 if (qemuDomainPCIAddressReleaseFunction(addrs, slot, *function) < 0)
1014 ret = -1;
1015 }
1016
1017 return ret;
1018}
1019
1020void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs)
1021{
1022 if (!addrs)
1023 return;
1024
1025 virHashFree(addrs->used);
1026 VIR_FREE(addrs);
1027}
1028
1029
1030int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs,
1031 virDomainDeviceInfoPtr dev)
1032{
1033 int i;
1034 int iteration;
1035
1036 for (i = addrs->nextslot, iteration = 0;
1037 iteration <= QEMU_PCI_ADDRESS_LAST_SLOT; i++, iteration++) {
1038 virDomainDeviceInfo maybe;
1039 char *addr;
1040
1041 if (QEMU_PCI_ADDRESS_LAST_SLOT < i)
1042 i = 0;
1043 memset(&maybe, 0, sizeof(maybe));
1044 maybe.addr.pci.domain = 0;
1045 maybe.addr.pci.bus = 0;
1046 maybe.addr.pci.slot = i;
1047 maybe.addr.pci.function = 0;
1048
1049 if (!(addr = qemuPCIAddressAsString(&maybe)))
1050 return -1;
1051
1052 if (qemuDomainPCIAddressCheckSlot(addrs, &maybe) < 0) {
1053 VIR_DEBUG("PCI addr %s already in use", addr);
1054 VIR_FREE(addr);
1055 continue;
1056 }
1057
1058 VIR_DEBUG("Allocating PCI addr %s", addr);
1059 VIR_FREE(addr);
1060
1061 if (qemuDomainPCIAddressReserveSlot(addrs, i) < 0)
1062 return -1;
1063
1064 dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1065 dev->addr.pci = maybe.addr.pci;
1066
1067 addrs->nextslot = i + 1;
1068 if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot)
1069 addrs->nextslot = 0;
1070
1071 return 0;
1072 }
1073
1074 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1075 "%s", _("No more available PCI addresses"));
1076 return -1;
1077}
1078
1079/*
1080 * This assigns static PCI slots to all configured devices.
1081 * The ordering here is chosen to match the ordering used
1082 * with old QEMU < 0.12, so that if a user updates a QEMU
1083 * host from old QEMU to QEMU >= 0.12, their guests should
1084 * get PCI addresses in the same order as before.
1085 *
1086 * NB, if they previously hotplugged devices then all bets
1087 * are off. Hotplug for old QEMU was unfixably broken wrt
1088 * to stable PCI addressing.
1089 *
1090 * Order is:
1091 *
1092 * - Host bridge (slot 0)
1093 * - PIIX3 ISA bridge, IDE controller, something else unknown, USB controller (slot 1)
1094 * - Video (slot 2)
1095 *
1096 * Incrementally assign slots from 3 onwards:
1097 *
1098 * - Net
1099 * - Sound
1100 * - SCSI controllers
1101 * - VirtIO block
1102 * - VirtIO balloon
1103 * - Host device passthrough
1104 * - Watchdog (not IB700)
1105 *
1106 * Prior to this function being invoked, qemuCollectPCIAddress() will have
1107 * added all existing PCI addresses from the 'def' to 'addrs'. Thus this
1108 * function must only try to reserve addresses if info.type == NONE and
1109 * skip over info.type == PCI
1110 */
1111int
1112qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs)
1113{
1114 int i;
1115 bool reservedIDE = false;
1116 bool reservedUSB = false;
1117 bool reservedVGA = false;
1118 int function;
1119
1120 /* Host bridge */
1121 if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0)
1122 goto error;
1123
1124 /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */
1125 for (i = 0; i < def->ncontrollers ; i++) {
1126 /* First IDE controller lives on the PIIX3 at slot=1, function=1 */
1127 if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
1128 def->controllers[i]->idx == 0) {
1129 if (def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1130 if (def->controllers[i]->info.addr.pci.domain != 0 ||
1131 def->controllers[i]->info.addr.pci.bus != 0 ||
1132 def->controllers[i]->info.addr.pci.slot != 1 ||
1133 def->controllers[i]->info.addr.pci.function != 1) {
1134 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1135 _("Primary IDE controller must have PCI address 0:0:1.1"));
1136 goto error;
1137 }
1138 /* If TYPE==PCI, then qemuCollectPCIAddress() function
1139 * has already reserved the address, so we must skip */
1140 reservedIDE = true;
1141 } else {
1142 def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1143 def->controllers[i]->info.addr.pci.domain = 0;
1144 def->controllers[i]->info.addr.pci.bus = 0;
1145 def->controllers[i]->info.addr.pci.slot = 1;
1146 def->controllers[i]->info.addr.pci.function = 1;
1147 }
1148 } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
1149 def->controllers[i]->idx == 0 &&
1150 (def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI ||
1151 def->controllers[i]->model == -1)) {
1152 if (def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1153 if (def->controllers[i]->info.addr.pci.domain != 0 ||
1154 def->controllers[i]->info.addr.pci.bus != 0 ||
1155 def->controllers[i]->info.addr.pci.slot != 1 ||
1156 def->controllers[i]->info.addr.pci.function != 2) {
1157 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1158 _("PIIX3 USB controller must have PCI address 0:0:1.2"));
1159 goto error;
1160 }
1161 reservedUSB = true;
1162 } else {
1163 def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1164 def->controllers[i]->info.addr.pci.domain = 0;
1165 def->controllers[i]->info.addr.pci.bus = 0;
1166 def->controllers[i]->info.addr.pci.slot = 1;
1167 def->controllers[i]->info.addr.pci.function = 2;
1168 }
1169 }
1170 }
1171
1172 /* PIIX3 (ISA bridge, IDE controller, something else unknown, USB controller)
1173 * hardcoded slot=1, multifunction device
1174 */
1175 for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
1176 if ((function == 1 && reservedIDE) ||
1177 (function == 2 && reservedUSB))
1178 /* we have reserved this pci address */
1179 continue;
1180
1181 if (qemuDomainPCIAddressReserveFunction(addrs, 1, function) < 0)
1182 goto error;
1183 }
1184
1185 /* First VGA is hardcoded slot=2 */
1186 if (def->nvideos > 0) {
1187 if (def->videos[0]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1188 if (def->videos[0]->info.addr.pci.domain != 0 ||
1189 def->videos[0]->info.addr.pci.bus != 0 ||
1190 def->videos[0]->info.addr.pci.slot != 2 ||
1191 def->videos[0]->info.addr.pci.function != 0) {
1192 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1193 _("Primary video card must have PCI address 0:0:2.0"));
1194 goto error;
1195 }
1196 /* If TYPE==PCI, then qemuCollectPCIAddress() function
1197 * has already reserved the address, so we must skip */
1198 reservedVGA = true;
1199 } else {
1200 def->videos[0]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1201 def->videos[0]->info.addr.pci.domain = 0;
1202 def->videos[0]->info.addr.pci.bus = 0;
1203 def->videos[0]->info.addr.pci.slot = 2;
1204 def->videos[0]->info.addr.pci.function = 0;
1205 }
1206 }
1207
1208 if (!reservedVGA
1209 && qemuDomainPCIAddressReserveSlot(addrs, 2) < 0)
1210 goto error;
1211
1212 for (i = 0; i < def->nfss ; i++) {
1213 if (def->fss[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1214 continue;
1215
1216 /* Only support VirtIO-9p-pci so far. If that changes,
1217 * we might need to skip devices here */
1218 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->fss[i]->info) < 0)
1219 goto error;
1220 }
1221
1222 /* Network interfaces */
1223 for (i = 0; i < def->nnets ; i++) {
1224 if (def->nets[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1225 continue;
1226 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->nets[i]->info) < 0)
1227 goto error;
1228 }
1229
1230 /* Sound cards */
1231 for (i = 0; i < def->nsounds ; i++) {
1232 if (def->sounds[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1233 continue;
1234 /* Skip ISA sound card, and PCSPK */
1235 if (def->sounds[i]->model == VIR_DOMAIN_SOUND_MODEL_SB16 ||
1236 def->sounds[i]->model == VIR_DOMAIN_SOUND_MODEL_PCSPK)
1237 continue;
1238
1239 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->sounds[i]->info) < 0)
1240 goto error;
1241 }
1242
1243 /* Disk controllers (SCSI only for now) */
1244 for (i = 0; i < def->ncontrollers ; i++) {
1245 /* FDC lives behind the ISA bridge; CCID is a usb device */
1246 if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC ||
1247 def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_CCID)
1248 continue;
1249
1250 /* First IDE controller lives on the PIIX3 at slot=1, function=1,
1251 dealt with earlier on*/
1252 if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
1253 def->controllers[i]->idx == 0)
1254 continue;
1255
1256 if (def->controllers[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1257 continue;
1258 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->controllers[i]->info) < 0)
1259 goto error;
1260 }
1261
1262 /* Disks (VirtIO only for now) */
1263 for (i = 0; i < def->ndisks ; i++) {
1264 /* Only VirtIO disks use PCI addrs */
1265 if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO)
1266 continue;
1267
1268 if (def->disks[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
1269 continue;
1270
1271 if (def->disks[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1272 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
1273 _("virtio only support device address type 'PCI'"));
1274 goto error;
1275 }
1276
1277 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->disks[i]->info) < 0)
1278 goto error;
1279 }
1280
1281 /* Host PCI devices */
1282 for (i = 0; i < def->nhostdevs ; i++) {
1283 if (def->hostdevs[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1284 continue;
1285 if (def->hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
1286 def->hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
1287 continue;
1288
1289 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->hostdevs[i]->info) < 0)
1290 goto error;
1291 }
1292
1293 /* VirtIO balloon */
1294 if (def->memballoon &&
1295 def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO &&
1296 def->memballoon->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1297 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->memballoon->info) < 0)
1298 goto error;
1299 }
1300
1301 /* A watchdog - skip IB700, it is not a PCI device */
1302 if (def->watchdog &&
1303 def->watchdog->model != VIR_DOMAIN_WATCHDOG_MODEL_IB700 &&
1304 def->watchdog->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1305 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->watchdog->info) < 0)
1306 goto error;
1307 }
1308
1309 /* Further non-primary video cards */
1310 for (i = 1; i < def->nvideos ; i++) {
1311 if (def->videos[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1312 continue;
1313 if (qemuDomainPCIAddressSetNextAddr(addrs, &def->videos[i]->info) < 0)
1314 goto error;
1315 }
1316 for (i = 0; i < def->ninputs ; i++) {
1317 /* Nada - none are PCI based (yet) */
1318 }
1319 for (i = 0; i < def->nparallels ; i++) {
1320 /* Nada - none are PCI based (yet) */
1321 }
1322 for (i = 0; i < def->nserials ; i++) {
1323 /* Nada - none are PCI based (yet) */
1324 }
1325 for (i = 0; i < def->nchannels ; i++) {
1326 /* Nada - none are PCI based (yet) */
1327 }
1328 for (i = 0; i < def->nhubs ; i++) {
1329 /* Nada - none are PCI based (yet) */
1330 }
1331
1332 return 0;
1333
1334error:
1335 return -1;
1336}
1337
1338static void
1339qemuUsbId(virBufferPtr buf, int idx)
1340{
1341 if (idx == 0)
1342 virBufferAsprintf(buf, "usb");
1343 else
1344 virBufferAsprintf(buf, "usb%d", idx);
1345}
1346
1347static int
1348qemuBuildDeviceAddressStr(virBufferPtr buf,
1349 virDomainDeviceInfoPtr info,
1350 virBitmapPtr qemuCaps)
1351{
1352 if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1353 if (info->addr.pci.domain != 0) {
1354 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1355 _("Only PCI device addresses with domain=0 are supported"));
1356 return -1;
1357 }
1358 if (info->addr.pci.bus != 0) {
1359 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1360 _("Only PCI device addresses with bus=0 are supported"));
1361 return -1;
1362 }
1363 if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION)) {
1364 if (info->addr.pci.function > 7) {
1365 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1366 _("The function of PCI device addresses must "
1367 "less than 8"));
1368 return -1;
1369 }
1370 } else {
1371 if (info->addr.pci.function != 0) {
1372 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1373 _("Only PCI device addresses with function=0 "
1374 "are supported with this QEMU binary"));
1375 return -1;
1376 }
1377 if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON) {
1378 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1379 _("'multifunction=on' is not supported with "
1380 "this QEMU binary"));
1381 return -1;
1382 }
1383 }
1384
1385 /* XXX
1386 * When QEMU grows support for > 1 PCI bus, then pci.0 changes
1387 * to pci.1, pci.2, etc
1388 * When QEMU grows support for > 1 PCI domain, then pci.0 change
1389 * to pciNN.0 where NN is the domain number
1390 */
1391 if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS))
1392 virBufferAsprintf(buf, ",bus=pci.0");
1393 else
1394 virBufferAsprintf(buf, ",bus=pci");
1395 if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)
1396 virBufferAddLit(buf, ",multifunction=on");
1397 else if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF)
1398 virBufferAddLit(buf, ",multifunction=off");
1399 virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
1400 if (info->addr.pci.function != 0)
1401 virBufferAsprintf(buf, ".0x%x", info->addr.pci.function);
1402 } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
1403 virBufferAsprintf(buf, ",bus=");
1404 qemuUsbId(buf, info->addr.usb.bus);
1405 virBufferAsprintf(buf, ".0,port=%s", info->addr.usb.port);
1406 }
1407
1408 return 0;
1409}
1410
1411static int
1412qemuBuildIoEventFdStr(virBufferPtr buf,
1413 enum virDomainIoEventFd use,
1414 virBitmapPtr qemuCaps)
1415{
1416 if (use && qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_IOEVENTFD))
1417 virBufferAsprintf(buf, ",ioeventfd=%s",
1418 virDomainIoEventFdTypeToString(use));
1419 return 0;
1420}
1421
1422#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
1423 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
1424
1425static int
1426qemuSafeSerialParamValue(const char *value)
1427{
1428 if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen (value)) {
1429 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1430 _("driver serial '%s' contains unsafe characters"),
1431 value);
1432 return -1;
1433 }
1434
1435 return 0;
1436}
1437
1438static int
1439qemuBuildRBDString(virConnectPtr conn,
1440 virDomainDiskDefPtr disk,
1441 virBufferPtr opt)
1442{
1443 int i, ret = 0;
1444 virSecretPtr sec = NULL;
1445 char *secret = NULL;
1446 size_t secret_size;
1447
1448 virBufferAsprintf(opt, "rbd:%s", disk->src);
1449 if (disk->auth.username) {
1450 virBufferEscape(opt, ":", ":id=%s", disk->auth.username);
1451 /* look up secret */
1452 switch (disk->auth.secretType) {
1453 case VIR_DOMAIN_DISK_SECRET_TYPE_UUID:
1454 sec = virSecretLookupByUUID(conn,
1455 disk->auth.secret.uuid);
1456 break;
1457 case VIR_DOMAIN_DISK_SECRET_TYPE_USAGE:
1458 sec = virSecretLookupByUsage(conn,
1459 VIR_SECRET_USAGE_TYPE_CEPH,
1460 disk->auth.secret.usage);
1461 break;
1462 }
1463
1464 if (sec) {
1465 char *base64 = NULL;
1466
1467 secret = (char *)conn->secretDriver->getValue(sec, &secret_size, 0,
1468 VIR_SECRET_GET_VALUE_INTERNAL_CALL);
1469 if (secret == NULL) {
1470 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1471 _("could not get the value of the secret for username %s"),
1472 disk->auth.username);
1473 goto error;
1474 }
1475 /* qemu/librbd wants it base64 encoded */
1476 base64_encode_alloc(secret, secret_size, &base64);
1477 if (!base64) {
1478 virReportOOMError();
1479 goto error;
1480 }
1481 virBufferEscape(opt, ":;", ":key=%s:auth_supported=cephx\\;none",
1482 base64);
1483 VIR_FREE(base64);
1484 } else {
1485 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1486 _("rbd username '%s' specified but secret not found"),
1487 disk->auth.username);
1488 goto error;
1489 }
1490 }
1491
1492 if (disk->nhosts > 0) {
1493 virBufferAddLit(opt, ":mon_host=");
1494 for (i = 0; i < disk->nhosts; ++i) {
1495 if (i) {
1496 virBufferAddLit(opt, "\\;");
1497 }
1498 if (disk->hosts[i].port) {
1499 virBufferAsprintf(opt, "%s\\:%s",
1500 disk->hosts[i].name,
1501 disk->hosts[i].port);
1502 } else {
1503 virBufferAsprintf(opt, "%s", disk->hosts[i].name);
1504 }
1505 }
1506 }
1507
1508cleanup:
1509 VIR_FREE(secret);
1510 if (sec)
1511 virUnrefSecret(sec);
1512
1513 return ret;
1514
1515error:
1516 ret = -1;
1517 goto cleanup;
1518}
1519
1520static int qemuAddRBDHost(virDomainDiskDefPtr disk, char *hostport)
1521{
1522 char *port;
1523
1524 disk->nhosts++;
1525 if (VIR_REALLOC_N(disk->hosts, disk->nhosts) < 0)
1526 goto no_memory;
1527
1528 port = strstr(hostport, "\\:");
1529 if (port) {
1530 *port = '\0';
1531 port += 2;
1532 disk->hosts[disk->nhosts-1].port = strdup(port);
1533 if (!disk->hosts[disk->nhosts-1].port)
1534 goto no_memory;
1535 } else {
1536 disk->hosts[disk->nhosts-1].port = strdup("6789");
1537 if (!disk->hosts[disk->nhosts-1].port)
1538 goto no_memory;
1539 }
1540 disk->hosts[disk->nhosts-1].name = strdup(hostport);
1541 if (!disk->hosts[disk->nhosts-1].name)
1542 goto no_memory;
1543 return 0;
1544
1545no_memory:
1546 virReportOOMError();
1547 VIR_FREE(disk->hosts[disk->nhosts-1].port);
1548 VIR_FREE(disk->hosts[disk->nhosts-1].name);
1549 return -1;
1550}
1551
1552/* disk->src initially has everything after the rbd: prefix */
1553static int qemuParseRBDString(virDomainDiskDefPtr disk)
1554{
1555 char *options = NULL;
1556 char *p, *e, *next;
1557
1558 p = strchr(disk->src, ':');
1559 if (p) {
1560 options = strdup(p + 1);
1561 if (!options)
1562 goto no_memory;
1563 *p = '\0';
1564 }
1565
1566 /* options */
1567 if (!options)
1568 return 0; /* all done */
1569
1570 p = options;
1571 while (*p) {
1572 /* find : delimiter or end of string */
1573 for (e = p; *e && *e != ':'; ++e) {
1574 if (*e == '\\') {
1575 e++;
1576 if (*e == '\0')
1577 break;
1578 }
1579 }
1580 if (*e == '\0') {
1581 next = e; /* last kv pair */
1582 } else {
1583 next = e + 1;
1584 *e = '\0';
1585 }
1586
1587 if (STRPREFIX(p, "id=")) {
1588 disk->auth.username = strdup(p + strlen("id="));
1589 if (!disk->auth.username)
1590 goto no_memory;
1591 }
1592 if (STRPREFIX(p, "mon_host=")) {
1593 char *h, *sep;
1594
1595 h = p + strlen("mon_host=");
1596 while (h < e) {
1597 for (sep = h; sep < e; ++sep) {
1598 if (*sep == '\\' && (sep[1] == ',' ||
1599 sep[1] == ';' ||
1600 sep[1] == ' ')) {
1601 *sep = '\0';
1602 sep += 2;
1603 break;
1604 }
1605 }
1606 if (qemuAddRBDHost(disk, h) < 0) {
1607 return -1;
1608 }
1609 h = sep;
1610 }
1611 }
1612
1613 p = next;
1614 }
1615 return 0;
1616
1617no_memory:
1618 virReportOOMError();
1619 return -1;
1620}
1621
1622char *
1623qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
1624 virDomainDiskDefPtr disk,
1625 bool bootable,
1626 virBitmapPtr qemuCaps)
1627{
1628 virBuffer opt = VIR_BUFFER_INITIALIZER;
1629 const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
1630 int idx = virDiskNameToIndex(disk->dst);
1631 int busid = -1, unitid = -1;
1632
1633 if (idx < 0) {
1634 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1635 _("unsupported disk type '%s'"), disk->dst);
1636 goto error;
1637 }
1638
1639 switch (disk->bus) {
1640 case VIR_DOMAIN_DISK_BUS_SCSI:
1641 if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1642 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1643 _("unexpected address type for scsi disk"));
1644 goto error;
1645 }
1646
1647 /* Setting bus= attr for SCSI drives, causes a controller
1648 * to be created. Yes this is slightly odd. It is not possible
1649 * to have > 1 bus on a SCSI controller (yet). */
1650 if (disk->info.addr.drive.bus != 0) {
1651 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1652 "%s", _("SCSI controller only supports 1 bus"));
1653 goto error;
1654 }
1655 busid = disk->info.addr.drive.controller;
1656 unitid = disk->info.addr.drive.unit;
1657 break;
1658
1659 case VIR_DOMAIN_DISK_BUS_IDE:
1660 if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1661 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1662 _("unexpected address type for ide disk"));
1663 goto error;
1664 }
1665 /* We can only have 1 IDE controller (currently) */
1666 if (disk->info.addr.drive.controller != 0) {
1667 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1668 _("Only 1 %s controller is supported"), bus);
1669 goto error;
1670 }
1671 busid = disk->info.addr.drive.bus;
1672 unitid = disk->info.addr.drive.unit;
1673 break;
1674
1675 case VIR_DOMAIN_DISK_BUS_FDC:
1676 if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1677 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1678 _("unexpected address type for fdc disk"));
1679 goto error;
1680 }
1681 /* We can only have 1 FDC controller (currently) */
1682 if (disk->info.addr.drive.controller != 0) {
1683 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1684 _("Only 1 %s controller is supported"), bus);
1685 goto error;
1686 }
1687 /* We can only have 1 FDC bus (currently) */
1688 if (disk->info.addr.drive.bus != 0) {
1689 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1690 _("Only 1 %s bus is supported"), bus);
1691 goto error;
1692 }
1693 unitid = disk->info.addr.drive.unit;
1694
1695 break;
1696
1697 case VIR_DOMAIN_DISK_BUS_VIRTIO:
1698 /* Each virtio drive is a separate PCI device, no unit/busid or index */
1699 idx = -1;
1700 break;
1701
1702 case VIR_DOMAIN_DISK_BUS_XEN:
1703 /* Xen has no address type currently, so assign based on index */
1704 break;
1705 }
1706
1707 /* disk->src is NULL when we use nbd disks */
1708 if (disk->src || (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
1709 disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) {
1710 if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
1711 /* QEMU only supports magic FAT format for now */
1712 if (disk->driverType &&
1713 STRNEQ(disk->driverType, "fat")) {
1714 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1715 _("unsupported disk driver type for '%s'"),
1716 disk->driverType);
1717 goto error;
1718 }
1719 if (!disk->readonly) {
1720 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1721 _("cannot create virtual FAT disks in read-write mode"));
1722 goto error;
1723 }
1724 if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
1725 virBufferAsprintf(&opt, "file=fat:floppy:%s,", disk->src);
1726 else
1727 virBufferAsprintf(&opt, "file=fat:%s,", disk->src);
1728 } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
1729 switch (disk->protocol) {
1730 case VIR_DOMAIN_DISK_PROTOCOL_NBD:
1731 if (disk->nhosts != 1) {
1732 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1733 _("NBD accepts only one host"));
1734 goto error;
1735 }
1736 virBufferAsprintf(&opt, "file=nbd:%s:%s,",
1737 disk->hosts->name, disk->hosts->port);
1738 break;
1739 case VIR_DOMAIN_DISK_PROTOCOL_RBD:
1740 virBufferAddLit(&opt, "file=");
1741 if (qemuBuildRBDString(conn, disk, &opt) < 0)
1742 goto error;
1743 virBufferAddChar(&opt, ',');
1744 break;
1745 case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
1746 if (disk->nhosts == 0)
1747 virBufferAsprintf(&opt, "file=sheepdog:%s,", disk->src);
1748 else
1749 /* only one host is supported now */
1750 virBufferAsprintf(&opt, "file=sheepdog:%s:%s:%s,",
1751 disk->hosts->name, disk->hosts->port,
1752 disk->src);
1753 break;
1754 }
1755 } else {
1756 virBufferAsprintf(&opt, "file=%s,", disk->src);
1757 }
1758 }
1759 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
1760 virBufferAddLit(&opt, "if=none");
1761 else
1762 virBufferAsprintf(&opt, "if=%s", bus);
1763
1764 if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
1765 virBufferAddLit(&opt, ",media=cdrom");
1766
1767 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
1768 virBufferAsprintf(&opt, ",id=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias);
1769 } else {
1770 if (busid == -1 && unitid == -1) {
1771 if (idx != -1)
1772 virBufferAsprintf(&opt, ",index=%d", idx);
1773 } else {
1774 if (busid != -1)
1775 virBufferAsprintf(&opt, ",bus=%d", busid);
1776 if (unitid != -1)
1777 virBufferAsprintf(&opt, ",unit=%d", unitid);
1778 }
1779 }
1780 if (bootable &&
1781 qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_BOOT) &&
1782 disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
1783 disk->bus != VIR_DOMAIN_DISK_BUS_IDE)
1784 virBufferAddLit(&opt, ",boot=on");
1785 if (disk->readonly &&
1786 qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY))
1787 virBufferAddLit(&opt, ",readonly=on");
1788 if (disk->transient) {
1789 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1790 _("transient disks not supported yet"));
1791 goto error;
1792 }
1793 if (disk->driverType && *disk->driverType != '\0' &&
1794 disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
1795 qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT))
1796 virBufferAsprintf(&opt, ",format=%s", disk->driverType);
1797 if (disk->serial &&
1798 qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {
1799 if (qemuSafeSerialParamValue(disk->serial) < 0)
1800 goto error;
1801 virBufferAsprintf(&opt, ",serial=%s", disk->serial);
1802 }
1803
1804 if (disk->cachemode) {
1805 const char *mode = NULL;
1806
1807 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2)) {
1808 mode = qemuDiskCacheV2TypeToString(disk->cachemode);
1809
1810 if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC &&
1811 !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC)) {
1812 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1813 _("disk cache mode 'directsync' is not "
1814 "supported by this QEMU"));
1815 goto error;
1816 } else if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_UNSAFE &&
1817 !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_UNSAFE)) {
1818 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1819 _("disk cache mode 'unsafe' is not "
1820 "supported by this QEMU"));
1821 goto error;
1822 }
1823 } else {
1824 mode = qemuDiskCacheV1TypeToString(disk->cachemode);
1825 }
1826
1827 virBufferAsprintf(&opt, ",cache=%s", mode);
1828 } else if (disk->shared && !disk->readonly) {
1829 virBufferAddLit(&opt, ",cache=off");
1830 }
1831
1832 if (qemuCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
1833 const char *wpolicy = NULL, *rpolicy = NULL;
1834
1835 if (disk->error_policy)
1836 wpolicy = virDomainDiskErrorPolicyTypeToString(disk->error_policy);
1837 if (disk->rerror_policy)
1838 rpolicy = virDomainDiskErrorPolicyTypeToString(disk->rerror_policy);
1839
1840 if (disk->error_policy == VIR_DOMAIN_DISK_ERROR_POLICY_ENOSPACE) {
1841 /* in the case of enospace, the option is spelled
1842 * differently in qemu, and it's only valid for werror,
1843 * not for rerror, so leave leave rerror NULL.
1844 */
1845 wpolicy = "enospc";
1846 } else if (!rpolicy) {
1847 /* for other policies, rpolicy can match wpolicy */
1848 rpolicy = wpolicy;
1849 }
1850
1851 if (wpolicy)
1852 virBufferAsprintf(&opt, ",werror=%s", wpolicy);
1853 if (rpolicy)
1854 virBufferAsprintf(&opt, ",rerror=%s", rpolicy);
1855 }
1856
1857 if (disk->iomode) {
1858 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_AIO)) {
1859 virBufferAsprintf(&opt, ",aio=%s",
1860 virDomainDiskIoTypeToString(disk->iomode));
1861 } else {
1862 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1863 _("disk aio mode not supported with this "
1864 "QEMU binary"));
1865 goto error;
1866 }
1867 }
1868
1869 /* block I/O throttling */
1870 if (disk->blkdeviotune.total_bytes_sec) {
1871 virBufferAsprintf(&opt, ",bps=%llu",
1872 disk->blkdeviotune.total_bytes_sec);
1873 }
1874
1875 if (disk->blkdeviotune.read_bytes_sec) {
1876 virBufferAsprintf(&opt, ",bps_rd=%llu",
1877 disk->blkdeviotune.read_bytes_sec);
1878 }
1879
1880 if (disk->blkdeviotune.write_bytes_sec) {
1881 virBufferAsprintf(&opt, ",bps_wr=%llu",
1882 disk->blkdeviotune.write_bytes_sec);
1883 }
1884
1885 if (disk->blkdeviotune.total_iops_sec) {
1886 virBufferAsprintf(&opt, ",iops=%llu",
1887 disk->blkdeviotune.total_iops_sec);
1888 }
1889
1890 if (disk->blkdeviotune.read_iops_sec) {
1891 virBufferAsprintf(&opt, ",iops_rd=%llu",
1892 disk->blkdeviotune.read_iops_sec);
1893 }
1894
1895 if (disk->blkdeviotune.write_iops_sec) {
1896 virBufferAsprintf(&opt, ",iops_wr=%llu",
1897 disk->blkdeviotune.write_iops_sec);
1898 }
1899
1900 if (virBufferError(&opt)) {
1901 virReportOOMError();
1902 goto error;
1903 }
1904
1905 return virBufferContentAndReset(&opt);
1906
1907error:
1908 virBufferFreeAndReset(&opt);
1909 return NULL;
1910}
1911
1912
1913char *
1914qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
1915 int bootindex,
1916 virBitmapPtr qemuCaps)
1917{
1918 virBuffer opt = VIR_BUFFER_INITIALIZER;
1919 const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
1920 int idx = virDiskNameToIndex(disk->dst);
1921
1922 if (idx < 0) {
1923 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1924 _("unsupported disk type '%s'"), disk->dst);
1925 goto error;
1926 }
1927
1928 switch (disk->bus) {
1929 case VIR_DOMAIN_DISK_BUS_IDE:
1930 virBufferAddLit(&opt, "ide-drive");
1931 virBufferAsprintf(&opt, ",bus=ide.%d,unit=%d",
1932 disk->info.addr.drive.bus,
1933 disk->info.addr.drive.unit);
1934 break;
1935 case VIR_DOMAIN_DISK_BUS_SCSI:
1936 virBufferAddLit(&opt, "scsi-disk");
1937 virBufferAsprintf(&opt, ",bus=scsi%d.%d,scsi-id=%d",
1938 disk->info.addr.drive.controller,
1939 disk->info.addr.drive.bus,
1940 disk->info.addr.drive.unit);
1941 break;
1942 case VIR_DOMAIN_DISK_BUS_SATA:
1943 virBufferAddLit(&opt, "ide-drive");
1944 virBufferAsprintf(&opt, ",bus=ahci%d.%d",
1945 disk->info.addr.drive.controller,
1946 disk->info.addr.drive.unit);
1947 break;
1948 case VIR_DOMAIN_DISK_BUS_VIRTIO:
1949 virBufferAddLit(&opt, "virtio-blk-pci");
1950 qemuBuildIoEventFdStr(&opt, disk->ioeventfd, qemuCaps);
1951 if (disk->event_idx &&
1952 qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_EVENT_IDX)) {
1953 virBufferAsprintf(&opt, ",event_idx=%s",
1954 virDomainVirtioEventIdxTypeToString(disk->event_idx));
1955 }
1956 if (qemuBuildDeviceAddressStr(&opt, &disk->info, qemuCaps) < 0)
1957 goto error;
1958 break;
1959 case VIR_DOMAIN_DISK_BUS_USB:
1960 virBufferAddLit(&opt, "usb-storage");
1961 break;
1962 default:
1963 qemuReportError(VIR_ERR_INTERNAL_ERROR,
1964 _("unsupported disk bus '%s' with device setup"), bus);
1965 goto error;
1966 }
1967 virBufferAsprintf(&opt, ",drive=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias);
1968 virBufferAsprintf(&opt, ",id=%s", disk->info.alias);
1969 if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
1970 virBufferAsprintf(&opt, ",bootindex=%d", bootindex);
1971
1972 if (virBufferError(&opt)) {
1973 virReportOOMError();
1974 goto error;
1975 }
1976
1977 return virBufferContentAndReset(&opt);
1978
1979error:
1980 virBufferFreeAndReset(&opt);
1981 return NULL;
1982}
1983
1984
1985char *qemuBuildFSStr(virDomainFSDefPtr fs,
1986 virBitmapPtr qemuCaps ATTRIBUTE_UNUSED)
1987{
1988 virBuffer opt = VIR_BUFFER_INITIALIZER;
1989 const char *driver = qemuDomainFSDriverTypeToString(fs->fsdriver);
1990
1991 if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
1992 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1993 _("only supports mount filesystem type"));
1994 goto error;
1995 }
1996
1997 if (!driver) {
1998 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1999 _("Filesystem driver type not supported"));
2000 goto error;
2001 }
2002 virBufferAdd(&opt, driver, -1);
2003
2004 if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) {
2005 virBufferAddLit(&opt, ",security_model=mapped");
2006 } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
2007 virBufferAddLit(&opt, ",security_model=passthrough");
2008 } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_SQUASH) {
2009 virBufferAddLit(&opt, ",security_model=none");
2010 }
2011 virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
2012 virBufferAsprintf(&opt, ",path=%s", fs->src);
2013
2014 if (virBufferError(&opt)) {
2015 virReportOOMError();
2016 goto error;
2017 }
2018
2019 return virBufferContentAndReset(&opt);
2020
2021error:
2022 virBufferFreeAndReset(&opt);
2023 return NULL;
2024}
2025
2026
2027char *
2028qemuBuildFSDevStr(virDomainFSDefPtr fs,
2029 virBitmapPtr qemuCaps)
2030{
2031 virBuffer opt = VIR_BUFFER_INITIALIZER;
2032
2033 if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
2034 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2035 _("can only passthrough directories"));
2036 goto error;
2037 }
2038
2039 virBufferAddLit(&opt, "virtio-9p-pci");
2040 virBufferAsprintf(&opt, ",id=%s", fs->info.alias);
2041 virBufferAsprintf(&opt, ",fsdev=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
2042 virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
2043
2044 if (qemuBuildDeviceAddressStr(&opt, &fs->info, qemuCaps) < 0)
2045 goto error;
2046
2047 if (virBufferError(&opt)) {
2048 virReportOOMError();
2049 goto error;
2050 }
2051
2052 return virBufferContentAndReset(&opt);
2053
2054error:
2055 virBufferFreeAndReset(&opt);
2056 return NULL;
2057}
2058
2059
2060static int
2061qemuControllerModelUSBToCaps(int model)
2062{
2063 switch (model) {
2064 case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
2065 return QEMU_CAPS_PIIX3_USB_UHCI;
2066 case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
2067 return QEMU_CAPS_PIIX4_USB_UHCI;
2068 case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
2069 return QEMU_CAPS_USB_EHCI;
2070 case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
2071 case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
2072 case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
2073 case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
2074 return QEMU_CAPS_ICH9_USB_EHCI1;
2075 case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
2076 return QEMU_CAPS_VT82C686B_USB_UHCI;
2077 case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
2078 return QEMU_CAPS_PCI_OHCI;
2079 default:
2080 return -1;
2081 }
2082}
2083
2084
2085static int
2086qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def,
2087 virBitmapPtr qemuCaps,
2088 virBuffer *buf)
2089{
2090 const char *smodel;
2091 int model, caps;
2092
2093 model = def->model;
2094 if (model == -1)
2095 model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
2096
2097 smodel = qemuControllerModelUSBTypeToString(model);
2098 caps = qemuControllerModelUSBToCaps(model);
2099
2100 if (caps == -1 || !qemuCapsGet(qemuCaps, caps)) {
2101 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2102 _("%s not supported in this QEMU binary"), smodel);
2103 return -1;
2104 }
2105
2106 virBufferAsprintf(buf, "%s", smodel);
2107
2108 if (def->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_USB) {
2109 virBufferAsprintf(buf, ",masterbus=");
2110 qemuUsbId(buf, def->idx);
2111 virBufferAsprintf(buf, ".0,firstport=%d", def->info.master.usb.startport);
2112 } else {
2113 virBufferAsprintf(buf, ",id=");
2114 qemuUsbId(buf, def->idx);
2115 }
2116
2117 return 0;
2118}
2119
2120char *
2121qemuBuildControllerDevStr(virDomainControllerDefPtr def,
2122 virBitmapPtr qemuCaps,
2123 int *nusbcontroller)
2124{
2125 virBuffer buf = VIR_BUFFER_INITIALIZER;
2126
2127 switch (def->type) {
2128 case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
2129 virBufferAddLit(&buf, "lsi");
2130 virBufferAsprintf(&buf, ",id=scsi%d", def->idx);
2131 break;
2132
2133 case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
2134 if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
2135 virBufferAddLit(&buf, "virtio-serial-pci");
2136 } else {
2137 virBufferAddLit(&buf, "virtio-serial");
2138 }
2139 virBufferAsprintf(&buf, ",id=" QEMU_VIRTIO_SERIAL_PREFIX "%d",
2140 def->idx);
2141 if (def->opts.vioserial.ports != -1) {
2142 virBufferAsprintf(&buf, ",max_ports=%d",
2143 def->opts.vioserial.ports);
2144 }
2145 if (def->opts.vioserial.vectors != -1) {
2146 virBufferAsprintf(&buf, ",vectors=%d",
2147 def->opts.vioserial.vectors);
2148 }
2149 break;
2150
2151 case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
2152 virBufferAsprintf(&buf, "usb-ccid,id=ccid%d", def->idx);
2153 break;
2154
2155 case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
2156 virBufferAsprintf(&buf, "ahci,id=ahci%d", def->idx);
2157 break;
2158
2159 case VIR_DOMAIN_CONTROLLER_TYPE_USB:
2160 if (qemuBuildUSBControllerDevStr(def, qemuCaps, &buf) == -1)
2161 goto error;
2162
2163 if (nusbcontroller)
2164 *nusbcontroller += 1;
2165
2166 break;
2167
2168 /* We always get an IDE controller, whether we want it or not. */
2169 case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
2170 default:
2171 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2172 _("Unknown controller type: %s"),
2173 virDomainControllerTypeToString(def->type));
2174 goto error;
2175 }
2176
2177 if (qemuBuildDeviceAddressStr(&buf, &def->info, qemuCaps) < 0)
2178 goto error;
2179
2180 if (virBufferError(&buf)) {
2181 virReportOOMError();
2182 goto error;
2183 }
2184
2185 return virBufferContentAndReset(&buf);
2186
2187error:
2188 virBufferFreeAndReset(&buf);
2189 return NULL;
2190}
2191
2192
2193char *
2194qemuBuildNicStr(virDomainNetDefPtr net,
2195 const char *prefix,
2196 int vlan)
2197{
2198 char *str;
2199 if (virAsprintf(&str,
2200 "%smacaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d%s%s%s%s",
2201 prefix ? prefix : "",
2202 net->mac[0], net->mac[1],
2203 net->mac[2], net->mac[3],
2204 net->mac[4], net->mac[5],
2205 vlan,
2206 (net->model ? ",model=" : ""),
2207 (net->model ? net->model : ""),
2208 (net->info.alias ? ",name=" : ""),
2209 (net->info.alias ? net->info.alias : "")) < 0) {
2210 virReportOOMError();
2211 return NULL;
2212 }
2213
2214 return str;
2215}
2216
2217
2218char *
2219qemuBuildNicDevStr(virDomainNetDefPtr net,
2220 int vlan,
2221 int bootindex,
2222 virBitmapPtr qemuCaps)
2223{
2224 virBuffer buf = VIR_BUFFER_INITIALIZER;
2225 const char *nic;
2226 bool usingVirtio = false;
2227
2228 if (!net->model) {
2229 nic = "rtl8139";
2230 } else if (STREQ(net->model, "virtio")) {
2231 nic = "virtio-net-pci";
2232 usingVirtio = true;
2233 } else {
2234 nic = net->model;
2235 }
2236
2237 virBufferAdd(&buf, nic, strlen(nic));
2238 if (usingVirtio && net->driver.virtio.txmode) {
2239 if (qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_TX_ALG)) {
2240 virBufferAddLit(&buf, ",tx=");
2241 switch (net->driver.virtio.txmode) {
2242 case VIR_DOMAIN_NET_VIRTIO_TX_MODE_IOTHREAD:
2243 virBufferAddLit(&buf, "bh");
2244 break;
2245
2246 case VIR_DOMAIN_NET_VIRTIO_TX_MODE_TIMER:
2247 virBufferAddLit(&buf, "timer");
2248 break;
2249 default:
2250 /* this should never happen, if it does, we need
2251 * to add another case to this switch.
2252 */
2253 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2254 _("unrecognized virtio-net-pci 'tx' option"));
2255 goto error;
2256 }
2257 } else {
2258 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2259 _("virtio-net-pci 'tx' option not supported in this QEMU binary"));
2260 goto error;
2261 }
2262 }
2263 if (usingVirtio) {
2264 qemuBuildIoEventFdStr(&buf, net->driver.virtio.ioeventfd, qemuCaps);
2265 if (net->driver.virtio.event_idx &&
2266 qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_EVENT_IDX)) {
2267 virBufferAsprintf(&buf, ",event_idx=%s",
2268 virDomainVirtioEventIdxTypeToString(net->driver.virtio.event_idx));
2269 }
2270 }
2271 if (vlan == -1)
2272 virBufferAsprintf(&buf, ",netdev=host%s", net->info.alias);
2273 else
2274 virBufferAsprintf(&buf, ",vlan=%d", vlan);
2275 virBufferAsprintf(&buf, ",id=%s", net->info.alias);
2276 virBufferAsprintf(&buf, ",mac=%02x:%02x:%02x:%02x:%02x:%02x",
2277 net->mac[0], net->mac[1],
2278 net->mac[2], net->mac[3],
2279 net->mac[4], net->mac[5]);
2280 if (qemuBuildDeviceAddressStr(&buf, &net->info, qemuCaps) < 0)
2281 goto error;
2282 if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
2283 virBufferAsprintf(&buf, ",bootindex=%d", bootindex);
2284
2285 if (virBufferError(&buf)) {
2286 virReportOOMError();
2287 goto error;
2288 }
2289
2290 return virBufferContentAndReset(&buf);
2291
2292error:
2293 virBufferFreeAndReset(&buf);
2294 return NULL;
2295}
2296
2297
2298char *
2299qemuBuildHostNetStr(virDomainNetDefPtr net,
2300 char type_sep,
2301 int vlan,
2302 const char *tapfd,
2303 const char *vhostfd)
2304{
2305 bool is_tap = false;
2306 virBuffer buf = VIR_BUFFER_INITIALIZER;
2307
2308 switch (virDomainNetGetActualType(net)) {
2309 case VIR_DOMAIN_NET_TYPE_NETWORK:
2310 case VIR_DOMAIN_NET_TYPE_BRIDGE:
2311 case VIR_DOMAIN_NET_TYPE_DIRECT:
2312 virBufferAddLit(&buf, "tap");
2313 virBufferAsprintf(&buf, "%cfd=%s", type_sep, tapfd);
2314 type_sep = ',';
2315 is_tap = true;
2316 break;
2317
2318 case VIR_DOMAIN_NET_TYPE_ETHERNET:
2319 virBufferAddLit(&buf, "tap");
2320 if (net->ifname) {
2321 virBufferAsprintf(&buf, "%cifname=%s", type_sep, net->ifname);
2322 type_sep = ',';
2323 }
2324 if (net->data.ethernet.script) {
2325 virBufferAsprintf(&buf, "%cscript=%s", type_sep,
2326 net->data.ethernet.script);
2327 type_sep = ',';
2328 }
2329 is_tap = true;
2330 break;
2331
2332 case VIR_DOMAIN_NET_TYPE_CLIENT:
2333 case VIR_DOMAIN_NET_TYPE_SERVER:
2334 case VIR_DOMAIN_NET_TYPE_MCAST:
2335 virBufferAddLit(&buf, "socket");
2336 switch (virDomainNetGetActualType(net)) {
2337 case VIR_DOMAIN_NET_TYPE_CLIENT:
2338 virBufferAsprintf(&buf, "%cconnect=%s:%d",
2339 type_sep,
2340 net->data.socket.address,
2341 net->data.socket.port);
2342 break;
2343 case VIR_DOMAIN_NET_TYPE_SERVER:
2344 virBufferAsprintf(&buf, "%clisten=%s:%d",
2345 type_sep,
2346 net->data.socket.address,
2347 net->data.socket.port);
2348 break;
2349 case VIR_DOMAIN_NET_TYPE_MCAST:
2350 virBufferAsprintf(&buf, "%cmcast=%s:%d",
2351 type_sep,
2352 net->data.socket.address,
2353 net->data.socket.port);
2354 break;
2355 case VIR_DOMAIN_NET_TYPE_USER:
2356 case VIR_DOMAIN_NET_TYPE_ETHERNET:
2357 case VIR_DOMAIN_NET_TYPE_NETWORK:
2358 case VIR_DOMAIN_NET_TYPE_BRIDGE:
2359 case VIR_DOMAIN_NET_TYPE_INTERNAL:
2360 case VIR_DOMAIN_NET_TYPE_DIRECT:
2361 case VIR_DOMAIN_NET_TYPE_LAST:
2362 break;
2363 }
2364 type_sep = ',';
2365 break;
2366
2367 case VIR_DOMAIN_NET_TYPE_USER:
2368 default:
2369 virBufferAddLit(&buf, "user");
2370 break;
2371 }
2372
2373 if (vlan >= 0) {
2374 virBufferAsprintf(&buf, "%cvlan=%d", type_sep, vlan);
2375 if (net->info.alias)
2376 virBufferAsprintf(&buf, ",name=host%s",
2377 net->info.alias);
2378 } else {
2379 virBufferAsprintf(&buf, "%cid=host%s",
2380 type_sep, net->info.alias);
2381 }
2382
2383 if (is_tap) {
2384 if (vhostfd && *vhostfd)
2385 virBufferAsprintf(&buf, ",vhost=on,vhostfd=%s", vhostfd);
2386 if (net->tune.sndbuf_specified)
2387 virBufferAsprintf(&buf, ",sndbuf=%lu", net->tune.sndbuf);
2388 }
2389
2390 if (virBufferError(&buf)) {
2391 virBufferFreeAndReset(&buf);
2392 virReportOOMError();
2393 return NULL;
2394 }
2395
2396 return virBufferContentAndReset(&buf);
2397}
2398
2399
2400char *
2401qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev,
2402 virBitmapPtr qemuCaps)
2403{
2404 virBuffer buf = VIR_BUFFER_INITIALIZER;
2405
2406 const char *model = virDomainWatchdogModelTypeToString(dev->model);
2407 if (!model) {
2408 qemuReportError(VIR_ERR_INTERNAL_ERROR,
2409 "%s", _("missing watchdog model"));
2410 goto error;
2411 }
2412
2413 virBufferAsprintf(&buf, "%s,id=%s", model, dev->info.alias);
2414 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2415 goto error;
2416
2417 if (virBufferError(&buf)) {
2418 virReportOOMError();
2419 goto error;
2420 }
2421
2422 return virBufferContentAndReset(&buf);
2423
2424error:
2425 virBufferFreeAndReset(&buf);
2426 return NULL;
2427}
2428
2429
2430char *
2431qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev,
2432 virBitmapPtr qemuCaps)
2433{
2434 virBuffer buf = VIR_BUFFER_INITIALIZER;
2435
2436 virBufferAddLit(&buf, "virtio-balloon-pci");
2437 virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2438 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2439 goto error;
2440
2441 if (virBufferError(&buf)) {
2442 virReportOOMError();
2443 goto error;
2444 }
2445
2446 return virBufferContentAndReset(&buf);
2447
2448error:
2449 virBufferFreeAndReset(&buf);
2450 return NULL;
2451}
2452
2453
2454char *
2455qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
2456 virBitmapPtr qemuCaps)
2457{
2458 virBuffer buf = VIR_BUFFER_INITIALIZER;
2459
2460 virBufferAsprintf(&buf, "%s,id=%s",
2461 dev->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ?
2462 "usb-mouse" : "usb-tablet", dev->info.alias);
2463
2464 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2465 goto error;
2466
2467 if (virBufferError(&buf)) {
2468 virReportOOMError();
2469 goto error;
2470 }
2471
2472 return virBufferContentAndReset(&buf);
2473
2474error:
2475 virBufferFreeAndReset(&buf);
2476 return NULL;
2477}
2478
2479
2480char *
2481qemuBuildSoundDevStr(virDomainSoundDefPtr sound,
2482 virBitmapPtr qemuCaps)
2483{
2484 virBuffer buf = VIR_BUFFER_INITIALIZER;
2485 const char *model = virDomainSoundModelTypeToString(sound->model);
2486
2487 if (!model) {
2488 qemuReportError(VIR_ERR_INTERNAL_ERROR,
2489 "%s", _("invalid sound model"));
2490 goto error;
2491 }
2492
2493 /* Hack for weirdly unusual devices name in QEMU */
2494 if (STREQ(model, "es1370"))
2495 model = "ES1370";
2496 else if (STREQ(model, "ac97"))
2497 model = "AC97";
2498 else if (STREQ(model, "ich6"))
2499 model = "intel-hda";
2500
2501 virBufferAsprintf(&buf, "%s,id=%s", model, sound->info.alias);
2502 if (qemuBuildDeviceAddressStr(&buf, &sound->info, qemuCaps) < 0)
2503 goto error;
2504
2505 if (virBufferError(&buf)) {
2506 virReportOOMError();
2507 goto error;
2508 }
2509
2510 return virBufferContentAndReset(&buf);
2511
2512error:
2513 virBufferFreeAndReset(&buf);
2514 return NULL;
2515}
2516
2517static char *
2518qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
2519 const char *codec)
2520{
2521 virBuffer buf = VIR_BUFFER_INITIALIZER;
2522 int cad = 0;
2523
2524 virBufferAsprintf(&buf, "%s,id=%s-codec%d,bus=%s.0,cad=%d",
2525 codec, sound->info.alias, cad, sound->info.alias, cad);
2526
2527 if (virBufferError(&buf)) {
2528 virReportOOMError();
2529 goto error;
2530 }
2531
2532 return virBufferContentAndReset(&buf);
2533
2534error:
2535 virBufferFreeAndReset(&buf);
2536 return NULL;
2537}
2538
2539static char *
2540qemuBuildVideoDevStr(virDomainVideoDefPtr video,
2541 virBitmapPtr qemuCaps)
2542{
2543 virBuffer buf = VIR_BUFFER_INITIALIZER;
2544 const char *model = qemuVideoTypeToString(video->type);
2545
2546 if (!model) {
2547 qemuReportError(VIR_ERR_INTERNAL_ERROR,
2548 "%s", _("invalid video model"));
2549 goto error;
2550 }
2551
2552 virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
2553
2554 if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
2555 if (video->vram > (UINT_MAX / 1024)) {
2556 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2557 _("value for 'vram' must be less than '%u'"),
2558 UINT_MAX / 1024);
2559 goto error;
2560 }
2561
2562 /* QEMU accepts bytes for vram_size. */
2563 virBufferAsprintf(&buf, ",vram_size=%u", video->vram * 1024);
2564 }
2565
2566 if (qemuBuildDeviceAddressStr(&buf, &video->info, qemuCaps) < 0)
2567 goto error;
2568
2569 if (virBufferError(&buf)) {
2570 virReportOOMError();
2571 goto error;
2572 }
2573
2574 return virBufferContentAndReset(&buf);
2575
2576error:
2577 virBufferFreeAndReset(&buf);
2578 return NULL;
2579}
2580
2581
2582int
2583qemuOpenPCIConfig(virDomainHostdevDefPtr dev)
2584{
2585 char *path = NULL;
2586 int configfd = -1;
2587
2588 if (virAsprintf(&path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/config",
2589 dev->source.subsys.u.pci.domain,
2590 dev->source.subsys.u.pci.bus,
2591 dev->source.subsys.u.pci.slot,
2592 dev->source.subsys.u.pci.function) < 0) {
2593 virReportOOMError();
2594 return -1;
2595 }
2596
2597 configfd = open(path, O_RDWR, 0);
2598
2599 if (configfd < 0)
2600 virReportSystemError(errno, _("Failed opening %s"), path);
2601
2602 VIR_FREE(path);
2603
2604 return configfd;
2605}
2606
2607char *
2608qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev, const char *configfd,
2609 virBitmapPtr qemuCaps)
2610{
2611 virBuffer buf = VIR_BUFFER_INITIALIZER;
2612
2613 virBufferAddLit(&buf, "pci-assign");
2614 virBufferAsprintf(&buf, ",host=%.2x:%.2x.%.1x",
2615 dev->source.subsys.u.pci.bus,
2616 dev->source.subsys.u.pci.slot,
2617 dev->source.subsys.u.pci.function);
2618 virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2619 if (configfd && *configfd)
2620 virBufferAsprintf(&buf, ",configfd=%s", configfd);
2621 if (dev->bootIndex)
2622 virBufferAsprintf(&buf, ",bootindex=%d", dev->bootIndex);
2623 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2624 goto error;
2625
2626 if (dev->rombar) {
2627 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_ROMBAR)) {
2628 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2629 "%s", _("rombar not supported in this QEMU binary"));
2630 goto error;
2631 }
2632
2633 switch (dev->rombar) {
2634 case VIR_DOMAIN_PCI_ROMBAR_OFF:
2635 virBufferAddLit(&buf, ",rombar=0");
2636 break;
2637 case VIR_DOMAIN_PCI_ROMBAR_ON:
2638 virBufferAddLit(&buf, ",rombar=1");
2639 break;
2640 default:
2641 break;
2642 }
2643 }
2644
2645 if (virBufferError(&buf)) {
2646 virReportOOMError();
2647 goto error;
2648 }
2649
2650 return virBufferContentAndReset(&buf);
2651
2652error:
2653 virBufferFreeAndReset(&buf);
2654 return NULL;
2655}
2656
2657
2658char *
2659qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev)
2660{
2661 char *ret = NULL;
2662
2663 if (virAsprintf(&ret, "host=%.2x:%.2x.%.1x",
2664 dev->source.subsys.u.pci.bus,
2665 dev->source.subsys.u.pci.slot,
2666 dev->source.subsys.u.pci.function) < 0)
2667 virReportOOMError();
2668
2669 return ret;
2670}
2671
2672
2673char *
2674qemuBuildRedirdevDevStr(virDomainRedirdevDefPtr dev,
2675 virBitmapPtr qemuCaps)
2676{
2677 virBuffer buf = VIR_BUFFER_INITIALIZER;
2678
2679 if (dev->bus != VIR_DOMAIN_REDIRDEV_BUS_USB) {
2680 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2681 _("Redirection bus %s is not supported by QEMU"),
2682 virDomainRedirdevBusTypeToString(dev->bus));
2683 goto error;
2684 }
2685
2686 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_USB_REDIR)) {
2687 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2688 _("USB redirection is not supported "
2689 "by this version of QEMU"));
2690 goto error;
2691 }
2692
2693 virBufferAsprintf(&buf, "usb-redir,chardev=char%s,id=%s",
2694 dev->info.alias,
2695 dev->info.alias);
2696
2697 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2698 goto error;
2699
2700 if (virBufferError(&buf)) {
2701 virReportOOMError();
2702 goto error;
2703 }
2704
2705 return virBufferContentAndReset(&buf);
2706
2707error:
2708 virBufferFreeAndReset(&buf);
2709 return NULL;
2710}
2711
2712char *
2713qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
2714 virBitmapPtr qemuCaps)
2715{
2716 virBuffer buf = VIR_BUFFER_INITIALIZER;
2717
2718 if (!dev->source.subsys.u.usb.bus &&
2719 !dev->source.subsys.u.usb.device) {
2720 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2721 _("USB host device is missing bus/device information"));
2722 return NULL;
2723 }
2724
2725 virBufferAsprintf(&buf, "usb-host,hostbus=%d,hostaddr=%d,id=%s",
2726 dev->source.subsys.u.usb.bus,
2727 dev->source.subsys.u.usb.device,
2728 dev->info.alias);
2729
2730 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2731 goto error;
2732
2733 if (virBufferError(&buf)) {
2734 virReportOOMError();
2735 goto error;
2736 }
2737
2738 return virBufferContentAndReset(&buf);
2739
2740error:
2741 virBufferFreeAndReset(&buf);
2742 return NULL;
2743}
2744
2745
2746char *
2747qemuBuildHubDevStr(virDomainHubDefPtr dev,
2748 virBitmapPtr qemuCaps)
2749{
2750 virBuffer buf = VIR_BUFFER_INITIALIZER;
2751
2752 if (dev->type != VIR_DOMAIN_HUB_TYPE_USB) {
2753 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2754 _("hub type %s not supported"),
2755 virDomainHubTypeToString(dev->type));
2756 goto error;
2757 }
2758
2759 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) {
2760 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2761 _("usb-hub not supported by QEMU binary"));
2762 goto error;
2763 }
2764
2765 virBufferAddLit(&buf, "usb-hub");
2766 virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2767 if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2768 goto error;
2769
2770 if (virBufferError(&buf)) {
2771 virReportOOMError();
2772 goto error;
2773 }
2774
2775 return virBufferContentAndReset(&buf);
2776
2777error:
2778 virBufferFreeAndReset(&buf);
2779 return NULL;
2780}
2781
2782
2783char *
2784qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
2785{
2786 char *ret = NULL;
2787
2788 if (!dev->source.subsys.u.usb.bus &&
2789 !dev->source.subsys.u.usb.device) {
2790 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2791 _("USB host device is missing bus/device information"));
2792 return NULL;
2793 }
2794
2795 if (virAsprintf(&ret, "host:%d.%d",
2796 dev->source.subsys.u.usb.bus,
2797 dev->source.subsys.u.usb.device) < 0)
2798 virReportOOMError();
2799
2800 return ret;
2801}
2802
2803
2804
2805/* This function outputs a -chardev command line option which describes only the
2806 * host side of the character device */
2807static char *
2808qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias,
2809 virBitmapPtr qemuCaps)
2810{
2811 virBuffer buf = VIR_BUFFER_INITIALIZER;
2812 bool telnet;
2813
2814 switch(dev->type) {
2815 case VIR_DOMAIN_CHR_TYPE_NULL:
2816 virBufferAsprintf(&buf, "null,id=char%s", alias);
2817 break;
2818
2819 case VIR_DOMAIN_CHR_TYPE_VC:
2820 virBufferAsprintf(&buf, "vc,id=char%s", alias);
2821 break;
2822
2823 case VIR_DOMAIN_CHR_TYPE_PTY:
2824 virBufferAsprintf(&buf, "pty,id=char%s", alias);
2825 break;
2826
2827 case VIR_DOMAIN_CHR_TYPE_DEV:
2828 virBufferAsprintf(&buf, "tty,id=char%s,path=%s", alias,
2829 dev->data.file.path);
2830 break;
2831
2832 case VIR_DOMAIN_CHR_TYPE_FILE:
2833 virBufferAsprintf(&buf, "file,id=char%s,path=%s", alias,
2834 dev->data.file.path);
2835 break;
2836
2837 case VIR_DOMAIN_CHR_TYPE_PIPE:
2838 virBufferAsprintf(&buf, "pipe,id=char%s,path=%s", alias,
2839 dev->data.file.path);
2840 break;
2841
2842 case VIR_DOMAIN_CHR_TYPE_STDIO:
2843 virBufferAsprintf(&buf, "stdio,id=char%s", alias);
2844 break;
2845
2846 case VIR_DOMAIN_CHR_TYPE_UDP: {
2847 const char *connectHost = dev->data.udp.connectHost;
2848 const char *bindHost = dev->data.udp.bindHost;
2849 const char *bindService = dev->data.udp.bindService;
2850
2851 if (connectHost == NULL)
2852 connectHost = "";
2853 if (bindHost == NULL)
2854 bindHost = "";
2855 if (bindService == NULL)
2856 bindService = "0";
2857
2858 virBufferAsprintf(&buf,
2859 "udp,id=char%s,host=%s,port=%s,localaddr=%s,"
2860 "localport=%s",
2861 alias,
2862 connectHost,
2863 dev->data.udp.connectService,
2864 bindHost, bindService);
2865 break;
2866 }
2867 case VIR_DOMAIN_CHR_TYPE_TCP:
2868 telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
2869 virBufferAsprintf(&buf,
2870 "socket,id=char%s,host=%s,port=%s%s%s",
2871 alias,
2872 dev->data.tcp.host,
2873 dev->data.tcp.service,
2874 telnet ? ",telnet" : "",
2875 dev->data.tcp.listen ? ",server,nowait" : "");
2876 break;
2877
2878 case VIR_DOMAIN_CHR_TYPE_UNIX:
2879 virBufferAsprintf(&buf,
2880 "socket,id=char%s,path=%s%s",
2881 alias,
2882 dev->data.nix.path,
2883 dev->data.nix.listen ? ",server,nowait" : "");
2884 break;
2885
2886 case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
2887 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC)) {
2888 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2889 _("spicevmc not supported in this QEMU binary"));
2890 goto error;
2891 }
2892 virBufferAsprintf(&buf, "spicevmc,id=char%s,name=%s", alias,
2893 virDomainChrSpicevmcTypeToString(dev->data.spicevmc));
2894 break;
2895
2896 default:
2897 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2898 _("unsupported chardev '%s'"),
2899 virDomainChrTypeToString(dev->type));
2900 goto error;
2901 }
2902
2903 if (virBufferError(&buf)) {
2904 virReportOOMError();
2905 goto error;
2906 }
2907
2908 return virBufferContentAndReset(&buf);
2909
2910error:
2911 virBufferFreeAndReset(&buf);
2912 return NULL;
2913}
2914
2915
2916static char *
2917qemuBuildChrArgStr(virDomainChrSourceDefPtr dev, const char *prefix)
2918{
2919 virBuffer buf = VIR_BUFFER_INITIALIZER;
2920
2921 if (prefix)
2922 virBufferAdd(&buf, prefix, strlen(prefix));
2923
2924 switch (dev->type) {
2925 case VIR_DOMAIN_CHR_TYPE_NULL:
2926 virBufferAddLit(&buf, "null");
2927 break;
2928
2929 case VIR_DOMAIN_CHR_TYPE_VC:
2930 virBufferAddLit(&buf, "vc");
2931 break;
2932
2933 case VIR_DOMAIN_CHR_TYPE_PTY:
2934 virBufferAddLit(&buf, "pty");
2935 break;
2936
2937 case VIR_DOMAIN_CHR_TYPE_DEV:
2938 virBufferStrcat(&buf, dev->data.file.path, NULL);
2939 break;
2940
2941 case VIR_DOMAIN_CHR_TYPE_FILE:
2942 virBufferAsprintf(&buf, "file:%s", dev->data.file.path);
2943 break;
2944
2945 case VIR_DOMAIN_CHR_TYPE_PIPE:
2946 virBufferAsprintf(&buf, "pipe:%s", dev->data.file.path);
2947 break;
2948
2949 case VIR_DOMAIN_CHR_TYPE_STDIO:
2950 virBufferAddLit(&buf, "stdio");
2951 break;
2952
2953 case VIR_DOMAIN_CHR_TYPE_UDP: {
2954 const char *connectHost = dev->data.udp.connectHost;
2955 const char *bindHost = dev->data.udp.bindHost;
2956 const char *bindService = dev->data.udp.bindService;
2957
2958 if (connectHost == NULL)
2959 connectHost = "";
2960 if (bindHost == NULL)
2961 bindHost = "";
2962 if (bindService == NULL)
2963 bindService = "0";
2964
2965 virBufferAsprintf(&buf, "udp:%s:%s@%s:%s",
2966 connectHost,
2967 dev->data.udp.connectService,
2968 bindHost,
2969 bindService);
2970 break;
2971 }
2972 case VIR_DOMAIN_CHR_TYPE_TCP:
2973 if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
2974 virBufferAsprintf(&buf, "telnet:%s:%s%s",
2975 dev->data.tcp.host,
2976 dev->data.tcp.service,
2977 dev->data.tcp.listen ? ",server,nowait" : "");
2978 } else {
2979 virBufferAsprintf(&buf, "tcp:%s:%s%s",
2980 dev->data.tcp.host,
2981 dev->data.tcp.service,
2982 dev->data.tcp.listen ? ",server,nowait" : "");
2983 }
2984 break;
2985
2986 case VIR_DOMAIN_CHR_TYPE_UNIX:
2987 virBufferAsprintf(&buf, "unix:%s%s",
2988 dev->data.nix.path,
2989 dev->data.nix.listen ? ",server,nowait" : "");
2990 break;
2991 }
2992
2993 if (virBufferError(&buf)) {
2994 virReportOOMError();
2995 goto error;
2996 }
2997
2998 return virBufferContentAndReset(&buf);
2999
3000error:
3001 virBufferFreeAndReset(&buf);
3002 return NULL;
3003}
3004
3005
3006static char *
3007qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev,
3008 virBitmapPtr qemuCaps)
3009{
3010 virBuffer buf = VIR_BUFFER_INITIALIZER;
3011 switch (dev->deviceType) {
3012 case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
3013 virBufferAddLit(&buf, "virtconsole");
3014 break;
3015 case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
3016 /* Legacy syntax '-device spicevmc' */
3017 if (dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3018 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC)) {
3019 virBufferAddLit(&buf, "spicevmc");
3020 } else {
3021 virBufferAddLit(&buf, "virtserialport");
3022 }
3023 break;
3024 default:
3025 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3026 _("Cannot use virtio serial for parallel/serial devices"));
3027 return NULL;
3028 }
3029
3030 if (dev->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
3031 /* Check it's a virtio-serial address */
3032 if (dev->info.type !=
3033 VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL)
3034 {
3035 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3036 "%s", _("virtio serial device has invalid address type"));
3037 goto error;
3038 }
3039
3040 virBufferAsprintf(&buf,
3041 ",bus=" QEMU_VIRTIO_SERIAL_PREFIX "%d.%d",
3042 dev->info.addr.vioserial.controller,
3043 dev->info.addr.vioserial.bus);
3044 virBufferAsprintf(&buf,
3045 ",nr=%d",
3046 dev->info.addr.vioserial.port);
3047 }
3048
3049 if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3050 dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3051 dev->target.name &&
3052 STRNEQ(dev->target.name, "com.redhat.spice.0")) {
3053 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3054 _("Unsupported spicevmc target name '%s'"),
3055 dev->target.name);
3056 goto error;
3057 }
3058
3059 if (!(dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3060 dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3061 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC))) {
3062 virBufferAsprintf(&buf, ",chardev=char%s,id=%s",
3063 dev->info.alias, dev->info.alias);
3064 if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3065 dev->target.name) {
3066 virBufferAsprintf(&buf, ",name=%s", dev->target.name);
3067 }
3068 } else {
3069 virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
3070 }
3071 if (virBufferError(&buf)) {
3072 virReportOOMError();
3073 goto error;
3074 }
3075
3076 return virBufferContentAndReset(&buf);
3077
3078error:
3079 virBufferFreeAndReset(&buf);
3080 return NULL;
3081}
3082
3083static char *qemuBuildSmbiosBiosStr(virSysinfoDefPtr def)
3084{
3085 virBuffer buf = VIR_BUFFER_INITIALIZER;
3086
3087 if ((def->bios_vendor == NULL) && (def->bios_version == NULL) &&
3088 (def->bios_date == NULL) && (def->bios_release == NULL))
3089 return(NULL);
3090
3091 virBufferAddLit(&buf, "type=0");
3092
3093 /* 0:Vendor */
3094 if (def->bios_vendor)
3095 virBufferAsprintf(&buf, ",vendor=%s", def->bios_vendor);
3096 /* 0:BIOS Version */
3097 if (def->bios_version)
3098 virBufferAsprintf(&buf, ",version=%s", def->bios_version);
3099 /* 0:BIOS Release Date */
3100 if (def->bios_date)
3101 virBufferAsprintf(&buf, ",date=%s", def->bios_date);
3102 /* 0:System BIOS Major Release and 0:System BIOS Minor Release */
3103 if (def->bios_release)
3104 virBufferAsprintf(&buf, ",release=%s", def->bios_release);
3105
3106 if (virBufferError(&buf)) {
3107 virReportOOMError();
3108 goto error;
3109 }
3110
3111 return virBufferContentAndReset(&buf);
3112
3113error:
3114 virBufferFreeAndReset(&buf);
3115 return(NULL);
3116}
3117
3118static char *qemuBuildSmbiosSystemStr(virSysinfoDefPtr def, bool skip_uuid)
3119{
3120 virBuffer buf = VIR_BUFFER_INITIALIZER;
3121
3122 if ((def->system_manufacturer == NULL) && (def->system_sku == NULL) &&
3123 (def->system_product == NULL) && (def->system_version == NULL) &&
3124 (def->system_serial == NULL) && (def->system_family == NULL) &&
3125 (def->system_uuid == NULL || skip_uuid))
3126 return NULL;
3127
3128 virBufferAddLit(&buf, "type=1");
3129
3130 /* 1:Manufacturer */
3131 if (def->system_manufacturer)
3132 virBufferAsprintf(&buf, ",manufacturer=%s",
3133 def->system_manufacturer);
3134 /* 1:Product Name */
3135 if (def->system_product)
3136 virBufferAsprintf(&buf, ",product=%s", def->system_product);
3137 /* 1:Version */
3138 if (def->system_version)
3139 virBufferAsprintf(&buf, ",version=%s", def->system_version);
3140 /* 1:Serial Number */
3141 if (def->system_serial)
3142 virBufferAsprintf(&buf, ",serial=%s", def->system_serial);
3143 /* 1:UUID */
3144 if (def->system_uuid && !skip_uuid)
3145 virBufferAsprintf(&buf, ",uuid=%s", def->system_uuid);
3146 /* 1:SKU Number */
3147 if (def->system_sku)
3148 virBufferAsprintf(&buf, ",sku=%s", def->system_sku);
3149 /* 1:Family */
3150 if (def->system_family)
3151 virBufferAsprintf(&buf, ",family=%s", def->system_family);
3152
3153 if (virBufferError(&buf)) {
3154 virReportOOMError();
3155 goto error;
3156 }
3157
3158 return virBufferContentAndReset(&buf);
3159
3160error:
3161 virBufferFreeAndReset(&buf);
3162 return(NULL);
3163}
3164
3165static char *
3166qemuBuildClockArgStr(virDomainClockDefPtr def)
3167{
3168 virBuffer buf = VIR_BUFFER_INITIALIZER;
3169
3170 switch (def->offset) {
3171 case VIR_DOMAIN_CLOCK_OFFSET_UTC:
3172 virBufferAddLit(&buf, "base=utc");
3173 break;
3174
3175 case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
3176 case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE:
3177 virBufferAddLit(&buf, "base=localtime");
3178 break;
3179
3180 case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: {
3181 time_t now = time(NULL);
3182 struct tm nowbits;
3183
3184 now += def->data.adjustment;
3185 gmtime_r(&now, &nowbits);
3186
3187 virBufferAsprintf(&buf, "base=%d-%02d-%02dT%02d:%02d:%02d",
3188 nowbits.tm_year + 1900,
3189 nowbits.tm_mon + 1,
3190 nowbits.tm_mday,
3191 nowbits.tm_hour,
3192 nowbits.tm_min,
3193 nowbits.tm_sec);
3194 } break;
3195
3196 default:
3197 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3198 _("unsupported clock offset '%s'"),
3199 virDomainClockOffsetTypeToString(def->offset));
3200 goto error;
3201 }
3202
3203 /* Look for an 'rtc' timer element, and add in appropriate clock= and driftfix= */
3204 int i;
3205 for (i = 0; i < def->ntimers; i++) {
3206 if (def->timers[i]->name == VIR_DOMAIN_TIMER_NAME_RTC) {
3207 switch (def->timers[i]->track) {
3208 case -1: /* unspecified - use hypervisor default */
3209 break;
3210 case VIR_DOMAIN_TIMER_TRACK_BOOT:
3211 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3212 _("unsupported rtc timer track '%s'"),
3213 virDomainTimerTrackTypeToString(def->timers[i]->track));
3214 goto error;
3215 case VIR_DOMAIN_TIMER_TRACK_GUEST:
3216 virBufferAddLit(&buf, ",clock=vm");
3217 break;
3218 case VIR_DOMAIN_TIMER_TRACK_WALL:
3219 virBufferAddLit(&buf, ",clock=host");
3220 break;
3221 }
3222
3223 switch (def->timers[i]->tickpolicy) {
3224 case -1:
3225 case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3226 /* This is the default - missed ticks delivered when
3227 next scheduled, at normal rate */
3228 break;
3229 case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3230 /* deliver ticks at a faster rate until caught up */
3231 virBufferAddLit(&buf, ",driftfix=slew");
3232 break;
3233 case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3234 case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3235 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3236 _("unsupported rtc timer tickpolicy '%s'"),
3237 virDomainTimerTickpolicyTypeToString(def->timers[i]->tickpolicy));
3238 goto error;
3239 }
3240 break; /* no need to check other timers - there is only one rtc */
3241 }
3242 }
3243
3244 if (virBufferError(&buf)) {
3245 virReportOOMError();
3246 goto error;
3247 }
3248
3249 return virBufferContentAndReset(&buf);
3250
3251error:
3252 virBufferFreeAndReset(&buf);
3253 return NULL;
3254}
3255
3256
3257static int
3258qemuBuildCpuArgStr(const struct qemud_driver *driver,
3259 const virDomainDefPtr def,
3260 const char *emulator,
3261 virBitmapPtr qemuCaps,
3262 const struct utsname *ut,
3263 char **opt,
3264 bool *hasHwVirt)
3265{
3266 const virCPUDefPtr host = driver->caps->host.cpu;
3267 virCPUDefPtr guest = NULL;
3268 unsigned int ncpus = 0;
3269 const char **cpus = NULL;
3270 union cpuData *data = NULL;
3271 int ret = -1;
3272 virBuffer buf = VIR_BUFFER_INITIALIZER;
3273 int i;
3274
3275 *hasHwVirt = false;
3276
3277 if (def->cpu && def->cpu->model) {
3278 if (host &&
3279 qemuCapsProbeCPUModels(emulator, qemuCaps, host->arch,
3280 &ncpus, &cpus) < 0)
3281 goto cleanup;
3282
3283 if (!ncpus || !host) {
3284 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3285 _("CPU specification not supported by hypervisor"));
3286 goto cleanup;
3287 }
3288 }
3289
3290 if (ncpus > 0 && host) {
3291 virCPUCompareResult cmp;
3292 const char *preferred;
3293 int hasSVM;
3294
3295 cmp = cpuGuestData(host, def->cpu, &data);
3296 switch (cmp) {
3297 case VIR_CPU_COMPARE_INCOMPATIBLE:
3298 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3299 "%s", _("guest CPU is not compatible with host CPU"));
3300 /* fall through */
3301 case VIR_CPU_COMPARE_ERROR:
3302 goto cleanup;
3303
3304 default:
3305 break;
3306 }
3307
3308 if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(host->arch)))
3309 goto no_memory;
3310
3311 if (def->cpu->match == VIR_CPU_MATCH_MINIMUM)
3312 preferred = host->model;
3313 else
3314 preferred = def->cpu->model;
3315
3316 guest->type = VIR_CPU_TYPE_GUEST;
3317 if (cpuDecode(guest, data, cpus, ncpus, preferred) < 0)
3318 goto cleanup;
3319
3320 /* Only 'svm' requires --enable-nesting. The nested
3321 * 'vmx' patches now simply hook off the CPU features
3322 */
3323 hasSVM = cpuHasFeature(guest->arch, data, "svm");
3324 if (hasSVM < 0)
3325 goto cleanup;
3326 *hasHwVirt = hasSVM > 0 ? true : false;
3327
3328 virBufferAdd(&buf, guest->model, -1);
3329 for (i = 0; i < guest->nfeatures; i++) {
3330 char sign;
3331 if (guest->features[i].policy == VIR_CPU_FEATURE_DISABLE)
3332 sign = '-';
3333 else
3334 sign = '+';
3335
3336 virBufferAsprintf(&buf, ",%c%s", sign, guest->features[i].name);
3337 }
3338 }
3339 else {
3340 /*
3341 * Need to force a 32-bit guest CPU type if
3342 *
3343 * 1. guest OS is i686
3344 * 2. host OS is x86_64
3345 * 3. emulator is qemu-kvm or kvm
3346 *
3347 * Or
3348 *
3349 * 1. guest OS is i686
3350 * 2. emulator is qemu-system-x86_64
3351 */
3352 if (STREQ(def->os.arch, "i686") &&
3353 ((STREQ(ut->machine, "x86_64") &&
3354 strstr(emulator, "kvm")) ||
3355 strstr(emulator, "x86_64")))
3356 virBufferAddLit(&buf, "qemu32");
3357 }
3358
3359 if (virBufferError(&buf))
3360 goto no_memory;
3361
3362 *opt = virBufferContentAndReset(&buf);
3363
3364 ret = 0;
3365
3366cleanup:
3367 if (guest)
3368 cpuDataFree(guest->arch, data);
3369 virCPUDefFree(guest);
3370
3371 if (cpus) {
3372 for (i = 0; i < ncpus; i++)
3373 VIR_FREE(cpus[i]);
3374 VIR_FREE(cpus);
3375 }
3376
3377 return ret;
3378
3379no_memory:
3380 virReportOOMError();
3381 goto cleanup;
3382}
3383
3384static char *
3385qemuBuildSmpArgStr(const virDomainDefPtr def,
3386 virBitmapPtr qemuCaps)
3387{
3388 virBuffer buf = VIR_BUFFER_INITIALIZER;
3389
3390 virBufferAsprintf(&buf, "%u", def->vcpus);
3391
3392 if (qemuCapsGet(qemuCaps, QEMU_CAPS_SMP_TOPOLOGY)) {
3393 if (def->vcpus != def->maxvcpus)
3394 virBufferAsprintf(&buf, ",maxcpus=%u", def->maxvcpus);
3395 /* sockets, cores, and threads are either all zero
3396 * or all non-zero, thus checking one of them is enough */
3397 if (def->cpu && def->cpu->sockets) {
3398 virBufferAsprintf(&buf, ",sockets=%u", def->cpu->sockets);
3399 virBufferAsprintf(&buf, ",cores=%u", def->cpu->cores);
3400 virBufferAsprintf(&buf, ",threads=%u", def->cpu->threads);
3401 }
3402 else {
3403 virBufferAsprintf(&buf, ",sockets=%u", def->maxvcpus);
3404 virBufferAsprintf(&buf, ",cores=%u", 1);
3405 virBufferAsprintf(&buf, ",threads=%u", 1);
3406 }
3407 } else if (def->vcpus != def->maxvcpus) {
3408 virBufferFreeAndReset(&buf);
3409 /* FIXME - consider hot-unplugging cpus after boot for older qemu */
3410 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3411 _("setting current vcpu count less than maximum is "
3412 "not supported with this QEMU binary"));
3413 return NULL;
3414 }
3415
3416 if (virBufferError(&buf)) {
3417 virBufferFreeAndReset(&buf);
3418 virReportOOMError();
3419 return NULL;
3420 }
3421
3422 return virBufferContentAndReset(&buf);
3423}
3424
3425static void
3426qemuBuildNumaCPUArgStr(char *cpumask, virBufferPtr buf)
3427{
3428 int i, first, last;
3429 int cpuSet = 0;
3430
3431 first = last = 0;
3432 for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
3433 if (cpumask[i]) {
3434 if (cpuSet) {
3435 last = i;
3436 } else {
3437 first = last = i;
3438 cpuSet = 1;
3439 }
3440 } else {
3441 if (!cpuSet)
3442 continue;
3443 if (first == last)
3444 virBufferAsprintf(buf, "%d,", first);
3445 else
3446 virBufferAsprintf(buf, "%d-%d,", first, last);
3447 cpuSet = 0;
3448 }
3449 }
3450
3451 if (cpuSet) {
3452 if (first == last)
3453 virBufferAsprintf(buf, "%d,", first);
3454 else
3455 virBufferAsprintf(buf, "%d-%d,", first, last);
3456 }
3457}
3458
3459static int
3460qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
3461{
3462 int i;
3463 virBuffer buf = VIR_BUFFER_INITIALIZER;
3464
3465 for (i = 0; i < def->cpu->ncells; i++) {
3466 virCommandAddArg(cmd, "-numa");
3467 virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
3468 virBufferAddLit(&buf, ",cpus=");
3469 qemuBuildNumaCPUArgStr(def->cpu->cells[i].cpumask, &buf);
3470 virBufferAsprintf(&buf, "mem=%d",
3471 VIR_DIV_UP(def->cpu->cells[i].mem, 1024));
3472
3473 if (virBufferError(&buf))
3474 goto error;
3475
3476 virCommandAddArgBuffer(cmd, &buf);
3477 }
3478 return 0;
3479
3480error:
3481 virBufferFreeAndReset(&buf);
3482 virReportOOMError();
3483 return -1;
3484}
3485
3486/*
3487 * Constructs a argv suitable for launching qemu with config defined
3488 * for a given virtual machine.
3489 *
3490 * XXX 'conn' is only required to resolve network -> bridge name
3491 * figure out how to remove this requirement some day
3492 */
3493virCommandPtr
3494qemuBuildCommandLine(virConnectPtr conn,
3495 struct qemud_driver *driver,
3496 virDomainDefPtr def,
3497 virDomainChrSourceDefPtr monitor_chr,
3498 bool monitor_json,
3499 virBitmapPtr qemuCaps,
3500 const char *migrateFrom,
3501 int migrateFd,
3502 virDomainSnapshotObjPtr snapshot,
3503 enum virNetDevVPortProfileOp vmop)
3504{
3505 int i;
3506 struct utsname ut;
3507 int disableKQEMU = 0;
3508 int enableKQEMU = 0;
3509 int disableKVM = 0;
3510 int enableKVM = 0;
3511 const char *emulator;
3512 char uuid[VIR_UUID_STRING_BUFLEN];
3513 char *cpu;
3514 char *smp;
3515 int last_good_net = -1;
3516 bool hasHwVirt = false;
3517 virCommandPtr cmd;
3518 bool emitBootindex = false;
3519 int usbcontroller = 0;
3520 bool usblegacy = false;
3521 uname_normalize(&ut);
3522
3523 virUUIDFormat(def->uuid, uuid);
3524
3525 emulator = def->emulator;
3526
3527 /*
3528 * do not use boot=on for drives when not using KVM since this
3529 * is not supported at all in upstream QEmu.
3530 */
3531 if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
3532 (def->virtType == VIR_DOMAIN_VIRT_QEMU))
3533 qemuCapsClear(qemuCaps, QEMU_CAPS_DRIVE_BOOT);
3534
3535 switch (def->virtType) {
3536 case VIR_DOMAIN_VIRT_QEMU:
3537 if (qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU))
3538 disableKQEMU = 1;
3539 if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM))
3540 disableKVM = 1;
3541 break;
3542
3543 case VIR_DOMAIN_VIRT_KQEMU:
3544 if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM))
3545 disableKVM = 1;
3546
3547 if (qemuCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KQEMU)) {
3548 enableKQEMU = 1;
3549 } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU)) {
3550 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3551 _("the QEMU binary %s does not support kqemu"),
3552 emulator);
3553 }
3554 break;
3555
3556 case VIR_DOMAIN_VIRT_KVM:
3557 if (qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU))
3558 disableKQEMU = 1;
3559
3560 if (qemuCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM)) {
3561 enableKVM = 1;
3562 } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
3563 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3564 _("the QEMU binary %s does not support kvm"),
3565 emulator);
3566 }
3567 break;
3568
3569 case VIR_DOMAIN_VIRT_XEN:
3570 /* XXX better check for xenner */
3571 break;
3572
3573 default:
3574 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3575 _("the QEMU binary %s does not support %s"),
3576 emulator, virDomainVirtTypeToString(def->virtType));
3577 break;
3578 }
3579
3580 cmd = virCommandNewArgList(emulator, "-S", NULL);
3581
3582 virCommandAddEnvPassCommon(cmd);
3583
3584 /* This should *never* be NULL, since we always provide
3585 * a machine in the capabilities data for QEMU. So this
3586 * check is just here as a safety in case the unexpected
3587 * happens */
3588 if (def->os.machine)
3589 virCommandAddArgList(cmd, "-M", def->os.machine, NULL);
3590
3591 if (qemuBuildCpuArgStr(driver, def, emulator, qemuCaps,
3592 &ut, &cpu, &hasHwVirt) < 0)
3593 goto error;
3594
3595 if (cpu) {
3596 virCommandAddArgList(cmd, "-cpu", cpu, NULL);
3597 VIR_FREE(cpu);
3598
3599 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NESTING) &&
3600 hasHwVirt)
3601 virCommandAddArg(cmd, "-enable-nesting");
3602 }
3603
3604 if (disableKQEMU)
3605 virCommandAddArg(cmd, "-no-kqemu");
3606 else if (enableKQEMU)
3607 virCommandAddArgList(cmd, "-enable-kqemu", "-kernel-kqemu", NULL);
3608 if (disableKVM)
3609 virCommandAddArg(cmd, "-no-kvm");
3610 if (enableKVM)
3611 virCommandAddArg(cmd, "-enable-kvm");
3612
3613 /* Set '-m MB' based on maxmem, because the lower 'memory' limit
3614 * is set post-startup using the balloon driver. If balloon driver
3615 * is not supported, then they're out of luck anyway
3616 */
3617 virCommandAddArg(cmd, "-m");
3618 virCommandAddArgFormat(cmd, "%lu", VIR_DIV_UP(def->mem.max_balloon, 1024));
3619 if (def->mem.hugepage_backed) {
3620 if (!driver->hugetlbfs_mount) {
3621 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3622 "%s", _("hugetlbfs filesystem is not mounted"));
3623 goto error;
3624 }
3625 if (!driver->hugepage_path) {
3626 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3627 "%s", _("hugepages are disabled by administrator config"));
3628 goto error;
3629 }
3630 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
3631 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3632 _("hugepage backing not supported by '%s'"),
3633 def->emulator);
3634 goto error;
3635 }
3636 virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path",
3637 driver->hugepage_path, NULL);
3638 }
3639
3640 virCommandAddArg(cmd, "-smp");
3641 if (!(smp = qemuBuildSmpArgStr(def, qemuCaps)))
3642 goto error;
3643 virCommandAddArg(cmd, smp);
3644 VIR_FREE(smp);
3645
3646 if (def->cpu && def->cpu->ncells)
3647 if (qemuBuildNumaArgStr(def, cmd) < 0)
3648 goto error;
3649
3650 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NAME)) {
3651 virCommandAddArg(cmd, "-name");
3652 if (driver->setProcessName &&
3653 qemuCapsGet(qemuCaps, QEMU_CAPS_NAME_PROCESS)) {
3654 virCommandAddArgFormat(cmd, "%s,process=qemu:%s",
3655 def->name, def->name);
3656 } else {
3657 virCommandAddArg(cmd, def->name);
3658 }
3659 }
3660 if (qemuCapsGet(qemuCaps, QEMU_CAPS_UUID))
3661 virCommandAddArgList(cmd, "-uuid", uuid, NULL);
3662 if (def->virtType == VIR_DOMAIN_VIRT_XEN ||
3663 STREQ(def->os.type, "xen") ||
3664 STREQ(def->os.type, "linux")) {
3665 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DOMID)) {
3666 virCommandAddArg(cmd, "-domid");
3667 virCommandAddArgFormat(cmd, "%d", def->id);
3668 } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_XEN_DOMID)) {
3669 virCommandAddArg(cmd, "-xen-attach");
3670 virCommandAddArg(cmd, "-xen-domid");
3671 virCommandAddArgFormat(cmd, "%d", def->id);
3672 } else {
3673 qemuReportError(VIR_ERR_INTERNAL_ERROR,
3674 _("qemu emulator '%s' does not support xen"),
3675 def->emulator);
3676 goto error;
3677 }
3678 }
3679
3680 if ((def->os.smbios_mode != VIR_DOMAIN_SMBIOS_NONE) &&
3681 (def->os.smbios_mode != VIR_DOMAIN_SMBIOS_EMULATE)) {
3682 virSysinfoDefPtr source = NULL;
3683 bool skip_uuid = false;
3684
3685 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SMBIOS_TYPE)) {
3686 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3687 _("the QEMU binary %s does not support smbios settings"),
3688 emulator);
3689 goto error;
3690 }
3691
3692 /* should we really error out or just warn in those cases ? */
3693 if (def->os.smbios_mode == VIR_DOMAIN_SMBIOS_HOST) {
3694 if (driver->hostsysinfo == NULL) {
3695 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3696 _("Host SMBIOS information is not available"));
3697 goto error;
3698 }
3699 source = driver->hostsysinfo;
3700 /* Host and guest uuid must differ, by definition of UUID. */
3701 skip_uuid = true;
3702 } else if (def->os.smbios_mode == VIR_DOMAIN_SMBIOS_SYSINFO) {
3703 if (def->sysinfo == NULL) {
3704 qemuReportError(VIR_ERR_XML_ERROR,
3705 _("Domain '%s' sysinfo are not available"),
3706 def->name);
3707 goto error;
3708 }
3709 source = def->sysinfo;
3710 /* domain_conf guaranteed that system_uuid matches guest uuid. */
3711 }
3712 if (source != NULL) {
3713 char *smbioscmd;
3714
3715 smbioscmd = qemuBuildSmbiosBiosStr(source);
3716 if (smbioscmd != NULL) {
3717 virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL);
3718 VIR_FREE(smbioscmd);
3719 }
3720 smbioscmd = qemuBuildSmbiosSystemStr(source, skip_uuid);
3721 if (smbioscmd != NULL) {
3722 virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL);
3723 VIR_FREE(smbioscmd);
3724 }
3725 }
3726 }
3727
3728 /*
3729 * NB, -nographic *MUST* come before any serial, or monitor
3730 * or parallel port flags due to QEMU craziness, where it
3731 * decides to change the serial port & monitor to be on stdout
3732 * if you ask for nographic. So we have to make sure we override
3733 * these defaults ourselves...
3734 */
3735 if (!def->graphics)
3736 virCommandAddArg(cmd, "-nographic");
3737
3738 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
3739 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG))
3740 virCommandAddArg(cmd,
3741 "-nodefconfig"); /* Disable global config files */
3742 virCommandAddArg(cmd,
3743 "-nodefaults"); /* Disable default guest devices */
3744 }
3745
3746 /* Serial graphics adapter */
3747 if (def->os.bios.useserial == VIR_DOMAIN_BIOS_USESERIAL_YES) {
3748 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
3749 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
3750 _("qemu does not support -device"));
3751 goto error;
3752 }
3753 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SGA)) {
3754 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
3755 _("qemu does not support SGA"));
3756 goto error;
3757 }
3758 if (!def->nserials) {
3759 qemuReportError(VIR_ERR_XML_ERROR, "%s",
3760 _("need at least one serial port to use SGA"));
3761 goto error;
3762 }
3763 virCommandAddArgList(cmd, "-device", "sga", NULL);
3764 }
3765
3766 if (monitor_chr) {
3767 char *chrdev;
3768 /* Use -chardev if it's available */
3769 if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV)) {
3770
3771 virCommandAddArg(cmd, "-chardev");
3772 if (!(chrdev = qemuBuildChrChardevStr(monitor_chr, "monitor",
3773 qemuCaps)))
3774 goto error;
3775 virCommandAddArg(cmd, chrdev);
3776 VIR_FREE(chrdev);
3777
3778 virCommandAddArg(cmd, "-mon");
3779 virCommandAddArgFormat(cmd,
3780 "chardev=charmonitor,id=monitor,mode=%s",
3781 monitor_json ? "control" : "readline");
3782 } else {
3783 const char *prefix = NULL;
3784 if (monitor_json)
3785 prefix = "control,";
3786
3787 virCommandAddArg(cmd, "-monitor");
3788 if (!(chrdev = qemuBuildChrArgStr(monitor_chr, prefix)))
3789 goto error;
3790 virCommandAddArg(cmd, chrdev);
3791 VIR_FREE(chrdev);
3792 }
3793 }
3794
3795 if (qemuCapsGet(qemuCaps, QEMU_CAPS_RTC)) {
3796 const char *rtcopt;
3797 virCommandAddArg(cmd, "-rtc");
3798 if (!(rtcopt = qemuBuildClockArgStr(&def->clock)))
3799 goto error;
3800 virCommandAddArg(cmd, rtcopt);
3801 VIR_FREE(rtcopt);
3802 } else {
3803 switch (def->clock.offset) {
3804 case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
3805 case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE:
3806 virCommandAddArg(cmd, "-localtime");
3807 break;
3808
3809 case VIR_DOMAIN_CLOCK_OFFSET_UTC:
3810 /* Nothing, its the default */
3811 break;
3812
3813 default:
3814 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3815 _("unsupported clock offset '%s'"),
3816 virDomainClockOffsetTypeToString(def->clock.offset));
3817 goto error;
3818 }
3819 }
3820 if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE &&
3821 def->clock.data.timezone) {
3822 virCommandAddEnvPair(cmd, "TZ", def->clock.data.timezone);
3823 }
3824
3825 for (i = 0; i < def->clock.ntimers; i++) {
3826 switch (def->clock.timers[i]->name) {
3827 default:
3828 case VIR_DOMAIN_TIMER_NAME_PLATFORM:
3829 case VIR_DOMAIN_TIMER_NAME_TSC:
3830 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3831 _("unsupported timer type (name) '%s'"),
3832 virDomainTimerNameTypeToString(def->clock.timers[i]->name));
3833 goto error;
3834
3835 case VIR_DOMAIN_TIMER_NAME_RTC:
3836 /* This has already been taken care of (in qemuBuildClockArgStr)
3837 if QEMU_CAPS_RTC is set (mutually exclusive with
3838 QEMUD_FLAG_RTC_TD_HACK) */
3839 if (qemuCapsGet(qemuCaps, QEMU_CAPS_RTC_TD_HACK)) {
3840 switch (def->clock.timers[i]->tickpolicy) {
3841 case -1:
3842 case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3843 /* the default - do nothing */
3844 break;
3845 case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3846 virCommandAddArg(cmd, "-rtc-td-hack");
3847 break;
3848 case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3849 case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3850 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3851 _("unsupported rtc tickpolicy '%s'"),
3852 virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3853 goto error;
3854 }
3855 } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_RTC)
3856 && (def->clock.timers[i]->tickpolicy
3857 != VIR_DOMAIN_TIMER_TICKPOLICY_DELAY)
3858 && (def->clock.timers[i]->tickpolicy != -1)) {
3859 /* a non-default rtc policy was given, but there is no
3860 way to implement it in this version of qemu */
3861 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3862 _("unsupported rtc tickpolicy '%s'"),
3863 virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3864 goto error;
3865 }
3866 break;
3867
3868 case VIR_DOMAIN_TIMER_NAME_PIT:
3869 switch (def->clock.timers[i]->tickpolicy) {
3870 case -1:
3871 case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3872 /* delay is the default if we don't have kernel
3873 (-no-kvm-pit), otherwise, the default is catchup. */
3874 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_KVM_PIT))
3875 virCommandAddArg(cmd, "-no-kvm-pit-reinjection");
3876 break;
3877 case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3878 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_KVM_PIT)) {
3879 /* do nothing - this is default for kvm-pit */
3880 } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_TDF)) {
3881 /* -tdf switches to 'catchup' with userspace pit. */
3882 virCommandAddArg(cmd, "-tdf");
3883 } else {
3884 /* can't catchup if we have neither pit mode */
3885 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3886 _("unsupported pit tickpolicy '%s'"),
3887 virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3888 goto error;
3889 }
3890 break;
3891 case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3892 case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3893 /* no way to support these modes for pit in qemu */
3894 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3895 _("unsupported pit tickpolicy '%s'"),
3896 virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3897 goto error;
3898 }
3899 break;
3900
3901 case VIR_DOMAIN_TIMER_NAME_HPET:
3902 /* the only meaningful attribute for hpet is "present". If
3903 * present is -1, that means it wasn't specified, and
3904 * should be left at the default for the
3905 * hypervisor. "default" when -no-hpet exists is "yes",
3906 * and when -no-hpet doesn't exist is "no". "confusing"?
3907 * "yes"! */
3908
3909 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_HPET)) {
3910 if (def->clock.timers[i]->present == 0)
3911 virCommandAddArg(cmd, "-no-hpet");
3912 } else {
3913 /* no hpet timer available. The only possible action
3914 is to raise an error if present="yes" */
3915 if (def->clock.timers[i]->present == 1) {
3916 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3917 "%s", _("pit timer is not supported"));
3918 }
3919 }
3920 break;
3921 }
3922 }
3923
3924 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_REBOOT) &&
3925 def->onReboot != VIR_DOMAIN_LIFECYCLE_RESTART)
3926 virCommandAddArg(cmd, "-no-reboot");
3927
3928 /* If JSON monitor is enabled, we can receive an event
3929 * when QEMU stops. If we use no-shutdown, then we can
3930 * watch for this event and do a soft/warm reboot.
3931 */
3932 if (monitor_json && qemuCapsGet(qemuCaps, QEMU_CAPS_NO_SHUTDOWN))
3933 virCommandAddArg(cmd, "-no-shutdown");
3934
3935 if (!(def->features & (1 << VIR_DOMAIN_FEATURE_ACPI)))
3936 virCommandAddArg(cmd, "-no-acpi");
3937
3938 if (!def->os.bootloader) {
3939 /*
3940 * We prefer using explicit bootindex=N parameters for predictable
3941 * results even though domain XML doesn't use per device boot elements.
3942 * However, we can't use bootindex if boot menu was requested.
3943 */
3944 if (!def->os.nBootDevs) {
3945 /* def->os.nBootDevs is guaranteed to be > 0 unless per-device boot
3946 * configuration is used
3947 */
3948 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) {
3949 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3950 _("hypervisor lacks deviceboot feature"));
3951 goto error;
3952 }
3953 emitBootindex = true;
3954 } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX) &&
3955 (def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_ENABLED ||
3956 !qemuCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU))) {
3957 emitBootindex = true;
3958 }
3959
3960 if (!emitBootindex) {
3961 virBuffer boot_buf = VIR_BUFFER_INITIALIZER;
3962 char boot[VIR_DOMAIN_BOOT_LAST+1];
3963
3964 for (i = 0 ; i < def->os.nBootDevs ; i++) {
3965 switch (def->os.bootDevs[i]) {
3966 case VIR_DOMAIN_BOOT_CDROM:
3967 boot[i] = 'd';
3968 break;
3969 case VIR_DOMAIN_BOOT_FLOPPY:
3970 boot[i] = 'a';
3971 break;
3972 case VIR_DOMAIN_BOOT_DISK:
3973 boot[i] = 'c';
3974 break;
3975 case VIR_DOMAIN_BOOT_NET:
3976 boot[i] = 'n';
3977 break;
3978 default:
3979 boot[i] = 'c';
3980 break;
3981 }
3982 }
3983 boot[def->os.nBootDevs] = '\0';
3984
3985 virCommandAddArg(cmd, "-boot");
3986
3987 if (qemuCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU) &&
3988 def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_DEFAULT) {
3989 if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_ENABLED)
3990 virBufferAsprintf(&boot_buf, "order=%s,menu=on", boot);
3991 else if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_DISABLED)
3992 virBufferAsprintf(&boot_buf, "order=%s,menu=off", boot);
3993 } else {
3994 virBufferAdd(&boot_buf, boot, -1);
3995 }
3996
3997 virCommandAddArgBuffer(cmd, &boot_buf);
3998 }
3999
4000 if (def->os.kernel)
4001 virCommandAddArgList(cmd, "-kernel", def->os.kernel, NULL);
4002 if (def->os.initrd)
4003 virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL);
4004 if (def->os.cmdline)
4005 virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL);
4006 } else {
4007 virCommandAddArgList(cmd, "-bootloader", def->os.bootloader, NULL);
4008 }
4009
4010 for (i = 0 ; i < def->ndisks ; i++) {
4011 virDomainDiskDefPtr disk = def->disks[i];
4012
4013 if (disk->driverName != NULL &&
4014 !STREQ(disk->driverName, "qemu")) {
4015 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4016 _("unsupported driver name '%s' for disk '%s'"),
4017 disk->driverName, disk->src);
4018 goto error;
4019 }
4020 }
4021
4022 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4023 for (i = 0 ; i < def->ncontrollers ; i++) {
4024 virDomainControllerDefPtr cont = def->controllers[i];
4025
4026 /* We don't add an explicit IDE or FD controller because the
4027 * provided PIIX4 device already includes one. It isn't possible to
4028 * remove the PIIX4. */
4029 if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE ||
4030 cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC)
4031 continue;
4032
4033 /* Only recent QEMU implements a SATA (AHCI) controller */
4034 if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) {
4035 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) {
4036 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4037 "%s", _("SATA is not supported with this QEMU binary"));
4038 goto error;
4039 } else {
4040 char *devstr;
4041
4042 virCommandAddArg(cmd, "-device");
4043 if (!(devstr = qemuBuildControllerDevStr(cont, qemuCaps, NULL)))
4044 goto error;
4045
4046 virCommandAddArg(cmd, devstr);
4047 VIR_FREE(devstr);
4048 }
4049 } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
4050 def->controllers[i]->model == -1 &&
4051 !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) {
4052 if (usblegacy) {
4053 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4054 _("Multiple legacy USB controller not supported"));
4055 goto error;
4056 }
4057 usblegacy = true;
4058 } else {
4059 virCommandAddArg(cmd, "-device");
4060
4061 char *devstr;
4062 if (!(devstr = qemuBuildControllerDevStr(def->controllers[i], qemuCaps,
4063 &usbcontroller)))
4064 goto error;
4065
4066 virCommandAddArg(cmd, devstr);
4067 VIR_FREE(devstr);
4068 }
4069 }
4070 }
4071
4072 /* If QEMU supports -drive param instead of old -hda, -hdb, -cdrom .. */
4073 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE)) {
4074 int bootCD = 0, bootFloppy = 0, bootDisk = 0;
4075
4076 if ((qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_BOOT) || emitBootindex) &&
4077 !def->os.kernel) {
4078 /* bootDevs will get translated into either bootindex=N or boot=on
4079 * depending on what qemu supports */
4080 for (i = 0 ; i < def->os.nBootDevs ; i++) {
4081 switch (def->os.bootDevs[i]) {
4082 case VIR_DOMAIN_BOOT_CDROM:
4083 bootCD = i + 1;
4084 break;
4085 case VIR_DOMAIN_BOOT_FLOPPY:
4086 bootFloppy = i + 1;
4087 break;
4088 case VIR_DOMAIN_BOOT_DISK:
4089 bootDisk = i + 1;
4090 break;
4091 }
4092 }
4093 }
4094
4095 for (i = 0 ; i < def->ndisks ; i++) {
4096 char *optstr;
4097 int bootindex = 0;
4098 virDomainDiskDefPtr disk = def->disks[i];
4099 int withDeviceArg = 0;
4100 bool deviceFlagMasked = false;
4101
4102 /* Unless we have -device, then USB disks need special
4103 handling */
4104 if ((disk->bus == VIR_DOMAIN_DISK_BUS_USB) &&
4105 !qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4106 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
4107 virCommandAddArg(cmd, "-usbdevice");
4108 virCommandAddArgFormat(cmd, "disk:%s", disk->src);
4109 } else {
4110 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4111 _("unsupported usb disk type for '%s'"),
4112 disk->src);
4113 goto error;
4114 }
4115 continue;
4116 }
4117
4118 switch (disk->device) {
4119 case VIR_DOMAIN_DISK_DEVICE_CDROM:
4120 bootindex = bootCD;
4121 bootCD = 0;
4122 break;
4123 case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
4124 bootindex = bootFloppy;
4125 bootFloppy = 0;
4126 break;
4127 case VIR_DOMAIN_DISK_DEVICE_DISK:
4128 bootindex = bootDisk;
4129 bootDisk = 0;
4130 break;
4131 }
4132
4133 virCommandAddArg(cmd, "-drive");
4134
4135 /* Unfortunately it is not possible to use
4136 -device for floppies, or Xen paravirt
4137 devices. Fortunately, those don't need
4138 static PCI addresses, so we don't really
4139 care that we can't use -device */
4140 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4141 if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) {
4142 withDeviceArg = 1;
4143 } else {
4144 qemuCapsClear(qemuCaps, QEMU_CAPS_DEVICE);
4145 deviceFlagMasked = true;
4146 }
4147 }
4148 optstr = qemuBuildDriveStr(conn, disk,
4149 emitBootindex ? false : !!bootindex,
4150 qemuCaps);
4151 if (deviceFlagMasked)
4152 qemuCapsSet(qemuCaps, QEMU_CAPS_DEVICE);
4153 if (!optstr)
4154 goto error;
4155 virCommandAddArg(cmd, optstr);
4156 VIR_FREE(optstr);
4157
4158 if (!emitBootindex)
4159 bootindex = 0;
4160 else if (disk->bootIndex)
4161 bootindex = disk->bootIndex;
4162
4163 if (withDeviceArg) {
4164 if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) {
4165 virCommandAddArg(cmd, "-global");
4166 virCommandAddArgFormat(cmd, "isa-fdc.drive%c=drive-%s",
4167 disk->info.addr.drive.unit
4168 ? 'B' : 'A',
4169 disk->info.alias);
4170
4171 if (bootindex) {
4172 virCommandAddArg(cmd, "-global");
4173 virCommandAddArgFormat(cmd, "isa-fdc.bootindex%c=%d",
4174 disk->info.addr.drive.unit
4175 ? 'B' : 'A',
4176 bootindex);
4177 }
4178 } else {
4179 virCommandAddArg(cmd, "-device");
4180
4181 if (!(optstr = qemuBuildDriveDevStr(disk, bootindex,
4182 qemuCaps)))
4183 goto error;
4184 virCommandAddArg(cmd, optstr);
4185 VIR_FREE(optstr);
4186 }
4187 }
4188 }
4189 } else {
4190 for (i = 0 ; i < def->ndisks ; i++) {
4191 char dev[NAME_MAX];
4192 char *file;
4193 const char *fmt;
4194 virDomainDiskDefPtr disk = def->disks[i];
4195
4196 if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
4197 if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
4198 virCommandAddArg(cmd, "-usbdevice");
4199 virCommandAddArgFormat(cmd, "disk:%s", disk->src);
4200 } else {
4201 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4202 _("unsupported usb disk type for '%s'"),
4203 disk->src);
4204 goto error;
4205 }
4206 continue;
4207 }
4208
4209 if (STREQ(disk->dst, "hdc") &&
4210 disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
4211 if (disk->src) {
4212 snprintf(dev, NAME_MAX, "-%s", "cdrom");
4213 } else {
4214 continue;
4215 }
4216 } else {
4217 if (STRPREFIX(disk->dst, "hd") ||
4218 STRPREFIX(disk->dst, "fd")) {
4219 snprintf(dev, NAME_MAX, "-%s", disk->dst);
4220 } else {
4221 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4222 _("unsupported disk type '%s'"), disk->dst);
4223 goto error;
4224 }
4225 }
4226
4227 if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
4228 /* QEMU only supports magic FAT format for now */
4229 if (disk->driverType &&
4230 STRNEQ(disk->driverType, "fat")) {
4231 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4232 _("unsupported disk driver type for '%s'"),
4233 disk->driverType);
4234 goto error;
4235 }
4236 if (!disk->readonly) {
4237 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
4238 _("cannot create virtual FAT disks in read-write mode"));
4239 goto error;
4240 }
4241 if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
4242 fmt = "fat:floppy:%s";
4243 else
4244 fmt = "fat:%s";
4245
4246 if (virAsprintf(&file, fmt, disk->src) < 0) {
4247 goto no_memory;
4248 }
4249 } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
4250 switch (disk->protocol) {
4251 case VIR_DOMAIN_DISK_PROTOCOL_NBD:
4252 if (disk->nhosts != 1) {
4253 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
4254 _("NBD accepts only one host"));
4255 goto error;
4256 }
4257 if (virAsprintf(&file, "nbd:%s:%s,", disk->hosts->name,
4258 disk->hosts->port) < 0) {
4259 goto no_memory;
4260 }
4261 break;
4262 case VIR_DOMAIN_DISK_PROTOCOL_RBD:
4263 {
4264 virBuffer opt = VIR_BUFFER_INITIALIZER;
4265 if (qemuBuildRBDString(conn, disk, &opt) < 0)
4266 goto error;
4267 if (virBufferError(&opt)) {
4268 virReportOOMError();
4269 goto error;
4270 }
4271 file = virBufferContentAndReset(&opt);
4272 }
4273 break;
4274 case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
4275 if (disk->nhosts == 0) {
4276 if (virAsprintf(&file, "sheepdog:%s,", disk->src) < 0) {
4277 goto no_memory;
4278 }
4279 } else {
4280 /* only one host is supported now */
4281 if (virAsprintf(&file, "sheepdog:%s:%s:%s,",
4282 disk->hosts->name, disk->hosts->port,
4283 disk->src) < 0) {
4284 goto no_memory;
4285 }
4286 }
4287 break;
4288 }
4289 } else {
4290 if (!(file = strdup(disk->src))) {
4291 goto no_memory;
4292 }
4293 }
4294
4295 virCommandAddArgList(cmd, dev, file, NULL);
4296 VIR_FREE(file);
4297 }
4298 }
4299
4300 if (qemuCapsGet(qemuCaps, QEMU_CAPS_FSDEV)) {
4301 for (i = 0 ; i < def->nfss ; i++) {
4302 char *optstr;
4303 virDomainFSDefPtr fs = def->fss[i];
4304
4305 virCommandAddArg(cmd, "-fsdev");
4306 if (!(optstr = qemuBuildFSStr(fs, qemuCaps)))
4307 goto error;
4308 virCommandAddArg(cmd, optstr);
4309 VIR_FREE(optstr);
4310
4311 virCommandAddArg(cmd, "-device");
4312 if (!(optstr = qemuBuildFSDevStr(fs, qemuCaps)))
4313 goto error;
4314 virCommandAddArg(cmd, optstr);
4315 VIR_FREE(optstr);
4316 }
4317 } else {
4318 if (def->nfss) {
4319 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4320 _("filesystem passthrough not supported by this QEMU"));
4321 goto error;
4322 }
4323 }
4324
4325 if (!def->nnets) {
4326 /* If we have -device, then we set -nodefault already */
4327 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4328 virCommandAddArgList(cmd, "-net", "none", NULL);
4329 } else {
4330 int bootNet = 0;
4331
4332 if (emitBootindex) {
4333 /* convert <boot dev='network'/> to bootindex since we didn't emit
4334 * -boot n
4335 */
4336 for (i = 0 ; i < def->os.nBootDevs ; i++) {
4337 if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_NET) {
4338 bootNet = i + 1;
4339 break;
4340 }
4341 }
4342 }
4343
4344 for (i = 0 ; i < def->nnets ; i++) {
4345 virDomainNetDefPtr net = def->nets[i];
4346 char *nic, *host;
4347 char tapfd_name[50];
4348 char vhostfd_name[50] = "";
4349 int vlan;
4350 int bootindex = bootNet;
4351 int actualType;
4352
4353 bootNet = 0;
4354 if (!bootindex)
4355 bootindex = net->bootIndex;
4356
4357 /* VLANs are not used with -netdev, so don't record them */
4358 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4359 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4360 vlan = -1;
4361 else
4362 vlan = i;
4363
4364 /* If appropriate, grab a physical device from the configured
4365 * network's pool of devices, or resolve bridge device name
4366 * to the one defined in the network definition.
4367 */
4368 if (networkAllocateActualDevice(net) < 0)
4369 goto error;
4370
4371 actualType = virDomainNetGetActualType(net);
4372 if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
4373 actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
4374 int tapfd = qemuNetworkIfaceConnect(def, conn, driver, net,
4375 qemuCaps);
4376 if (tapfd < 0)
4377 goto error;
4378
4379 last_good_net = i;
4380 virCommandTransferFD(cmd, tapfd);
4381
4382 if (snprintf(tapfd_name, sizeof(tapfd_name), "%d",
4383 tapfd) >= sizeof(tapfd_name))
4384 goto no_memory;
4385 } else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
4386 int tapfd = qemuPhysIfaceConnect(def, driver, net,
4387 qemuCaps, vmop);
4388 if (tapfd < 0)
4389 goto error;
4390
4391 last_good_net = i;
4392 virCommandTransferFD(cmd, tapfd);
4393
4394 if (snprintf(tapfd_name, sizeof(tapfd_name), "%d",
4395 tapfd) >= sizeof(tapfd_name))
4396 goto no_memory;
4397 }
4398
4399 if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
4400 actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
4401 actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
4402 /* Attempt to use vhost-net mode for these types of
4403 network device */
4404 int vhostfd;
4405
4406 if (qemuOpenVhostNet(def, net, qemuCaps, &vhostfd) < 0)
4407 goto error;
4408 if (vhostfd >= 0) {
4409 virCommandTransferFD(cmd, vhostfd);
4410
4411 if (snprintf(vhostfd_name, sizeof(vhostfd_name), "%d",
4412 vhostfd) >= sizeof(vhostfd_name))
4413 goto no_memory;
4414 }
4415 }
4416 /* Possible combinations:
4417 *
4418 * 1. Old way: -net nic,model=e1000,vlan=1 -net tap,vlan=1
4419 * 2. Semi-new: -device e1000,vlan=1 -net tap,vlan=1
4420 * 3. Best way: -netdev type=tap,id=netdev1 -device e1000,id=netdev1
4421 *
4422 * NB, no support for -netdev without use of -device
4423 */
4424 if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4425 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4426 virCommandAddArg(cmd, "-netdev");
4427 if (!(host = qemuBuildHostNetStr(net, ',', vlan,
4428 tapfd_name, vhostfd_name)))
4429 goto error;
4430 virCommandAddArg(cmd, host);
4431 VIR_FREE(host);
4432 }
4433 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4434 virCommandAddArg(cmd, "-device");
4435 nic = qemuBuildNicDevStr(net, vlan, bootindex, qemuCaps);
4436 if (!nic)
4437 goto error;
4438 virCommandAddArg(cmd, nic);
4439 VIR_FREE(nic);
4440 } else {
4441 virCommandAddArg(cmd, "-net");
4442 if (!(nic = qemuBuildNicStr(net, "nic,", vlan)))
4443 goto error;
4444 virCommandAddArg(cmd, nic);
4445 VIR_FREE(nic);
4446 }
4447 if (!(qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4448 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
4449 virCommandAddArg(cmd, "-net");
4450 if (!(host = qemuBuildHostNetStr(net, ',', vlan,
4451 tapfd_name, vhostfd_name)))
4452 goto error;
4453 virCommandAddArg(cmd, host);
4454 VIR_FREE(host);
4455 }
4456 }
4457 }
4458
4459 if (def->nsmartcards) {
4460 /* -device usb-ccid was already emitted along with other
4461 * controllers. For now, qemu handles only one smartcard. */
4462 virDomainSmartcardDefPtr smartcard = def->smartcards[0];
4463 char *devstr;
4464 virBuffer opt = VIR_BUFFER_INITIALIZER;
4465 int j;
4466 const char *database;
4467
4468 if (def->nsmartcards > 1 ||
4469 smartcard->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID ||
4470 smartcard->info.addr.ccid.controller != 0 ||
4471 smartcard->info.addr.ccid.slot != 0) {
4472 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4473 _("this QEMU binary lacks multiple smartcard "
4474 "support"));
4475 virBufferFreeAndReset(&opt);
4476 goto error;
4477 }
4478
4479 switch (smartcard->type) {
4480 case VIR_DOMAIN_SMARTCARD_TYPE_HOST:
4481 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4482 !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) {
4483 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4484 _("this QEMU binary lacks smartcard host "
4485 "mode support"));
4486 goto error;
4487 }
4488
4489 virBufferAddLit(&opt, "ccid-card-emulated,backend=nss-emulated");
4490 break;
4491
4492 case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES:
4493 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4494 !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) {
4495 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4496 _("this QEMU binary lacks smartcard host "
4497 "mode support"));
4498 goto error;
4499 }
4500
4501 virBufferAddLit(&opt, "ccid-card-emulated,backend=certificates");
4502 for (j = 0; j < VIR_DOMAIN_SMARTCARD_NUM_CERTIFICATES; j++) {
4503 if (strchr(smartcard->data.cert.file[j], ',')) {
4504 virBufferFreeAndReset(&opt);
4505 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4506 _("invalid certificate name: %s"),
4507 smartcard->data.cert.file[j]);
4508 goto error;
4509 }
4510 virBufferAsprintf(&opt, ",cert%d=%s", j + 1,
4511 smartcard->data.cert.file[j]);
4512 }
4513 if (smartcard->data.cert.database) {
4514 if (strchr(smartcard->data.cert.database, ',')) {
4515 virBufferFreeAndReset(&opt);
4516 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4517 _("invalid database name: %s"),
4518 smartcard->data.cert.database);
4519 goto error;
4520 }
4521 database = smartcard->data.cert.database;
4522 } else {
4523 database = VIR_DOMAIN_SMARTCARD_DEFAULT_DATABASE;
4524 }
4525 virBufferAsprintf(&opt, ",database=%s", database);
4526 break;
4527
4528 case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH:
4529 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4530 !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) {
4531 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4532 _("this QEMU binary lacks smartcard "
4533 "passthrough mode support"));
4534 goto error;
4535 }
4536
4537 virCommandAddArg(cmd, "-chardev");
4538 if (!(devstr = qemuBuildChrChardevStr(&smartcard->data.passthru,
4539 smartcard->info.alias,
4540 qemuCaps))) {
4541 virBufferFreeAndReset(&opt);
4542 goto error;
4543 }
4544 virCommandAddArg(cmd, devstr);
4545 VIR_FREE(devstr);
4546
4547 virBufferAsprintf(&opt, "ccid-card-passthru,chardev=char%s",
4548 smartcard->info.alias);
4549 break;
4550
4551 default:
4552 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4553 _("unexpected smartcard type %d"),
4554 smartcard->type);
4555 virBufferFreeAndReset(&opt);
4556 goto error;
4557 }
4558 virCommandAddArg(cmd, "-device");
4559 virBufferAsprintf(&opt, ",id=%s,bus=ccid0.0", smartcard->info.alias);
4560 virCommandAddArgBuffer(cmd, &opt);
4561 }
4562
4563 if (!def->nserials) {
4564 /* If we have -device, then we set -nodefault already */
4565 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4566 virCommandAddArgList(cmd, "-serial", "none", NULL);
4567 } else {
4568 for (i = 0 ; i < def->nserials ; i++) {
4569 virDomainChrDefPtr serial = def->serials[i];
4570 char *devstr;
4571
4572 /* Use -chardev with -device if they are available */
4573 if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) &&
4574 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4575 virCommandAddArg(cmd, "-chardev");
4576 if (!(devstr = qemuBuildChrChardevStr(&serial->source,
4577 serial->info.alias,
4578 qemuCaps)))
4579 goto error;
4580 virCommandAddArg(cmd, devstr);
4581 VIR_FREE(devstr);
4582
4583 virCommandAddArg(cmd, "-device");
4584 virCommandAddArgFormat(cmd, "isa-serial,chardev=char%s,id=%s",
4585 serial->info.alias, serial->info.alias);
4586 } else {
4587 virCommandAddArg(cmd, "-serial");
4588 if (!(devstr = qemuBuildChrArgStr(&serial->source, NULL)))
4589 goto error;
4590 virCommandAddArg(cmd, devstr);
4591 VIR_FREE(devstr);
4592 }
4593 }
4594 }
4595
4596 if (!def->nparallels) {
4597 /* If we have -device, then we set -nodefault already */
4598 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4599 virCommandAddArgList(cmd, "-parallel", "none", NULL);
4600 } else {
4601 for (i = 0 ; i < def->nparallels ; i++) {
4602 virDomainChrDefPtr parallel = def->parallels[i];
4603 char *devstr;
4604
4605 /* Use -chardev with -device if they are available */
4606 if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) &&
4607 qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4608 virCommandAddArg(cmd, "-chardev");
4609 if (!(devstr = qemuBuildChrChardevStr(&parallel->source,
4610 parallel->info.alias,
4611 qemuCaps)))
4612 goto error;
4613 virCommandAddArg(cmd, devstr);
4614 VIR_FREE(devstr);
4615
4616 virCommandAddArg(cmd, "-device");
4617 virCommandAddArgFormat(cmd, "isa-parallel,chardev=char%s,id=%s",
4618 parallel->info.alias,
4619 parallel->info.alias);
4620 } else {
4621 virCommandAddArg(cmd, "-parallel");
4622 if (!(devstr = qemuBuildChrArgStr(&parallel->source, NULL)))
4623 goto error;
4624 virCommandAddArg(cmd, devstr);
4625 VIR_FREE(devstr);
4626 }
4627 }
4628 }
4629
4630 for (i = 0 ; i < def->nchannels ; i++) {
4631 virDomainChrDefPtr channel = def->channels[i];
4632 char *devstr;
4633 char *addr;
4634 int port;
4635
4636 switch(channel->targetType) {
4637 case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
4638 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4639 !qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4640 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4641 "%s", _("guestfwd requires QEMU to support -chardev & -device"));
4642 goto error;
4643 }
4644
4645 virCommandAddArg(cmd, "-chardev");
4646 if (!(devstr = qemuBuildChrChardevStr(&channel->source,
4647 channel->info.alias,
4648 qemuCaps)))
4649 goto error;
4650 virCommandAddArg(cmd, devstr);
4651 VIR_FREE(devstr);
4652
4653 addr = virSocketAddrFormat(channel->target.addr);
4654 if (!addr)
4655 goto error;
4656 port = virSocketAddrGetPort(channel->target.addr);
4657
4658 virCommandAddArg(cmd, "-netdev");
4659 virCommandAddArgFormat(cmd,
4660 "user,guestfwd=tcp:%s:%i,chardev=char%s,id=user-%s",
4661 addr, port, channel->info.alias,
4662 channel->info.alias);
4663 VIR_FREE(addr);
4664 break;
4665
4666 case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
4667 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4668 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4669 _("virtio channel requires QEMU to support -device"));
4670 goto error;
4671 }
4672
4673 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) &&
4674 channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
4675 /* spicevmc was originally introduced via a -device
4676 * with a backend internal to qemu; although we prefer
4677 * the newer -chardev interface. */
4678 ;
4679 } else {
4680 virCommandAddArg(cmd, "-chardev");
4681 if (!(devstr = qemuBuildChrChardevStr(&channel->source,
4682 channel->info.alias,
4683 qemuCaps)))
4684 goto error;
4685 virCommandAddArg(cmd, devstr);
4686 VIR_FREE(devstr);
4687 }
4688
4689 virCommandAddArg(cmd, "-device");
4690 if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel,
4691 qemuCaps)))
4692 goto error;
4693 virCommandAddArg(cmd, devstr);
4694 VIR_FREE(devstr);
4695 break;
4696 }
4697 }
4698
4699 /* Explicit console devices */
4700 for (i = 0 ; i < def->nconsoles ; i++) {
4701 virDomainChrDefPtr console = def->consoles[i];
4702 char *devstr;
4703
4704 switch(console->targetType) {
4705 case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO:
4706 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4707 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4708 _("virtio channel requires QEMU to support -device"));
4709 goto error;
4710 }
4711
4712 virCommandAddArg(cmd, "-chardev");
4713 if (!(devstr = qemuBuildChrChardevStr(&console->source,
4714 console->info.alias,
4715 qemuCaps)))
4716 goto error;
4717 virCommandAddArg(cmd, devstr);
4718 VIR_FREE(devstr);
4719
4720 virCommandAddArg(cmd, "-device");
4721 if (!(devstr = qemuBuildVirtioSerialPortDevStr(console,
4722 qemuCaps)))
4723 goto error;
4724 virCommandAddArg(cmd, devstr);
4725 VIR_FREE(devstr);
4726 break;
4727
4728 case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL:
4729 break;
4730
4731 default:
4732 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4733 _("unsupported console target type %s"),
4734 NULLSTR(virDomainChrConsoleTargetTypeToString(console->targetType)));
4735 goto error;
4736 }
4737 }
4738
4739 if (usbcontroller == 0)
4740 virCommandAddArg(cmd, "-usb");
4741
4742 for (i = 0 ; i < def->nhubs ; i++) {
4743 virDomainHubDefPtr hub = def->hubs[i];
4744 char *optstr;
4745
4746 virCommandAddArg(cmd, "-device");
4747 if (!(optstr = qemuBuildHubDevStr(hub, qemuCaps)))
4748 goto error;
4749 virCommandAddArg(cmd, optstr);
4750 VIR_FREE(optstr);
4751 }
4752
4753 for (i = 0 ; i < def->ninputs ; i++) {
4754 virDomainInputDefPtr input = def->inputs[i];
4755
4756 if (input->bus == VIR_DOMAIN_INPUT_BUS_USB) {
4757 if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4758 char *optstr;
4759 virCommandAddArg(cmd, "-device");
4760 if (!(optstr = qemuBuildUSBInputDevStr(input, qemuCaps)))
4761 goto error;
4762 virCommandAddArg(cmd, optstr);
4763 VIR_FREE(optstr);
4764 } else {
4765 virCommandAddArgList(cmd, "-usbdevice",
4766 input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE
4767 ? "mouse" : "tablet", NULL);
4768 }
4769 }
4770 }
4771
4772 if (def->ngraphics > 1) {
4773 qemuReportError(VIR_ERR_INTERNAL_ERROR,
4774 "%s", _("only 1 graphics device is supported"));
4775 goto error;
4776 }
4777
4778 if ((def->ngraphics == 1) &&
4779 def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
4780 virBuffer opt = VIR_BUFFER_INITIALIZER;
4781
4782 if (def->graphics[0]->data.vnc.socket ||
4783 driver->vncAutoUnixSocket) {
4784
4785 if (!def->graphics[0]->data.vnc.socket &&
4786 virAsprintf(&def->graphics[0]->data.vnc.socket,
4787 "%s/%s.vnc", driver->libDir, def->name) == -1) {
4788 goto no_memory;
4789 }
4790
4791 virBufferAsprintf(&opt, "unix:%s",
4792 def->graphics[0]->data.vnc.socket);
4793
4794 } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNC_COLON)) {
4795 const char *listenNetwork;
4796 const char *listenAddr = NULL;
4797 char *netAddr = NULL;
4798 bool escapeAddr;
4799 int ret;
4800
4801 switch (virDomainGraphicsListenGetType(def->graphics[0], 0)) {
4802 case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
4803 listenAddr = virDomainGraphicsListenGetAddress(def->graphics[0], 0);
4804 break;
4805
4806 case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
4807 listenNetwork = virDomainGraphicsListenGetNetwork(def->graphics[0], 0);
4808 if (!listenNetwork)
4809 break;
4810 ret = networkGetNetworkAddress(listenNetwork, &netAddr);
4811 if (ret <= -2) {
4812 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4813 "%s", _("network-based listen not possible, "
4814 "network driver not present"));
4815 goto error;
4816 }
4817 if (ret < 0) {
4818 qemuReportError(VIR_ERR_XML_ERROR,
4819 _("listen network '%s' had no usable address"),
4820 listenNetwork);
4821 goto error;
4822 }
4823 listenAddr = netAddr;
4824 /* store the address we found in the <graphics> element so it will
4825 * show up in status. */
4826 if (virDomainGraphicsListenSetAddress(def->graphics[0], 0,
4827 listenAddr, -1, false) < 0)
4828 goto error;
4829 break;
4830 }
4831
4832 if (!listenAddr)
4833 listenAddr = driver->vncListen;
4834
4835 escapeAddr = strchr(listenAddr, ':') != NULL;
4836 if (escapeAddr)
4837 virBufferAsprintf(&opt, "[%s]", listenAddr);
4838 else
4839 virBufferAdd(&opt, listenAddr, -1);
4840 virBufferAsprintf(&opt, ":%d",
4841 def->graphics[0]->data.vnc.port - 5900);
4842
4843 VIR_FREE(netAddr);
4844 } else {
4845 virBufferAsprintf(&opt, "%d",
4846 def->graphics[0]->data.vnc.port - 5900);
4847 }
4848
4849 if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNC_COLON)) {
4850 if (def->graphics[0]->data.vnc.auth.passwd ||
4851 driver->vncPassword)
4852 virBufferAddLit(&opt, ",password");
4853
4854 if (driver->vncTLS) {
4855 virBufferAddLit(&opt, ",tls");
4856 if (driver->vncTLSx509verify) {
4857 virBufferAsprintf(&opt, ",x509verify=%s",
4858 driver->vncTLSx509certdir);
4859 } else {
4860 virBufferAsprintf(&opt, ",x509=%s",
4861 driver->vncTLSx509certdir);
4862 }
4863 }
4864
4865 if (driver->vncSASL) {
4866 virBufferAddLit(&opt, ",sasl");
4867
4868 if (driver->vncSASLdir)
4869 virCommandAddEnvPair(cmd, "SASL_CONF_DIR",
4870 driver->vncSASLdir);
4871
4872 /* TODO: Support ACLs later */
4873 }
4874 }
4875
4876 virCommandAddArg(cmd, "-vnc");
4877 virCommandAddArgBuffer(cmd, &opt);
4878 if (def->graphics[0]->data.vnc.keymap) {
4879 virCommandAddArgList(cmd, "-k", def->graphics[0]->data.vnc.keymap,
4880 NULL);
4881 }
4882
4883 /* Unless user requested it, set the audio backend to none, to
4884 * prevent it opening the host OS audio devices, since that causes
4885 * security issues and might not work when using VNC.
4886 */
4887 if (driver->vncAllowHostAudio) {
4888 virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
4889 } else {
4890 virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
4891 }
4892 } else if ((def->ngraphics == 1) &&
4893 def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
4894 if (qemuCapsGet(qemuCaps, QEMU_CAPS_0_10) &&
4895 !qemuCapsGet(qemuCaps, QEMU_CAPS_SDL)) {
4896 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4897 _("sdl not supported by '%s'"),
4898 def->emulator);
4899 goto error;
4900 }
4901
4902 if (def->graphics[0]->data.sdl.xauth)
4903 virCommandAddEnvPair(cmd, "XAUTHORITY",
4904 def->graphics[0]->data.sdl.xauth);
4905 if (def->graphics[0]->data.sdl.display)
4906 virCommandAddEnvPair(cmd, "DISPLAY",
4907 def->graphics[0]->data.sdl.display);
4908 if (def->graphics[0]->data.sdl.fullscreen)
4909 virCommandAddArg(cmd, "-full-screen");
4910
4911 /* If using SDL for video, then we should just let it
4912 * use QEMU's host audio drivers, possibly SDL too
4913 * User can set these two before starting libvirtd
4914 */
4915 virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
4916 virCommandAddEnvPass(cmd, "SDL_AUDIODRIVER");
4917
4918 /* New QEMU has this flag to let us explicitly ask for
4919 * SDL graphics. This is better than relying on the
4920 * default, since the default changes :-( */
4921 if (qemuCapsGet(qemuCaps, QEMU_CAPS_SDL))
4922 virCommandAddArg(cmd, "-sdl");
4923
4924 } else if ((def->ngraphics == 1) &&
4925 def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
4926 virBuffer opt = VIR_BUFFER_INITIALIZER;
4927 const char *listenNetwork;
4928 const char *listenAddr = NULL;
4929 char *netAddr = NULL;
4930 int ret;
4931
4932 if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SPICE)) {
4933 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4934 _("spice graphics are not supported with this QEMU"));
4935 goto error;
4936 }
4937
4938 virBufferAsprintf(&opt, "port=%u", def->graphics[0]->data.spice.port);
4939
4940 if (driver->spiceTLS && def->graphics[0]->data.spice.tlsPort != -1)
4941 virBufferAsprintf(&opt, ",tls-port=%u", def->graphics[0]->data.spice.tlsPort);
4942
4943 switch (virDomainGraphicsListenGetType(def->graphics[0], 0)) {
4944 case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
4945 listenAddr = virDomainGraphicsListenGetAddress(def->graphics[0], 0);
4946 break;
4947
4948 case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
4949 listenNetwork = virDomainGraphicsListenGetNetwork(def->graphics[0], 0);
4950 if (!listenNetwork)
4951 break;
4952 ret = networkGetNetworkAddress(listenNetwork, &netAddr);
4953 if (ret <= -2) {
4954 qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4955 "%s", _("network-based listen not possible, "
4956 "network driver not present"));
4957 goto error;
4958 }
4959 if (ret < 0) {
4960 qemuReportError(VIR_ERR_XML_ERROR,
4961 _("listen network '%s' had no usable address"),
4962 listenNetwork);
4963 goto error;
4964 }
4965 listenAddr = netAddr;
4966 /* store the address we found in the <graphics> element so it will
4967 * show up in status. */
4968 if (virDomainGraphicsListenSetAddress(def->graphics[0], 0,
4969 listenAddr, -1, false) < 0)
4970 goto error;
4971 break;
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches