qemu_capabilities.c 121.0 KB
Newer Older
1 2 3
/*
 * qemu_capabilities.c: QEMU capabilities generation
 *
4
 * Copyright (C) 2006-2015 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#include <config.h>

#include "qemu_capabilities.h"
27
#include "viralloc.h"
28
#include "vircrypto.h"
29
#include "virlog.h"
30
#include "virerror.h"
E
Eric Blake 已提交
31
#include "virfile.h"
32 33
#include "virpidfile.h"
#include "virprocess.h"
34 35 36
#include "nodeinfo.h"
#include "cpu/cpu.h"
#include "domain_conf.h"
37
#include "vircommand.h"
38
#include "virbitmap.h"
39
#include "virnodesuspend.h"
40
#include "virnuma.h"
41
#include "qemu_monitor.h"
42
#include "virstring.h"
43
#include "qemu_hostdev.h"
44
#include "qemu_domain.h"
45 46
#define __QEMU_CAPSRIV_H_ALLOW__
#include "qemu_capspriv.h"
47

48
#include <fcntl.h>
49 50 51
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
52
#include <stdarg.h>
53 54 55

#define VIR_FROM_THIS VIR_FROM_QEMU

56 57
VIR_LOG_INIT("qemu.qemu_capabilities");

58 59 60 61
/* While not public, these strings must not change. They
 * are used in domain status files which are read on
 * daemon restarts
 */
62
VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
              "kqemu",  /* 0 */
              "vnc-colon",
              "no-reboot",
              "drive",
              "drive-boot",

              "name", /* 5 */
              "uuid",
              "domid",
              "vnet-hdr",
              "migrate-kvm-stdio",

              "migrate-qemu-tcp", /* 10 */
              "migrate-qemu-exec",
              "drive-cache-v2",
              "kvm",
              "drive-format",

              "vga", /* 15 */
              "0.10",
              "pci-device",
              "mem-path",
              "drive-serial",

              "xen-domid", /* 20 */
              "migrate-qemu-unix",
              "chardev",
              "enable-kvm",
              "monitor-json",

              "balloon", /* 25 */
              "device",
              "sdl",
              "smp-topology",
              "netdev",

              "rtc", /* 30 */
100
              "vhost-net",
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
              "rtc-td-hack",
              "no-hpet",
              "no-kvm-pit",

              "tdf", /* 35 */
              "pci-configfd",
              "nodefconfig",
              "boot-menu",
              "enable-kqemu",

              "fsdev", /* 40 */
              "nesting",
              "name-process",
              "drive-readonly",
              "smbios-type",

              "vga-qxl", /* 45 */
              "spice",
              "vga-none",
              "migrate-qemu-fd",
              "boot-index",

              "hda-duplex", /* 50 */
              "drive-aio",
              "pci-multibus",
              "pci-bootindex",
              "ccid-emulated",

              "ccid-passthru", /* 55 */
              "chardev-spicevmc",
              "device-spicevmc",
              "virtio-tx-alg",
              "device-qxl-vga",
134 135

              "pci-multifunction", /* 60 */
136
              "virtio-blk-pci.ioeventfd",
M
Michal Privoznik 已提交
137
              "sga",
138 139
              "virtio-blk-pci.event_idx",
              "virtio-net-pci.event_idx",
140 141 142 143 144 145 146 147 148 149

              "cache-directsync", /* 65 */
              "piix3-usb-uhci",
              "piix4-usb-uhci",
              "usb-ehci",
              "ich9-usb-ehci1",

              "vt82c686b-usb-uhci", /* 70 */
              "pci-ohci",
              "usb-redir",
M
Marc-André Lureau 已提交
150
              "usb-hub",
151
              "no-shutdown",
152 153

              "cache-unsafe", /* 75 */
154
              "rombar",
J
Jim Fehlig 已提交
155
              "ich9-ahci",
156
              "no-acpi",
157
              "fsdev-readonly",
158

159
              "virtio-blk-pci.scsi", /* 80 */
160
              "blk-sg-io",
O
Osier Yang 已提交
161
              "drive-copy-on-read",
162
              "cpu-host",
163
              "fsdev-writeout",
164 165

              "drive-iotune", /* 85 */
166
              "system_wakeup",
167
              "scsi-disk.channel",
168
              "scsi-block",
169
              "transaction",
170 171 172

              "block-job-sync", /* 90 */
              "block-job-async",
173
              "scsi-cd",
174
              "ide-cd",
175
              "no-user-config",
M
Marc-André Lureau 已提交
176 177

              "hda-micro", /* 95 */
178
              "dump-guest-memory",
G
Gerd Hoffmann 已提交
179
              "nec-usb-xhci",
180
              "virtio-s390",
181
              "balloon-event",
M
Marc-André Lureau 已提交
182

R
Richa Marwaha 已提交
183
              "bridge", /* 100 */
184 185
              "lsi",
              "virtio-scsi-pci",
V
Viktor Mihajlovski 已提交
186
              "blockio",
187
              "disable-s3",
R
Richa Marwaha 已提交
188

189
              "disable-s4", /* 105 */
190
              "usb-redir.filter",
191 192
              "ide-drive.wwn",
              "scsi-disk.wwn",
193
              "seccomp-sandbox",
194 195

              "reboot-timeout", /* 110 */
196
              "dump-guest-core",
197
              "seamless-migration",
198
              "block-commit",
199
              "vnc",
200 201

              "drive-mirror", /* 115 */
202 203
              "usb-redir.bootindex",
              "usb-host.bootindex",
204
              "blockdev-snapshot-sync",
205 206 207 208 209 210
              "qxl",

              "VGA", /* 120 */
              "cirrus-vga",
              "vmware-svga",
              "device-video-primary",
211
              "s390-sclp",
212 213

              "usb-serial", /* 125 */
G
Guannan Ren 已提交
214
              "usb-net",
215
              "add-fd",
216
              "nbd-server",
217 218 219
              "virtio-rng",

              "rng-random", /* 130 */
220
              "rng-egd",
O
Olivia Yin 已提交
221 222
              "virtio-ccw",
              "dtb",
223
              "megasas",
J
Ján Tomko 已提交
224 225

              "ipv6-migration", /* 135 */
226
              "machine-opt",
L
Li Zhang 已提交
227
              "machine-usb-opt",
S
Stefan Berger 已提交
228 229
              "tpm-passthrough",
              "tpm-tis",
230 231

              "nvram",  /* 140 */
H
Han Cheng 已提交
232 233 234 235 236 237
              "pci-bridge",
              "vfio-pci",
              "vfio-pci.bootindex",
              "scsi-generic",

              "scsi-generic.bootindex", /* 145 */
238
              "mem-merge",
239
              "vnc-websocket",
O
Osier Yang 已提交
240
              "drive-discard",
241
              "mlock",
242 243

              "vnc-share-policy", /* 150 */
244
              "device-del-event",
245
              "dmi-to-pci-bridge",
246 247
              "i440fx-pci-hole64-size",
              "q35-pci-hole64-size",
248 249

              "usb-storage", /* 155 */
250
              "usb-storage.removable",
251
              "virtio-mmio",
252
              "ich9-intel-hda",
253
              "kvm-pit-lost-tick-policy",
254 255

              "boot-strict", /* 160 */
256 257
              "pvpanic",
              "enable-fips",
258 259
              "spice-file-xfer-disable",
              "spiceport",
L
Li Zhang 已提交
260 261

              "usb-kbd", /* 165 */
262
              "host-pci-multidomain",
263
              "msg-timestamp",
264
              "active-commit",
265
              "change-backing-file",
266 267

              "memory-backend-ram", /* 170 */
268
              "numa",
269
              "memory-backend-file",
270
              "usb-audio",
271
              "rtc-reset-reinjection",
272 273

              "splash-timeout", /* 175 */
J
John Ferlan 已提交
274
              "iothread",
275
              "migrate-rdma",
276
              "ivshmem",
277
              "drive-iotune-max",
278 279 280 281 282

              "VGA.vgamem_mb", /* 180 */
              "vmware-svga.vgamem_mb",
              "qxl.vgamem_mb",
              "qxl-vga.vgamem_mb",
283
              "pc-dimm",
284 285

              "machine-vmport-opt", /* 185 */
286 287
              "aes-key-wrap",
              "dea-key-wrap",
M
Michal Privoznik 已提交
288
              "pci-serial",
289
              "aarch64-off",
290

J
Ján Tomko 已提交
291
              "vhost-user-multiqueue", /* 190 */
292
              "migration-event",
293
              "gpex-pcihost",
294
              "ioh3420",
295
              "x3130-upstream",
296 297 298

              "xio3130-downstream", /* 195 */
              "rtl8139",
299
              "e1000",
300
              "virtio-net",
301
              "gic-version",
302 303

              "incoming-defer", /* 200 */
M
Marc-André Lureau 已提交
304
              "virtio-gpu",
305
              "virtio-gpu.virgl",
306 307 308 309
              "virtio-keyboard",
              "virtio-mouse",

              "virtio-tablet", /* 205 */
310
              "virtio-input-host",
311
              "chardev-file-append",
312 313
    );

314 315 316 317 318 319 320 321

/*
 * Update the XML parser/formatter when adding more
 * information to this struct so that it gets cached
 * correctly. It does not have to be ABI-stable, as
 * the cache will be discarded & repopulated if the
 * timestamp on the libvirtd binary changes.
 */
322
struct _virQEMUCaps {
323 324
    virObject object;

325 326
    bool usedQMP;

327
    char *binary;
328
    time_t ctime;
329

330
    virBitmapPtr flags;
331 332 333

    unsigned int version;
    unsigned int kvmVersion;
334
    char *package;
335

336
    virArch arch;
337 338 339 340 341 342 343

    size_t ncpuDefinitions;
    char **cpuDefinitions;

    size_t nmachineTypes;
    char **machineTypes;
    char **machineAliases;
344
    unsigned int *machineMaxCpus;
345 346
};

347 348 349 350
struct virQEMUCapsSearchData {
    virArch arch;
};

351

352 353
static virClassPtr virQEMUCapsClass;
static void virQEMUCapsDispose(void *obj);
354

355
static int virQEMUCapsOnceInit(void)
356
{
357 358 359 360
    if (!(virQEMUCapsClass = virClassNew(virClassForObject(),
                                         "virQEMUCaps",
                                         sizeof(virQEMUCaps),
                                         virQEMUCapsDispose)))
361 362 363 364 365
        return -1;

    return 0;
}

366
VIR_ONCE_GLOBAL_INIT(virQEMUCaps)
367

368
static virArch virQEMUCapsArchFromString(const char *arch)
369 370 371 372 373
{
    if (STREQ(arch, "i386"))
        return VIR_ARCH_I686;
    if (STREQ(arch, "arm"))
        return VIR_ARCH_ARMV7L;
374 375
    if (STREQ(arch, "or32"))
        return VIR_ARCH_OR32;
376 377 378 379 380

    return virArchFromString(arch);
}


381
static const char *virQEMUCapsArchToString(virArch arch)
382 383 384 385 386
{
    if (arch == VIR_ARCH_I686)
        return "i386";
    else if (arch == VIR_ARCH_ARMV7L)
        return "arm";
387 388
    else if (arch == VIR_ARCH_OR32)
        return "or32";
389 390 391 392

    return virArchToString(arch);
}

393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
/* Given a host and guest architectures, find a suitable QEMU target.
 *
 * This is meant to be used as a second attempt if qemu-system-$guestarch
 * can't be found, eg. on a x86_64 host you want to use qemu-system-i386,
 * if available, instead of qemu-system-x86_64 to run i686 guests */
static virArch
virQEMUCapsFindTarget(virArch hostarch,
                      virArch guestarch)
{
    /* Both ppc64 and ppc64le guests can use the ppc64 target */
    if (ARCH_IS_PPC64(guestarch))
        guestarch = VIR_ARCH_PPC64;

    /* armv7l guests on aarch64 hosts can use the aarch64 target
     * i686 guests on x86_64 hosts can use the x86_64 target */
    if ((guestarch == VIR_ARCH_ARMV7L && hostarch == VIR_ARCH_AARCH64) ||
        (guestarch == VIR_ARCH_I686 && hostarch == VIR_ARCH_X86_64)) {
        return hostarch;
    }

    return guestarch;
}
415

416
static virCommandPtr
417 418
virQEMUCapsProbeCommand(const char *qemu,
                        virQEMUCapsPtr qemuCaps,
419
                        uid_t runUid, gid_t runGid)
420 421 422
{
    virCommandPtr cmd = virCommandNew(qemu);

423 424
    if (qemuCaps) {
        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG))
425
            virCommandAddArg(cmd, "-no-user-config");
426
        else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG))
427 428 429 430 431
            virCommandAddArg(cmd, "-nodefconfig");
    }

    virCommandAddEnvPassCommon(cmd);
    virCommandClearCaps(cmd);
432 433
    virCommandSetGID(cmd, runGid);
    virCommandSetUID(cmd, runUid);
434 435 436 437 438

    return cmd;
}


439
static void
440 441
virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps,
                             size_t defIdx)
442
{
443 444
    char *name = qemuCaps->machineTypes[defIdx];
    char *alias = qemuCaps->machineAliases[defIdx];
445
    unsigned int maxCpus = qemuCaps->machineMaxCpus[defIdx];
446 447 448 449 450 451 452

    memmove(qemuCaps->machineTypes + 1,
            qemuCaps->machineTypes,
            sizeof(qemuCaps->machineTypes[0]) * defIdx);
    memmove(qemuCaps->machineAliases + 1,
            qemuCaps->machineAliases,
            sizeof(qemuCaps->machineAliases[0]) * defIdx);
453 454 455
    memmove(qemuCaps->machineMaxCpus + 1,
            qemuCaps->machineMaxCpus,
            sizeof(qemuCaps->machineMaxCpus[0]) * defIdx);
456 457
    qemuCaps->machineTypes[0] = name;
    qemuCaps->machineAliases[0] = alias;
458
    qemuCaps->machineMaxCpus[0] = maxCpus;
459 460
}

461 462 463 464
/* Format is:
 * <machine> <desc> [(default)|(alias of <canonical>)]
 */
static int
465 466
virQEMUCapsParseMachineTypesStr(const char *output,
                                virQEMUCapsPtr qemuCaps)
467 468 469
{
    const char *p = output;
    const char *next;
470
    size_t defIdx = 0;
471 472 473

    do {
        const char *t;
474 475
        char *name;
        char *canonical = NULL;
476 477 478 479 480 481 482 483 484 485

        if ((next = strchr(p, '\n')))
            ++next;

        if (STRPREFIX(p, "Supported machines are:"))
            continue;

        if (!(t = strchr(p, ' ')) || (next && t >= next))
            continue;

486 487
        if (VIR_STRNDUP(name, p, t - p) < 0)
            return -1;
488 489

        p = t;
490
        if ((t = strstr(p, "(default)")) && (!next || t < next))
491
            defIdx = qemuCaps->nmachineTypes;
492 493 494

        if ((t = strstr(p, "(alias of ")) && (!next || t < next)) {
            p = t + strlen("(alias of ");
495 496
            if (!(t = strchr(p, ')')) || (next && t >= next)) {
                VIR_FREE(name);
497
                continue;
498
            }
499

500
            if (VIR_STRNDUP(canonical, p, t - p) < 0) {
501
                VIR_FREE(name);
502
                return -1;
503 504 505
            }
        }

506
        if (VIR_REALLOC_N(qemuCaps->machineTypes, qemuCaps->nmachineTypes + 1) < 0 ||
507 508
            VIR_REALLOC_N(qemuCaps->machineAliases, qemuCaps->nmachineTypes + 1) < 0 ||
            VIR_REALLOC_N(qemuCaps->machineMaxCpus, qemuCaps->nmachineTypes + 1) < 0) {
509 510
            VIR_FREE(name);
            VIR_FREE(canonical);
511
            return -1;
512
        }
513
        qemuCaps->nmachineTypes++;
514
        if (canonical) {
515 516
            qemuCaps->machineTypes[qemuCaps->nmachineTypes-1] = canonical;
            qemuCaps->machineAliases[qemuCaps->nmachineTypes-1] = name;
517
        } else {
518 519
            qemuCaps->machineTypes[qemuCaps->nmachineTypes-1] = name;
            qemuCaps->machineAliases[qemuCaps->nmachineTypes-1] = NULL;
520
        }
521 522
        /* When parsing from command line we don't have information about maxCpus */
        qemuCaps->machineMaxCpus[qemuCaps->nmachineTypes-1] = 0;
523 524
    } while ((p = next));

525

526
    if (defIdx)
527
        virQEMUCapsSetDefaultMachine(qemuCaps, defIdx);
528 529 530 531

    return 0;
}

532
static int
533 534
virQEMUCapsProbeMachineTypes(virQEMUCapsPtr qemuCaps,
                             uid_t runUid, gid_t runGid)
535 536
{
    char *output;
537 538
    int ret = -1;
    virCommandPtr cmd;
539
    int status;
540

541 542 543 544
    /* Make sure the binary we are about to try exec'ing exists.
     * Technically we could catch the exec() failure, but that's
     * in a sub-process so it's hard to feed back a useful error.
     */
545
    if (!virFileIsExecutable(qemuCaps->binary)) {
546
        virReportSystemError(errno, _("Cannot find QEMU binary %s"),
547
                             qemuCaps->binary);
548 549 550
        return -1;
    }

551
    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, runUid, runGid);
552
    virCommandAddArgList(cmd, "-M", "?", NULL);
553
    virCommandSetOutputBuffer(cmd, &output);
554

555 556
    /* Ignore failure from older qemu that did not understand '-M ?'.  */
    if (virCommandRun(cmd, &status) < 0)
557 558
        goto cleanup;

559
    if (virQEMUCapsParseMachineTypesStr(output, qemuCaps) < 0)
560
        goto cleanup;
561 562 563

    ret = 0;

564
 cleanup:
565 566
    VIR_FREE(output);
    virCommandFree(cmd);
567 568 569 570 571 572

    return ret;
}


typedef int
573 574
(*virQEMUCapsParseCPUModels)(const char *output,
                             virQEMUCapsPtr qemuCaps);
575 576 577 578 579 580 581

/* Format:
 *      <arch> <model>
 * qemu-0.13 encloses some model names in []:
 *      <arch> [<model>]
 */
static int
582 583
virQEMUCapsParseX86Models(const char *output,
                          virQEMUCapsPtr qemuCaps)
584 585 586
{
    const char *p = output;
    const char *next;
587
    int ret = -1;
588 589 590

    do {
        const char *t;
591
        size_t len;
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

        if ((next = strchr(p, '\n')))
            next++;

        if (!(t = strchr(p, ' ')) || (next && t >= next))
            continue;

        if (!STRPREFIX(p, "x86"))
            continue;

        p = t;
        while (*p == ' ')
            p++;

        if (*p == '\0' || *p == '\n')
            continue;

609
        if (VIR_EXPAND_N(qemuCaps->cpuDefinitions, qemuCaps->ncpuDefinitions, 1) < 0)
610
            goto cleanup;
611

612 613 614 615
        if (next)
            len = next - p - 1;
        else
            len = strlen(p);
616

617 618 619 620
        if (len > 2 && *p == '[' && p[len - 1] == ']') {
            p++;
            len -= 2;
        }
621

622
        if (VIR_STRNDUP(qemuCaps->cpuDefinitions[qemuCaps->ncpuDefinitions - 1], p, len) < 0)
623
            goto cleanup;
624 625
    } while ((p = next));

626
    ret = 0;
627

628
 cleanup:
629
    return ret;
630 631
}

P
Prerna Saxena 已提交
632 633 634 635
/* ppc64 parser.
 * Format : PowerPC <machine> <description>
 */
static int
636 637
virQEMUCapsParsePPCModels(const char *output,
                          virQEMUCapsPtr qemuCaps)
P
Prerna Saxena 已提交
638 639 640
{
    const char *p = output;
    const char *next;
641
    int ret = -1;
P
Prerna Saxena 已提交
642 643 644

    do {
        const char *t;
645
        size_t len;
P
Prerna Saxena 已提交
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665

        if ((next = strchr(p, '\n')))
            next++;

        if (!STRPREFIX(p, "PowerPC "))
            continue;

        /* Skip the preceding sub-string "PowerPC " */
        p += 8;

        /*Malformed string, does not obey the format 'PowerPC <model> <desc>'*/
        if (!(t = strchr(p, ' ')) || (next && t >= next))
            continue;

        if (*p == '\0')
            break;

        if (*p == '\n')
            continue;

666
        if (VIR_EXPAND_N(qemuCaps->cpuDefinitions, qemuCaps->ncpuDefinitions, 1) < 0)
667
            goto cleanup;
P
Prerna Saxena 已提交
668

669
        len = t - p - 1;
P
Prerna Saxena 已提交
670

671
        if (VIR_STRNDUP(qemuCaps->cpuDefinitions[qemuCaps->ncpuDefinitions - 1], p, len) < 0)
672
            goto cleanup;
P
Prerna Saxena 已提交
673 674
    } while ((p = next));

675
    ret = 0;
P
Prerna Saxena 已提交
676

677
 cleanup:
678
    return ret;
P
Prerna Saxena 已提交
679
}
680

681
static int
682
virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
683 684 685
{
    char *output = NULL;
    int ret = -1;
686
    virQEMUCapsParseCPUModels parse;
687
    virCommandPtr cmd;
688

689
    if (qemuCaps->arch == VIR_ARCH_I686 ||
690
        qemuCaps->arch == VIR_ARCH_X86_64) {
691
        parse = virQEMUCapsParseX86Models;
692
    } else if ARCH_IS_PPC64(qemuCaps->arch) {
693
        parse = virQEMUCapsParsePPCModels;
694
    } else {
695
        VIR_DEBUG("don't know how to parse %s CPU models",
696
                  virArchToString(qemuCaps->arch));
697 698 699
        return 0;
    }

700
    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, runUid, runGid);
701
    virCommandAddArgList(cmd, "-cpu", "?", NULL);
702
    virCommandSetOutputBuffer(cmd, &output);
703

704
    if (virCommandRun(cmd, NULL) < 0)
705 706
        goto cleanup;

707
    if (parse(output, qemuCaps) < 0)
708 709 710 711
        goto cleanup;

    ret = 0;

712
 cleanup:
713
    VIR_FREE(output);
714
    virCommandFree(cmd);
715 716 717 718

    return ret;
}

719
static char *
720 721
virQEMUCapsFindBinary(const char *format,
                      const char *archstr)
722
{
723 724
    char *ret = NULL;
    char *binary = NULL;
725

726 727
    if (virAsprintf(&binary, format, archstr) < 0)
        goto out;
728 729 730

    ret = virFindFileInPath(binary);
    VIR_FREE(binary);
731 732
    if (ret && virFileIsExecutable(ret))
        goto out;
733

734
    VIR_FREE(ret);
735

736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
 out:
    return ret;
}

static char *
virQEMUCapsFindBinaryForArch(virArch hostarch,
                             virArch guestarch)
{
    char *ret = NULL;
    const char *archstr;
    virArch target;

    /* First attempt: try the guest architecture as it is */
    archstr = virQEMUCapsArchToString(guestarch);
    if ((ret = virQEMUCapsFindBinary("qemu-system-%s", archstr)) != NULL)
        goto out;

    /* Second attempt: try looking up by target instead */
    target = virQEMUCapsFindTarget(hostarch, guestarch);
    if (target != guestarch) {
        archstr = virQEMUCapsArchToString(target);
        if ((ret = virQEMUCapsFindBinary("qemu-system-%s", archstr)) != NULL)
            goto out;
759
    }
760

761 762 763 764
    /* Third attempt, i686 only: try 'qemu' */
    if (guestarch == VIR_ARCH_I686) {
        if ((ret = virQEMUCapsFindBinary("%s", "qemu")) != NULL)
            goto out;
765
    }
766

767
 out:
768 769 770
    return ret;
}

771
static int
772 773 774 775
virQEMUCapsInitGuest(virCapsPtr caps,
                     virQEMUCapsCachePtr cache,
                     virArch hostarch,
                     virArch guestarch)
776
{
777
    size_t i;
778 779
    char *kvmbin = NULL;
    char *binary = NULL;
780 781
    virQEMUCapsPtr qemubinCaps = NULL;
    virQEMUCapsPtr kvmbinCaps = NULL;
782
    bool native_kvm, x86_32on64_kvm, arm_32on64_kvm, ppc64_kvm;
783 784
    int ret = -1;

J
Ján Tomko 已提交
785
    /* Check for existence of base emulator, or alternate base
786 787
     * which can be used with magic cpu choice
     */
788
    binary = virQEMUCapsFindBinaryForArch(hostarch, guestarch);
789

790
    /* Ignore binary if extracting version info fails */
791
    if (binary) {
792
        if (!(qemubinCaps = virQEMUCapsCacheLookup(cache, binary))) {
793 794 795 796
            virResetLastError();
            VIR_FREE(binary);
        }
    }
797 798

    /* qemu-kvm/kvm binaries can only be used if
799
     *  - host & guest arches match
800 801
     *  - hostarch is x86_64 and guest arch is i686 (needs -cpu qemu32)
     *  - hostarch is aarch64 and guest arch is armv7l (needs -cpu aarch64=off)
802
     *  - hostarch and guestarch are both ppc64*
803
     */
804 805 806 807 808
    native_kvm = (hostarch == guestarch);
    x86_32on64_kvm = (hostarch == VIR_ARCH_X86_64 &&
        guestarch == VIR_ARCH_I686);
    arm_32on64_kvm = (hostarch == VIR_ARCH_AARCH64 &&
        guestarch == VIR_ARCH_ARMV7L);
809
    ppc64_kvm = (ARCH_IS_PPC64(hostarch) && ARCH_IS_PPC64(guestarch));
810

811
    if (native_kvm || x86_32on64_kvm || arm_32on64_kvm || ppc64_kvm) {
812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828
        const char *kvmbins[] = {
            "/usr/libexec/qemu-kvm", /* RHEL */
            "qemu-kvm", /* Fedora */
            "kvm", /* Debian/Ubuntu */
            NULL,
        };

        /* x86 32-on-64 can be used with qemu-system-i386 and
         * qemu-system-x86_64, so if we don't find a specific kvm binary,
         * we can just fall back to the host arch native binary and
         * everything works fine.
         *
         * arm is different in that 32-on-64 _only_ works with
         * qemu-system-aarch64. So we have to add it to the kvmbins list
         */
        if (arm_32on64_kvm)
            kvmbins[3] = "qemu-system-aarch64";
829

830
        for (i = 0; i < ARRAY_CARDINALITY(kvmbins); ++i) {
831 832 833
            if (!kvmbins[i])
                continue;

834
            kvmbin = virFindFileInPath(kvmbins[i]);
835

836 837
            if (!kvmbin)
                continue;
838

839
            if (!(kvmbinCaps = virQEMUCapsCacheLookup(cache, kvmbin))) {
840
                virResetLastError();
841 842 843
                VIR_FREE(kvmbin);
                continue;
            }
844

845 846
            if (!binary) {
                binary = kvmbin;
847
                qemubinCaps = kvmbinCaps;
848
                kvmbin = NULL;
849
                kvmbinCaps = NULL;
850
            }
851
            break;
852 853 854
        }
    }

855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882
    ret = virQEMUCapsInitGuestFromBinary(caps,
                                         binary, qemubinCaps,
                                         kvmbin, kvmbinCaps,
                                         guestarch);

    VIR_FREE(binary);
    VIR_FREE(kvmbin);
    virObjectUnref(qemubinCaps);
    virObjectUnref(kvmbinCaps);

    return ret;
}

int
virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
                               const char *binary,
                               virQEMUCapsPtr qemubinCaps,
                               const char *kvmbin,
                               virQEMUCapsPtr kvmbinCaps,
                               virArch guestarch)
{
    virCapsGuestPtr guest;
    bool haskvm = false;
    virCapsGuestMachinePtr *machines = NULL;
    size_t nmachines = 0;
    int ret = -1;
    bool hasdisksnapshot = false;

883 884 885
    if (!binary)
        return 0;

886
    if (virFileExists("/dev/kvm") &&
887 888
        (virQEMUCapsGet(qemubinCaps, QEMU_CAPS_KVM) ||
         virQEMUCapsGet(qemubinCaps, QEMU_CAPS_ENABLE_KVM) ||
889
         kvmbin))
890
        haskvm = true;
891

892
    if (virQEMUCapsGetMachineTypesCaps(qemubinCaps, &nmachines, &machines) < 0)
893
        goto cleanup;
894 895 896 897

    /* We register kvm as the base emulator too, since we can
     * just give -no-kvm to disable acceleration if required */
    if ((guest = virCapabilitiesAddGuest(caps,
898
                                         VIR_DOMAIN_OSTYPE_HVM,
899
                                         guestarch,
900 901 902 903
                                         binary,
                                         NULL,
                                         nmachines,
                                         machines)) == NULL)
904
        goto cleanup;
905 906 907 908 909

    machines = NULL;
    nmachines = 0;

    if (caps->host.cpu &&
J
Jiri Denemark 已提交
910
        caps->host.cpu->model &&
911
        virQEMUCapsGetCPUDefinitions(qemubinCaps, NULL) > 0 &&
912
        !virCapabilitiesAddGuestFeature(guest, "cpuselection", true, false))
913
        goto cleanup;
914

915
    if (virQEMUCapsGet(qemubinCaps, QEMU_CAPS_BOOTINDEX) &&
916
        !virCapabilitiesAddGuestFeature(guest, "deviceboot", true, false))
917
        goto cleanup;
918

919 920 921
    if (virQEMUCapsGet(qemubinCaps, QEMU_CAPS_DISK_SNAPSHOT))
        hasdisksnapshot = true;

922 923
    if (!virCapabilitiesAddGuestFeature(guest, "disksnapshot", hasdisksnapshot,
                                        false))
924
        goto cleanup;
925

D
Daniel P. Berrange 已提交
926
    if (virCapabilitiesAddGuestDomain(guest,
927
                                      VIR_DOMAIN_VIRT_QEMU,
D
Daniel P. Berrange 已提交
928 929 930 931
                                      NULL,
                                      NULL,
                                      0,
                                      NULL) == NULL)
932
        goto cleanup;
933

D
Daniel P. Berrange 已提交
934 935
    if (haskvm) {
        virCapsGuestDomainPtr dom;
936

D
Daniel P. Berrange 已提交
937
        if (kvmbin &&
938
            virQEMUCapsGetMachineTypesCaps(kvmbinCaps, &nmachines, &machines) < 0)
939
            goto cleanup;
940

D
Daniel P. Berrange 已提交
941
        if ((dom = virCapabilitiesAddGuestDomain(guest,
942
                                                 VIR_DOMAIN_VIRT_KVM,
D
Daniel P. Berrange 已提交
943 944 945 946
                                                 kvmbin ? kvmbin : binary,
                                                 NULL,
                                                 nmachines,
                                                 machines)) == NULL) {
947
            goto cleanup;
D
Daniel P. Berrange 已提交
948
        }
949

D
Daniel P. Berrange 已提交
950 951
        machines = NULL;
        nmachines = 0;
952 953 954

    }

955 956
    if (((guestarch == VIR_ARCH_I686) ||
         (guestarch == VIR_ARCH_X86_64)) &&
957 958
        (virCapabilitiesAddGuestFeature(guest, "acpi", true, true) == NULL ||
         virCapabilitiesAddGuestFeature(guest, "apic", true, false) == NULL))
959
        goto cleanup;
960

961
    if ((guestarch == VIR_ARCH_I686) &&
962 963
        (virCapabilitiesAddGuestFeature(guest, "pae", true, false) == NULL ||
         virCapabilitiesAddGuestFeature(guest, "nonpae", true, false) == NULL))
964
        goto cleanup;
965 966 967

    ret = 0;

968
 cleanup:
969 970 971

    virCapabilitiesFreeMachines(machines, nmachines);

972
    return ret;
973 974 975 976
}


static int
977 978
virQEMUCapsInitCPU(virCapsPtr caps,
                   virArch arch)
979 980
{
    virCPUDefPtr cpu = NULL;
981
    virCPUDataPtr data = NULL;
982 983 984
    virNodeInfo nodeinfo;
    int ret = -1;

985
    if (VIR_ALLOC(cpu) < 0)
986 987
        goto error;

988 989
    cpu->arch = arch;

990
    if (nodeGetInfo(NULL, &nodeinfo))
991 992 993 994 995 996
        goto error;

    cpu->type = VIR_CPU_TYPE_HOST;
    cpu->sockets = nodeinfo.sockets;
    cpu->cores = nodeinfo.cores;
    cpu->threads = nodeinfo.threads;
J
Jiri Denemark 已提交
997
    caps->host.cpu = cpu;
998

999
    if (!(data = cpuNodeData(arch))
1000
        || cpuDecode(cpu, data, NULL, 0, NULL) < 0)
J
Jiri Denemark 已提交
1001
        goto cleanup;
1002 1003 1004

    ret = 0;

1005
 cleanup:
J
Jiri Denemark 已提交
1006
    cpuDataFree(data);
1007 1008 1009

    return ret;

1010
 error:
1011 1012 1013 1014 1015
    virCPUDefFree(cpu);
    goto cleanup;
}


M
Michal Privoznik 已提交
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
static int
virQEMUCapsInitPages(virCapsPtr caps)
{
    int ret = -1;
    unsigned int *pages_size = NULL;
    size_t npages;

    if (virNumaGetPages(-1 /* Magic constant for overall info */,
                        &pages_size, NULL, NULL, &npages) < 0)
        goto cleanup;

    caps->host.pagesSize = pages_size;
    pages_size = NULL;
    caps->host.nPagesSize = npages;
    npages = 0;

    ret = 0;
 cleanup:
    VIR_FREE(pages_size);
    return ret;
}


1039
virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache)
1040 1041
{
    virCapsPtr caps;
1042
    size_t i;
T
Tal Kain 已提交
1043
    virArch hostarch = virArchFromHost();
1044

T
Tal Kain 已提交
1045
    if ((caps = virCapabilitiesNew(hostarch,
1046
                                   true, true)) == NULL)
1047
        goto error;
1048 1049 1050 1051 1052

    /* Some machines have problematic NUMA toplogy causing
     * unexpected failures. We don't want to break the QEMU
     * driver in this scenario, so log errors & carry on
     */
1053
    if (nodeCapsInitNUMA(NULL, caps) < 0) {
1054
        virCapabilitiesFreeNUMAInfo(caps);
1055
        VIR_WARN("Failed to query host NUMA topology, disabling NUMA capabilities");
1056 1057
    }

T
Tal Kain 已提交
1058
    if (virQEMUCapsInitCPU(caps, hostarch) < 0)
1059
        VIR_WARN("Failed to get host CPU");
1060

1061
    /* Add the power management features of the host */
1062
    if (virNodeSuspendGetTargetMask(&caps->host.powerMgmt) < 0)
1063 1064
        VIR_WARN("Failed to get host power management capabilities");

M
Michal Privoznik 已提交
1065 1066 1067 1068
    /* Add huge pages info */
    if (virQEMUCapsInitPages(caps) < 0)
        VIR_WARN("Failed to get pages info");

1069 1070 1071
    /* Add domain migration transport URIs */
    virCapabilitiesAddHostMigrateTransport(caps, "tcp");
    virCapabilitiesAddHostMigrateTransport(caps, "rdma");
1072

1073 1074 1075 1076
    /* QEMU can support pretty much every arch that exists,
     * so just probe for them all - we gracefully fail
     * if a qemu-system-$ARCH binary can't be found
     */
1077
    for (i = 0; i < VIR_ARCH_LAST; i++)
1078
        if (virQEMUCapsInitGuest(caps, cache,
T
Tal Kain 已提交
1079
                                 hostarch,
1080
                                 i) < 0)
1081
            goto error;
1082 1083 1084

    return caps;

1085
 error:
1086
    virObjectUnref(caps);
1087 1088 1089 1090
    return NULL;
}


1091
static int
1092 1093 1094 1095
virQEMUCapsComputeCmdFlags(const char *help,
                           unsigned int version,
                           virQEMUCapsPtr qemuCaps,
                           bool check_yajl ATTRIBUTE_UNUSED)
1096 1097
{
    const char *p;
R
Richa Marwaha 已提交
1098
    const char *fsdev, *netdev;
1099
    const char *cache;
1100 1101

    if (strstr(help, "-no-kvm"))
1102
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
1103
    if (strstr(help, "-enable-kvm"))
1104
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_ENABLE_KVM);
1105 1106
    if (strstr(help, ",process="))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NAME_PROCESS);
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123

    cache = strstr(help, "cache=");
    if (cache && (p = strchr(cache, ']'))) {
        if (memmem(cache, p - cache, "directsync", sizeof("directsync") - 1))
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
        if (memmem(cache, p - cache, "unsafe", sizeof("unsafe") - 1))
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_UNSAFE);
    }
    if (strstr(help, "readonly="))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_READONLY);
    if (strstr(help, "aio=threads|native"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_AIO);
    if (strstr(help, "copy-on-read=on|off"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_COPY_ON_READ);
    if (strstr(help, "bps="))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_IOTUNE);

1124 1125 1126
    if ((p = strstr(help, "-vga")) && !strstr(help, "-std-vga")) {
        const char *nl = strstr(p, "\n");
        if (strstr(p, "|qxl"))
1127
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_VGA_QXL);
1128
        if ((p = strstr(p, "|none")) && p < nl)
1129
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_VGA_NONE);
1130 1131
    }
    if (strstr(help, "-spice"))
1132
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SPICE);
1133
    if (strstr(help, "-vnc"))
1134
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC);
1135
    if (strstr(help, "seamless-migration="))
1136
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION);
1137
    if (strstr(help, "boot=on"))
1138
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_BOOT);
1139
    if (strstr(help, "serial=s"))
1140
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL);
1141
    if (strstr(help, "-pcidevice"))
1142
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCIDEVICE);
1143 1144
    if (strstr(help, "host=[seg:]bus"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_HOST_PCI_MULTIDOMAIN);
1145
    if (strstr(help, "-mem-path"))
1146
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MEM_PATH);
1147
    if (strstr(help, "-chardev")) {
1148
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV);
1149
        if (strstr(help, "-chardev spicevmc"))
1150
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC);
1151 1152
        if (strstr(help, "-chardev spiceport"))
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEPORT);
1153
    }
1154
    if (strstr(help, "-balloon"))
1155
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_BALLOON);
1156
    if (strstr(help, "-device")) {
1157
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE);
1158 1159 1160 1161
        /*
         * When -device was introduced, qemu already supported drive's
         * readonly option but didn't advertise that.
         */
1162
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_READONLY);
1163 1164
    }
    if (strstr(help, "-nodefconfig"))
1165
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NODEFCONFIG);
1166
    if (strstr(help, "-no-user-config"))
1167
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG);
1168 1169
    /* The trailing ' ' is important to avoid a bogus match */
    if (strstr(help, "-rtc "))
1170
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_RTC);
1171 1172
    /* to wit */
    if (strstr(help, "-rtc-td-hack"))
1173
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_RTC_TD_HACK);
1174
    if (strstr(help, "-no-hpet"))
1175
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_HPET);
1176
    if (strstr(help, "-no-acpi"))
1177
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_ACPI);
1178
    if (strstr(help, "-no-kvm-pit-reinjection"))
1179
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT);
1180
    if (strstr(help, "-tdf"))
1181
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_TDF);
1182
    if (strstr(help, "-enable-nesting"))
1183
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NESTING);
1184
    if (strstr(help, ",menu=on"))
1185
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_BOOT_MENU);
1186
    if (strstr(help, ",reboot-timeout=rb_time"))
1187
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_REBOOT_TIMEOUT);
1188 1189
    if (strstr(help, ",splash-time=sp_time"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SPLASH_TIMEOUT);
1190
    if ((fsdev = strstr(help, "-fsdev"))) {
1191
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV);
1192
        if (strstr(fsdev, "readonly"))
1193
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV_READONLY);
1194
        if (strstr(fsdev, "writeout"))
1195
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV_WRITEOUT);
1196
    }
1197
    if (strstr(help, "-smbios type"))
1198
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SMBIOS_TYPE);
1199
    if (strstr(help, "-sandbox"))
1200
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SECCOMP_SANDBOX);
1201

R
Richa Marwaha 已提交
1202
    if ((netdev = strstr(help, "-netdev"))) {
1203 1204
        /* Disable -netdev on 0.12 since although it exists,
         * the corresponding netdev_add/remove monitor commands
1205 1206
         * do not, and we need them to be able to do hotplug.
         * But see below about RHEL build. */
R
Richa Marwaha 已提交
1207 1208
        if (version >= 13000) {
            if (strstr(netdev, "bridge"))
1209
                virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV_BRIDGE);
1210
            virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV);
R
Richa Marwaha 已提交
1211
        }
1212 1213 1214
    }

    if (strstr(help, "-sdl"))
1215
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SDL);
1216 1217 1218
    if (strstr(help, "cores=") &&
        strstr(help, "threads=") &&
        strstr(help, "sockets="))
1219
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_SMP_TOPOLOGY);
1220

1221
    if (strstr(help, ",vhost="))
1222
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VHOST_NET);
1223

1224 1225
    /* Do not use -no-shutdown if qemu doesn't support it or SIGTERM handling
     * is most likely buggy when used with -no-shutdown (which applies for qemu
1226
     * 0.14.* and 0.15.0)
1227
     */
1228
    if (strstr(help, "-no-shutdown") && (version < 14000 || version > 15000))
1229
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_SHUTDOWN);
1230

1231
    if (strstr(help, "dump-guest-core=on|off"))
1232
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE);
1233

O
Olivia Yin 已提交
1234 1235 1236
    if (strstr(help, "-dtb"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB);

1237 1238 1239
    if (strstr(help, "-machine"))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_OPT);

1240
    if (version >= 11000)
1241
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_SG_IO);
1242

1243 1244 1245
    /* While JSON mode was available in 0.12.0, it was too
     * incomplete to contemplate using. The 0.13.0 release
     * is good enough to use, even though it lacks one or
1246 1247 1248 1249 1250
     * two features. This is also true of versions of qemu
     * built for RHEL, labeled 0.12.1, but with extra text
     * in the help output that mentions that features were
     * backported for libvirt. The benefits of JSON mode now
     * outweigh the downside.
1251
     */
1252
#if WITH_YAJL
1253
    if (version >= 13000) {
1254
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MONITOR_JSON);
1255 1256
    } else if (version >= 12000 &&
               strstr(help, "libvirt")) {
1257 1258
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MONITOR_JSON);
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV);
1259
    }
1260 1261 1262 1263 1264
#else
    /* Starting with qemu 0.15 and newer, upstream qemu no longer
     * promises to keep the human interface stable, but requests that
     * we use QMP (the JSON interface) for everything.  If the user
     * forgot to include YAJL libraries when building their own
M
Martin Kletzander 已提交
1265
     * libvirt but is targeting a newer qemu, we are better off
1266
     * telling them to recompile (the spec file includes the
1267
     * dependency, so distros won't hit this).  This check is
1268
     * also in m4/virt-yajl.m4 (see $with_yajl).  */
1269 1270 1271
    if (version >= 15000 ||
        (version >= 12000 && strstr(help, "libvirt"))) {
        if (check_yajl) {
1272 1273 1274
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("this qemu binary requires libvirt to be "
                             "compiled with yajl"));
1275 1276
            return -1;
        }
1277
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV);
1278
    }
E
Eric Blake 已提交
1279
#endif
1280 1281

    if (version >= 13000)
1282
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION);
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294

    /* Although very new versions of qemu advertise the presence of
     * the rombar option in the output of "qemu -device pci-assign,?",
     * this advertisement was added to the code long after the option
     * itself. According to qemu developers, though, rombar is
     * available in all qemu binaries from release 0.12 onward.
     * Setting the capability this way makes it available in more
     * cases where it might be needed, and shouldn't cause any false
     * positives (in the case that it did, qemu would produce an error
     * log and refuse to start, so it would be immediately obvious).
     */
    if (version >= 12000)
1295
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_ROMBAR);
1296 1297

    if (version >= 11000)
1298
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST);
1299

1300
    if (version >= 1001000) {
J
Ján Tomko 已提交
1301
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION);
1302 1303
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC_SHARE_POLICY);
    }
J
Ján Tomko 已提交
1304

1305
    return 0;
1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
}

/* We parse the output of 'qemu -help' to get the QEMU
 * version number. The first bit is easy, just parse
 * 'QEMU PC emulator version x.y.z'
 * or
 * 'QEMU emulator version x.y.z'.
 *
 * With qemu-kvm, however, that is followed by a string
 * in parenthesis as follows:
 *  - qemu-kvm-x.y.z in stable releases
 *  - kvm-XX for kvm versions up to kvm-85
 *  - qemu-kvm-devel-XX for kvm version kvm-86 and later
 *
 * For qemu-kvm versions before 0.10.z, we need to detect
 * the KVM version number for some features. With 0.10.z
 * and later, we just need the QEMU version number and
 * whether it is KVM QEMU or mainline QEMU.
 */
#define QEMU_VERSION_STR_1  "QEMU emulator version"
#define QEMU_VERSION_STR_2  "QEMU PC emulator version"
#define QEMU_KVM_VER_PREFIX "(qemu-kvm-"
#define KVM_VER_PREFIX      "(kvm-"

#define SKIP_BLANKS(p) do { while ((*(p) == ' ') || (*(p) == '\t')) (p)++; } while (0)

1332 1333 1334 1335
int virQEMUCapsParseHelpStr(const char *qemu,
                            const char *help,
                            virQEMUCapsPtr qemuCaps,
                            unsigned int *version,
1336
                            bool *is_kvm,
1337
                            unsigned int *kvm_version,
1338 1339
                            bool check_yajl,
                            const char *qmperr)
1340 1341 1342
{
    unsigned major, minor, micro;
    const char *p = help;
1343
    char *strflags;
1344

1345 1346
    *version = *kvm_version = 0;
    *is_kvm = false;
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363

    if (STRPREFIX(p, QEMU_VERSION_STR_1))
        p += strlen(QEMU_VERSION_STR_1);
    else if (STRPREFIX(p, QEMU_VERSION_STR_2))
        p += strlen(QEMU_VERSION_STR_2);
    else
        goto fail;

    SKIP_BLANKS(p);

    major = virParseNumber(&p);
    if (major == -1 || *p != '.')
        goto fail;

    ++p;

    minor = virParseNumber(&p);
J
Jiri Denemark 已提交
1364
    if (minor == -1)
1365 1366
        goto fail;

J
Jiri Denemark 已提交
1367 1368 1369 1370 1371 1372 1373 1374
    if (*p != '.') {
        micro = 0;
    } else {
        ++p;
        micro = virParseNumber(&p);
        if (micro == -1)
            goto fail;
    }
1375 1376 1377 1378

    SKIP_BLANKS(p);

    if (STRPREFIX(p, QEMU_KVM_VER_PREFIX)) {
1379
        *is_kvm = true;
1380 1381 1382 1383
        p += strlen(QEMU_KVM_VER_PREFIX);
    } else if (STRPREFIX(p, KVM_VER_PREFIX)) {
        int ret;

1384
        *is_kvm = true;
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395
        p += strlen(KVM_VER_PREFIX);

        ret = virParseNumber(&p);
        if (ret == -1)
            goto fail;

        *kvm_version = ret;
    }

    *version = (major * 1000 * 1000) + (minor * 1000) + micro;

1396 1397 1398 1399 1400 1401 1402
    if (*version < 12000) {
        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                       _("QEMU version >= 0.12.00 is required, but %d.%d.%d found"),
                       major, minor, micro);
        goto cleanup;
    }

1403 1404 1405 1406
    /* Refuse to parse -help output for QEMU releases >= 1.2.0 that should be
     * using QMP probing.
     */
    if (*version >= 1002000) {
1407 1408 1409 1410 1411 1412 1413 1414 1415
        if (qmperr && *qmperr) {
            virReportError(VIR_ERR_INTERNAL_ERROR,
                           _("QEMU / QMP failed: %s"),
                           qmperr);
        } else {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                           _("QEMU %u.%u.%u is too new for help parsing"),
                           major, minor, micro);
        }
1416 1417 1418
        goto cleanup;
    }

1419
    if (virQEMUCapsComputeCmdFlags(help, *version,
1420
                                   qemuCaps, check_yajl) < 0)
1421
        goto cleanup;
1422

1423
    strflags = virBitmapString(qemuCaps->flags);
1424 1425 1426
    VIR_DEBUG("Version %u.%u.%u, cooked version %u, flags %s",
              major, minor, micro, *version, NULLSTR(strflags));
    VIR_FREE(strflags);
1427 1428 1429 1430 1431 1432 1433 1434

    if (*kvm_version)
        VIR_DEBUG("KVM version %d detected", *kvm_version);
    else if (*is_kvm)
        VIR_DEBUG("qemu-kvm version %u.%u.%u detected", major, minor, micro);

    return 0;

1435
 fail:
1436
    p = strchr(help, '\n');
1437 1438
    if (!p)
        p = strchr(help, '\0');
1439

1440 1441 1442
    virReportError(VIR_ERR_INTERNAL_ERROR,
                   _("cannot parse %s version number in '%.*s'"),
                   qemu, (int) (p - help), help);
1443

1444
 cleanup:
1445 1446 1447
    return -1;
}

1448

1449
struct virQEMUCapsStringFlags {
1450 1451 1452 1453 1454
    const char *value;
    int flag;
};


1455 1456 1457
struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
    { "system_wakeup", QEMU_CAPS_WAKEUP },
    { "transaction", QEMU_CAPS_TRANSACTION },
1458 1459
    { "block_stream", QEMU_CAPS_BLOCKJOB_SYNC },
    { "block-stream", QEMU_CAPS_BLOCKJOB_ASYNC },
1460 1461 1462 1463 1464 1465 1466 1467 1468
    { "dump-guest-memory", QEMU_CAPS_DUMP_GUEST_MEMORY },
    { "query-spice", QEMU_CAPS_SPICE },
    { "query-kvm", QEMU_CAPS_KVM },
    { "block-commit", QEMU_CAPS_BLOCK_COMMIT },
    { "query-vnc", QEMU_CAPS_VNC },
    { "drive-mirror", QEMU_CAPS_DRIVE_MIRROR },
    { "blockdev-snapshot-sync", QEMU_CAPS_DISK_SNAPSHOT },
    { "add-fd", QEMU_CAPS_ADD_FD },
    { "nbd-server-start", QEMU_CAPS_NBD_SERVER },
1469
    { "change-backing-file", QEMU_CAPS_CHANGE_BACKING_FILE },
1470
    { "rtc-reset-reinjection", QEMU_CAPS_RTC_RESET_REINJECTION },
1471
    { "migrate-incoming", QEMU_CAPS_INCOMING_DEFER },
1472 1473
};

1474 1475 1476 1477
struct virQEMUCapsStringFlags virQEMUCapsMigration[] = {
    { "rdma-pin-all", QEMU_CAPS_MIGRATE_RDMA },
};

1478 1479 1480
struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
    { "BALLOON_CHANGE", QEMU_CAPS_BALLOON_EVENT },
    { "SPICE_MIGRATE_COMPLETED", QEMU_CAPS_SEAMLESS_MIGRATION },
1481
    { "DEVICE_DELETED", QEMU_CAPS_DEVICE_DEL_EVENT },
1482
    { "MIGRATION", QEMU_CAPS_MIGRATION_EVENT },
1483 1484
};

1485
struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
    { "hda-duplex", QEMU_CAPS_HDA_DUPLEX },
    { "hda-micro", QEMU_CAPS_HDA_MICRO },
    { "ccid-card-emulated", QEMU_CAPS_CCID_EMULATED },
    { "ccid-card-passthru", QEMU_CAPS_CCID_PASSTHRU },
    { "piix3-usb-uhci", QEMU_CAPS_PIIX3_USB_UHCI },
    { "piix4-usb-uhci", QEMU_CAPS_PIIX4_USB_UHCI },
    { "usb-ehci", QEMU_CAPS_USB_EHCI },
    { "ich9-usb-ehci1", QEMU_CAPS_ICH9_USB_EHCI1 },
    { "vt82c686b-usb-uhci", QEMU_CAPS_VT82C686B_USB_UHCI },
    { "pci-ohci", QEMU_CAPS_PCI_OHCI },
    { "nec-usb-xhci", QEMU_CAPS_NEC_USB_XHCI },
    { "usb-redir", QEMU_CAPS_USB_REDIR },
    { "usb-hub", QEMU_CAPS_USB_HUB },
    { "ich9-ahci", QEMU_CAPS_ICH9_AHCI },
    { "virtio-blk-s390", QEMU_CAPS_VIRTIO_S390 },
1501
    { "virtio-blk-ccw", QEMU_CAPS_VIRTIO_CCW },
1502
    { "sclpconsole", QEMU_CAPS_SCLP_S390 },
1503
    { "lsi53c895a", QEMU_CAPS_SCSI_LSI },
1504
    { "virtio-scsi-pci", QEMU_CAPS_VIRTIO_SCSI },
1505 1506
    { "virtio-scsi-s390", QEMU_CAPS_VIRTIO_SCSI },
    { "virtio-scsi-ccw", QEMU_CAPS_VIRTIO_SCSI },
1507
    { "virtio-scsi-device", QEMU_CAPS_VIRTIO_SCSI },
1508
    { "megasas", QEMU_CAPS_SCSI_MEGASAS },
1509 1510
    { "spicevmc", QEMU_CAPS_DEVICE_SPICEVMC },
    { "qxl-vga", QEMU_CAPS_DEVICE_QXL_VGA },
1511
    { "qxl", QEMU_CAPS_DEVICE_QXL },
1512 1513 1514 1515
    { "sga", QEMU_CAPS_SGA },
    { "scsi-block", QEMU_CAPS_SCSI_BLOCK },
    { "scsi-cd", QEMU_CAPS_SCSI_CD },
    { "ide-cd", QEMU_CAPS_IDE_CD },
1516 1517 1518
    { "VGA", QEMU_CAPS_DEVICE_VGA },
    { "cirrus-vga", QEMU_CAPS_DEVICE_CIRRUS_VGA },
    { "vmware-svga", QEMU_CAPS_DEVICE_VMWARE_SVGA },
H
Han Cheng 已提交
1519 1520
    { "usb-serial", QEMU_CAPS_DEVICE_USB_SERIAL },
    { "usb-net", QEMU_CAPS_DEVICE_USB_NET },
1521
    { "virtio-rng-pci", QEMU_CAPS_DEVICE_VIRTIO_RNG },
1522 1523
    { "virtio-rng-s390", QEMU_CAPS_DEVICE_VIRTIO_RNG },
    { "virtio-rng-ccw", QEMU_CAPS_DEVICE_VIRTIO_RNG },
1524
    { "virtio-rng-device", QEMU_CAPS_DEVICE_VIRTIO_RNG },
1525
    { "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM },
1526
    { "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD },
1527
    { "spapr-nvram", QEMU_CAPS_DEVICE_NVRAM },
1528
    { "pci-bridge", QEMU_CAPS_DEVICE_PCI_BRIDGE },
1529
    { "vfio-pci", QEMU_CAPS_DEVICE_VFIO_PCI },
H
Han Cheng 已提交
1530
    { "scsi-generic", QEMU_CAPS_DEVICE_SCSI_GENERIC },
1531
    { "i82801b11-bridge", QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE },
1532
    { "usb-storage", QEMU_CAPS_DEVICE_USB_STORAGE },
1533
    { "virtio-mmio", QEMU_CAPS_DEVICE_VIRTIO_MMIO },
1534
    { "ich9-intel-hda", QEMU_CAPS_DEVICE_ICH9_INTEL_HDA },
H
Hu Tao 已提交
1535
    { "pvpanic", QEMU_CAPS_DEVICE_PANIC },
L
Li Zhang 已提交
1536
    { "usb-kbd", QEMU_CAPS_DEVICE_USB_KBD },
1537
    { "memory-backend-ram", QEMU_CAPS_OBJECT_MEMORY_RAM },
1538
    { "memory-backend-file", QEMU_CAPS_OBJECT_MEMORY_FILE },
1539
    { "usb-audio", QEMU_CAPS_OBJECT_USB_AUDIO },
J
John Ferlan 已提交
1540
    { "iothread", QEMU_CAPS_OBJECT_IOTHREAD},
1541
    { "ivshmem", QEMU_CAPS_DEVICE_IVSHMEM },
1542
    { "pc-dimm", QEMU_CAPS_DEVICE_PC_DIMM },
M
Michal Privoznik 已提交
1543
    { "pci-serial", QEMU_CAPS_DEVICE_PCI_SERIAL },
1544
    { "gpex-pcihost", QEMU_CAPS_OBJECT_GPEX},
1545
    { "ioh3420", QEMU_CAPS_DEVICE_IOH3420 },
1546
    { "x3130-upstream", QEMU_CAPS_DEVICE_X3130_UPSTREAM },
1547
    { "xio3130-downstream", QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM },
1548
    { "rtl8139", QEMU_CAPS_DEVICE_RTL8139 },
1549
    { "e1000", QEMU_CAPS_DEVICE_E1000 },
1550 1551 1552 1553
    { "virtio-net-pci", QEMU_CAPS_DEVICE_VIRTIO_NET },
    { "virtio-net-ccw", QEMU_CAPS_DEVICE_VIRTIO_NET },
    { "virtio-net-s390", QEMU_CAPS_DEVICE_VIRTIO_NET },
    { "virtio-net-device", QEMU_CAPS_DEVICE_VIRTIO_NET },
M
Marc-André Lureau 已提交
1554 1555
    { "virtio-gpu-pci", QEMU_CAPS_DEVICE_VIRTIO_GPU },
    { "virtio-gpu-device", QEMU_CAPS_DEVICE_VIRTIO_GPU },
1556 1557 1558 1559 1560 1561
    { "virtio-keyboard-device", QEMU_CAPS_VIRTIO_KEYBOARD },
    { "virtio-keyboard-pci", QEMU_CAPS_VIRTIO_KEYBOARD },
    { "virtio-mouse-device", QEMU_CAPS_VIRTIO_MOUSE },
    { "virtio-mouse-pci", QEMU_CAPS_VIRTIO_MOUSE },
    { "virtio-tablet-device", QEMU_CAPS_VIRTIO_TABLET },
    { "virtio-tablet-pci", QEMU_CAPS_VIRTIO_TABLET },
1562 1563
    { "virtio-input-host-device", QEMU_CAPS_VIRTIO_INPUT_HOST },
    { "virtio-input-host-pci", QEMU_CAPS_VIRTIO_INPUT_HOST },
1564 1565
};

1566
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
1567 1568 1569 1570 1571 1572 1573 1574
    { "multifunction", QEMU_CAPS_PCI_MULTIFUNCTION },
    { "bootindex", QEMU_CAPS_BOOTINDEX },
    { "ioeventfd", QEMU_CAPS_VIRTIO_IOEVENTFD },
    { "event_idx", QEMU_CAPS_VIRTIO_BLK_EVENT_IDX },
    { "scsi", QEMU_CAPS_VIRTIO_BLK_SCSI },
    { "logical_block_size", QEMU_CAPS_BLOCKIO },
};

1575
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioNet[] = {
1576 1577 1578 1579
    { "tx", QEMU_CAPS_VIRTIO_TX_ALG },
    { "event_idx", QEMU_CAPS_VIRTIO_NET_EVENT_IDX },
};

1580
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsPCIAssign[] = {
1581
    { "rombar", QEMU_CAPS_PCI_ROMBAR },
1582 1583 1584 1585
    { "configfd", QEMU_CAPS_PCI_CONFIGFD },
    { "bootindex", QEMU_CAPS_PCI_BOOTINDEX },
};

1586
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVfioPCI[] = {
1587 1588 1589
    { "bootindex", QEMU_CAPS_VFIO_PCI_BOOTINDEX },
};

1590
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsSCSIDisk[] = {
1591 1592 1593 1594
    { "channel", QEMU_CAPS_SCSI_DISK_CHANNEL },
    { "wwn", QEMU_CAPS_SCSI_DISK_WWN },
};

1595
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsIDEDrive[] = {
1596 1597 1598
    { "wwn", QEMU_CAPS_IDE_DRIVE_WWN },
};

1599
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsPixx4PM[] = {
1600 1601 1602 1603
    { "disable_s3", QEMU_CAPS_DISABLE_S3 },
    { "disable_s4", QEMU_CAPS_DISABLE_S4 },
};

1604
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsUSBRedir[] = {
1605
    { "filter", QEMU_CAPS_USB_REDIR_FILTER },
1606 1607 1608
    { "bootindex", QEMU_CAPS_USB_REDIR_BOOTINDEX },
};

1609
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsUSBHost[] = {
1610
    { "bootindex", QEMU_CAPS_USB_HOST_BOOTINDEX },
1611 1612
};

1613
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsSCSIGeneric[] = {
H
Han Cheng 已提交
1614 1615 1616
    { "bootindex", QEMU_CAPS_DEVICE_SCSI_GENERIC_BOOTINDEX },
};

1617
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsI440FXPCIHost[] = {
1618 1619 1620
    { "pci-hole64-size", QEMU_CAPS_I440FX_PCI_HOLE64_SIZE },
};

1621
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQ35PCIHost[] = {
1622 1623 1624
    { "pci-hole64-size", QEMU_CAPS_Q35_PCI_HOLE64_SIZE },
};

1625
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsUSBStorage[] = {
1626 1627 1628
    { "removable", QEMU_CAPS_USB_STORAGE_REMOVABLE },
};

1629 1630 1631 1632
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsKVMPit[] = {
    { "lost_tick_policy", QEMU_CAPS_KVM_PIT_TICK_POLICY },
};

1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVGA[] = {
    { "vgamem_mb", QEMU_CAPS_VGA_VGAMEM },
};

static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVmwareSvga[] = {
    { "vgamem_mb", QEMU_CAPS_VMWARE_SVGA_VGAMEM },
};

static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQxl[] = {
    { "vgamem_mb", QEMU_CAPS_QXL_VGAMEM },
};

static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQxlVga[] = {
    { "vgamem_mb", QEMU_CAPS_QXL_VGA_VGAMEM },
};

1649 1650 1651 1652
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioGpu[] = {
    { "virgl", QEMU_CAPS_DEVICE_VIRTIO_GPU_VIRGL },
};

1653
struct virQEMUCapsObjectTypeProps {
1654
    const char *type;
1655
    struct virQEMUCapsStringFlags *props;
1656 1657 1658
    size_t nprops;
};

1659 1660 1661 1662
static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {
    { "virtio-blk-pci", virQEMUCapsObjectPropsVirtioBlk,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioBlk) },
    { "virtio-net-pci", virQEMUCapsObjectPropsVirtioNet,
1663 1664 1665 1666
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioNet) },
    { "virtio-blk-ccw", virQEMUCapsObjectPropsVirtioBlk,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioBlk) },
    { "virtio-net-ccw", virQEMUCapsObjectPropsVirtioNet,
1667 1668 1669 1670 1671
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioNet) },
    { "virtio-blk-s390", virQEMUCapsObjectPropsVirtioBlk,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioBlk) },
    { "virtio-net-s390", virQEMUCapsObjectPropsVirtioNet,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioNet) },
1672 1673 1674 1675 1676 1677
    { "pci-assign", virQEMUCapsObjectPropsPCIAssign,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsPCIAssign) },
    { "kvm-pci-assign", virQEMUCapsObjectPropsPCIAssign,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsPCIAssign) },
    { "vfio-pci", virQEMUCapsObjectPropsVfioPCI,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVfioPCI) },
1678 1679
    { "scsi-disk", virQEMUCapsObjectPropsSCSIDisk,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsSCSIDisk) },
1680 1681 1682 1683
    { "ide-drive", virQEMUCapsObjectPropsIDEDrive,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsIDEDrive) },
    { "PIIX4_PM", virQEMUCapsObjectPropsPixx4PM,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsPixx4PM) },
1684 1685 1686 1687
    { "usb-redir", virQEMUCapsObjectPropsUSBRedir,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsUSBRedir) },
    { "usb-host", virQEMUCapsObjectPropsUSBHost,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsUSBHost) },
1688 1689
    { "scsi-generic", virQEMUCapsObjectPropsSCSIGeneric,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsSCSIGeneric) },
1690 1691 1692 1693
    { "i440FX-pcihost", virQEMUCapsObjectPropsI440FXPCIHost,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsI440FXPCIHost) },
    { "q35-pcihost", virQEMUCapsObjectPropsQ35PCIHost,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsQ35PCIHost) },
1694 1695
    { "usb-storage", virQEMUCapsObjectPropsUSBStorage,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsUSBStorage) },
1696 1697
    { "kvm-pit", virQEMUCapsObjectPropsKVMPit,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsKVMPit) },
1698 1699 1700 1701 1702 1703 1704 1705
    { "VGA", virQEMUCapsObjectPropsVGA,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVGA) },
    { "vmware-svga", virQEMUCapsObjectPropsVmwareSvga,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVmwareSvga) },
    { "qxl", virQEMUCapsObjectPropsQxl,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsQxl) },
    { "qxl-vga", virQEMUCapsObjectPropsQxlVga,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsQxlVga) },
1706 1707
    { "virtio-gpu-pci", virQEMUCapsObjectPropsVirtioGpu,
      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioGpu) },
1708 1709 1710 1711
};


static void
1712 1713 1714 1715 1716
virQEMUCapsProcessStringFlags(virQEMUCapsPtr qemuCaps,
                              size_t nflags,
                              struct virQEMUCapsStringFlags *flags,
                              size_t nvalues,
                              char *const*values)
1717 1718
{
    size_t i, j;
1719 1720
    for (i = 0; i < nflags; i++) {
        for (j = 0; j < nvalues; j++) {
1721
            if (STREQ(values[j], flags[i].value)) {
1722
                virQEMUCapsSet(qemuCaps, flags[i].flag);
1723 1724 1725 1726 1727 1728 1729 1730
                break;
            }
        }
    }
}


static void
1731 1732
virQEMUCapsFreeStringList(size_t len,
                          char **values)
1733 1734
{
    size_t i;
1735 1736
    if (!values)
        return;
1737
    for (i = 0; i < len; i++)
1738 1739 1740 1741 1742 1743 1744 1745
        VIR_FREE(values[i]);
    VIR_FREE(values);
}


#define OBJECT_TYPE_PREFIX "name \""

static int
1746 1747
virQEMUCapsParseDeviceStrObjectTypes(const char *str,
                                     char ***types)
1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765
{
    const char *tmp = str;
    int ret = -1;
    size_t ntypelist = 0;
    char **typelist = NULL;

    *types = NULL;

    while ((tmp = strstr(tmp, OBJECT_TYPE_PREFIX))) {
        char *end;
        tmp += strlen(OBJECT_TYPE_PREFIX);
        end = strstr(tmp, "\"");
        if (!end) {
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Malformed QEMU device list string, missing quote"));
            goto cleanup;
        }

1766
        if (VIR_EXPAND_N(typelist, ntypelist, 1) < 0)
1767
            goto cleanup;
1768
        if (VIR_STRNDUP(typelist[ntypelist - 1], tmp, end-tmp) < 0)
1769 1770 1771 1772 1773 1774
            goto cleanup;
    }

    *types = typelist;
    ret = ntypelist;

1775
 cleanup:
1776
    if (ret < 0)
1777
        virQEMUCapsFreeStringList(ntypelist, typelist);
1778 1779 1780 1781 1782
    return ret;
}


static int
1783 1784 1785
virQEMUCapsParseDeviceStrObjectProps(const char *str,
                                     const char *type,
                                     char ***props)
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
{
    const char *tmp = str;
    int ret = -1;
    size_t nproplist = 0;
    char **proplist = NULL;

    VIR_DEBUG("Extract type %s", type);
    *props = NULL;

    while ((tmp = strchr(tmp, '\n'))) {
        char *end;
        tmp += 1;

        if (*tmp == '\0')
            break;

        if (STRPREFIX(tmp, OBJECT_TYPE_PREFIX))
            continue;

        if (!STRPREFIX(tmp, type))
            continue;

        tmp += strlen(type);
        if (*tmp != '.')
            continue;
        tmp++;

        end = strstr(tmp, "=");
        if (!end) {
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Malformed QEMU device list string, missing '='"));
            goto cleanup;
        }
1819
        if (VIR_EXPAND_N(proplist, nproplist, 1) < 0)
1820
            goto cleanup;
1821
        if (VIR_STRNDUP(proplist[nproplist - 1], tmp, end-tmp) < 0)
1822 1823 1824 1825 1826 1827
            goto cleanup;
    }

    *props = proplist;
    ret = nproplist;

1828
 cleanup:
1829
    if (ret < 0)
1830
        virQEMUCapsFreeStringList(nproplist, proplist);
1831 1832 1833 1834 1835
    return ret;
}


int
1836
virQEMUCapsParseDeviceStr(virQEMUCapsPtr qemuCaps, const char *str)
1837 1838 1839 1840 1841
{
    int nvalues;
    char **values;
    size_t i;

1842
    if ((nvalues = virQEMUCapsParseDeviceStrObjectTypes(str, &values)) < 0)
1843
        return -1;
1844 1845 1846 1847 1848 1849
    virQEMUCapsProcessStringFlags(qemuCaps,
                                  ARRAY_CARDINALITY(virQEMUCapsObjectTypes),
                                  virQEMUCapsObjectTypes,
                                  nvalues, values);
    virQEMUCapsFreeStringList(nvalues, values);

1850
    for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsObjectProps); i++) {
1851 1852 1853 1854
        const char *type = virQEMUCapsObjectProps[i].type;
        if ((nvalues = virQEMUCapsParseDeviceStrObjectProps(str,
                                                            type,
                                                            &values)) < 0)
1855
            return -1;
1856 1857 1858 1859 1860
        virQEMUCapsProcessStringFlags(qemuCaps,
                                      virQEMUCapsObjectProps[i].nprops,
                                      virQEMUCapsObjectProps[i].props,
                                      nvalues, values);
        virQEMUCapsFreeStringList(nvalues, values);
1861 1862 1863
    }

    /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
1864 1865
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC))
        virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC);
1866 1867 1868 1869 1870

    return 0;
}


E
Eric Blake 已提交
1871
static int
1872 1873
virQEMUCapsExtractDeviceStr(const char *qemu,
                            virQEMUCapsPtr qemuCaps,
1874
                            uid_t runUid, gid_t runGid)
1875
{
E
Eric Blake 已提交
1876
    char *output = NULL;
1877
    virCommandPtr cmd;
E
Eric Blake 已提交
1878
    int ret = -1;
1879

E
Eric Blake 已提交
1880 1881
    /* Cram together all device-related queries into one invocation;
     * the output format makes it possible to distinguish what we
1882 1883
     * need.  With qemu 0.13.0 and later, unrecognized '-device
     * bogus,?' cause an error in isolation, but are silently ignored
1884
     * in combination with '-device ?'.  Upstream qemu 0.12.x doesn't
1885 1886
     * understand '-device name,?', and always exits with status 1 for
     * the simpler '-device ?', so this function is really only useful
1887
     * if -help includes "device driver,?".  */
1888
    cmd = virQEMUCapsProbeCommand(qemu, qemuCaps, runUid, runGid);
1889 1890 1891 1892 1893 1894
    virCommandAddArgList(cmd,
                         "-device", "?",
                         "-device", "pci-assign,?",
                         "-device", "virtio-blk-pci,?",
                         "-device", "virtio-net-pci,?",
                         "-device", "scsi-disk,?",
1895
                         "-device", "PIIX4_PM,?",
1896
                         "-device", "usb-redir,?",
1897
                         "-device", "ide-drive,?",
1898
                         "-device", "usb-host,?",
H
Han Cheng 已提交
1899
                         "-device", "scsi-generic,?",
1900
                         "-device", "usb-storage,?",
1901 1902 1903 1904
                         "-device", "VGA,?",
                         "-device", "vmware-svga,?",
                         "-device", "qxl,?",
                         "-device", "qxl-vga,?",
1905
                         NULL);
1906
    /* qemu -help goes to stdout, but qemu -device ? goes to stderr.  */
E
Eric Blake 已提交
1907
    virCommandSetErrorBuffer(cmd, &output);
1908

1909
    if (virCommandRun(cmd, NULL) < 0)
1910 1911
        goto cleanup;

1912
    ret = virQEMUCapsParseDeviceStr(qemuCaps, output);
1913

1914
 cleanup:
E
Eric Blake 已提交
1915
    VIR_FREE(output);
1916
    virCommandFree(cmd);
E
Eric Blake 已提交
1917 1918 1919
    return ret;
}

1920

1921 1922 1923
int virQEMUCapsGetDefaultVersion(virCapsPtr caps,
                                 virQEMUCapsCachePtr capsCache,
                                 unsigned int *version)
1924
{
1925
    virQEMUCapsPtr qemucaps;
T
Tal Kain 已提交
1926
    virArch hostarch;
1927
    virCapsDomainDataPtr capsdata;
1928 1929 1930 1931

    if (*version > 0)
        return 0;

T
Tal Kain 已提交
1932
    hostarch = virArchFromHost();
1933 1934 1935
    if (!(capsdata = virCapabilitiesDomainDataLookup(caps,
            VIR_DOMAIN_OSTYPE_HVM, hostarch, VIR_DOMAIN_VIRT_QEMU,
            NULL, NULL))) {
1936
        virReportError(VIR_ERR_INTERNAL_ERROR,
1937
                       _("Cannot find suitable emulator for %s"),
T
Tal Kain 已提交
1938
                       virArchToString(hostarch));
1939 1940 1941
        return -1;
    }

1942 1943 1944
    qemucaps = virQEMUCapsCacheLookup(capsCache, capsdata->emulator);
    VIR_FREE(capsdata);
    if (!qemucaps)
1945 1946
        return -1;

1947
    *version = virQEMUCapsGetVersion(qemucaps);
1948
    virObjectUnref(qemucaps);
1949 1950
    return 0;
}
1951 1952


1953 1954


1955 1956
virQEMUCapsPtr
virQEMUCapsNew(void)
1957
{
1958
    virQEMUCapsPtr qemuCaps;
1959

1960
    if (virQEMUCapsInitialize() < 0)
1961 1962
        return NULL;

1963
    if (!(qemuCaps = virObjectNew(virQEMUCapsClass)))
1964 1965
        return NULL;

1966
    if (!(qemuCaps->flags = virBitmapNew(QEMU_CAPS_LAST)))
1967
        goto error;
1968

1969
    return qemuCaps;
1970

1971
 error:
1972
    virObjectUnref(qemuCaps);
1973
    return NULL;
1974 1975 1976
}


1977
virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
1978
{
1979
    virQEMUCapsPtr ret = virQEMUCapsNew();
1980 1981 1982 1983 1984
    size_t i;

    if (!ret)
        return NULL;

1985
    virBitmapCopy(ret->flags, qemuCaps->flags);
1986

1987 1988 1989
    ret->usedQMP = qemuCaps->usedQMP;
    ret->version = qemuCaps->version;
    ret->kvmVersion = qemuCaps->kvmVersion;
1990 1991 1992 1993

    if (VIR_STRDUP(ret->package, qemuCaps->package) < 0)
        goto error;

1994
    ret->arch = qemuCaps->arch;
1995

1996
    if (VIR_ALLOC_N(ret->cpuDefinitions, qemuCaps->ncpuDefinitions) < 0)
1997
        goto error;
1998
    ret->ncpuDefinitions = qemuCaps->ncpuDefinitions;
1999
    for (i = 0; i < qemuCaps->ncpuDefinitions; i++) {
2000 2001
        if (VIR_STRDUP(ret->cpuDefinitions[i], qemuCaps->cpuDefinitions[i]) < 0)
            goto error;
2002 2003
    }

2004
    if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0)
2005
        goto error;
2006
    if (VIR_ALLOC_N(ret->machineAliases, qemuCaps->nmachineTypes) < 0)
2007
        goto error;
2008
    if (VIR_ALLOC_N(ret->machineMaxCpus, qemuCaps->nmachineTypes) < 0)
2009
        goto error;
2010
    ret->nmachineTypes = qemuCaps->nmachineTypes;
2011
    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
2012 2013 2014
        if (VIR_STRDUP(ret->machineTypes[i], qemuCaps->machineTypes[i]) < 0 ||
            VIR_STRDUP(ret->machineAliases[i], qemuCaps->machineAliases[i]) < 0)
            goto error;
2015
        ret->machineMaxCpus[i] = qemuCaps->machineMaxCpus[i];
2016 2017 2018 2019
    }

    return ret;

2020
 error:
2021 2022 2023 2024 2025
    virObjectUnref(ret);
    return NULL;
}


2026
void virQEMUCapsDispose(void *obj)
2027
{
2028
    virQEMUCapsPtr qemuCaps = obj;
2029 2030
    size_t i;

2031
    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
2032 2033
        VIR_FREE(qemuCaps->machineTypes[i]);
        VIR_FREE(qemuCaps->machineAliases[i]);
2034
    }
2035 2036
    VIR_FREE(qemuCaps->machineTypes);
    VIR_FREE(qemuCaps->machineAliases);
2037
    VIR_FREE(qemuCaps->machineMaxCpus);
2038

2039
    for (i = 0; i < qemuCaps->ncpuDefinitions; i++)
2040 2041
        VIR_FREE(qemuCaps->cpuDefinitions[i]);
    VIR_FREE(qemuCaps->cpuDefinitions);
2042

2043
    virBitmapFree(qemuCaps->flags);
2044

2045
    VIR_FREE(qemuCaps->package);
2046
    VIR_FREE(qemuCaps->binary);
2047 2048
}

2049
void
2050
virQEMUCapsSet(virQEMUCapsPtr qemuCaps,
2051
               virQEMUCapsFlags flag)
2052
{
2053
    ignore_value(virBitmapSetBit(qemuCaps->flags, flag));
2054 2055 2056 2057
}


void
2058
virQEMUCapsSetList(virQEMUCapsPtr qemuCaps, ...)
2059 2060 2061 2062
{
    va_list list;
    int flag;

2063
    va_start(list, qemuCaps);
2064
    while ((flag = va_arg(list, int)) < QEMU_CAPS_LAST)
2065
        ignore_value(virBitmapSetBit(qemuCaps->flags, flag));
2066
    va_end(list);
2067 2068 2069 2070
}


void
2071
virQEMUCapsClear(virQEMUCapsPtr qemuCaps,
2072
                 virQEMUCapsFlags flag)
2073
{
2074
    ignore_value(virBitmapClearBit(qemuCaps->flags, flag));
2075 2076 2077
}


2078
char *virQEMUCapsFlagsString(virQEMUCapsPtr qemuCaps)
2079
{
2080
    return virBitmapString(qemuCaps->flags);
2081 2082 2083 2084
}


bool
2085
virQEMUCapsGet(virQEMUCapsPtr qemuCaps,
2086
               virQEMUCapsFlags flag)
2087
{
J
Ján Tomko 已提交
2088
    return qemuCaps && virBitmapIsBitSet(qemuCaps->flags, flag);
2089
}
2090 2091


D
Daniel P. Berrange 已提交
2092 2093 2094 2095 2096 2097 2098 2099 2100
bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps,
                               virDomainDefPtr def)
{
    bool hasMultiBus = virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS);

    if (hasMultiBus)
        return true;

    if (def->os.arch == VIR_ARCH_PPC ||
2101
        ARCH_IS_PPC64(def->os.arch)) {
D
Daniel P. Berrange 已提交
2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137
        /*
         * Usage of pci.0 naming:
         *
         *    ref405ep: no pci
         *       taihu: no pci
         *      bamboo: 1.1.0
         *       mac99: 2.0.0
         *     g3beige: 2.0.0
         *        prep: 1.4.0
         *     pseries: 2.0.0
         *   mpc8544ds: forever
         * virtex-m507: no pci
         *     ppce500: 1.6.0
         */

        if (qemuCaps->version >= 2000000)
            return true;

        if (qemuCaps->version >= 1006000 &&
            STREQ(def->os.machine, "ppce500"))
            return true;

        if (qemuCaps->version >= 1004000 &&
            STREQ(def->os.machine, "prep"))
            return true;

        if (qemuCaps->version >= 1001000 &&
            STREQ(def->os.machine, "bamboo"))
            return true;

        if (STREQ(def->os.machine, "mpc8544ds"))
            return true;

        return false;
    }

2138 2139 2140 2141 2142 2143 2144 2145
    if (ARCH_IS_ARM(def->os.arch)) {
        /* If 'virt' supports PCI, it supports multibus.
         * No extra conditions here for simplicity.
         */
        if (STREQ(def->os.machine, "virt"))
            return true;
    }

D
Daniel P. Berrange 已提交
2146 2147 2148 2149
    return false;
}


2150
const char *virQEMUCapsGetBinary(virQEMUCapsPtr qemuCaps)
2151
{
2152
    return qemuCaps->binary;
2153 2154
}

2155
virArch virQEMUCapsGetArch(virQEMUCapsPtr qemuCaps)
2156
{
2157
    return qemuCaps->arch;
2158 2159 2160
}


2161
unsigned int virQEMUCapsGetVersion(virQEMUCapsPtr qemuCaps)
2162
{
2163
    return qemuCaps->version;
2164 2165 2166
}


2167
unsigned int virQEMUCapsGetKVMVersion(virQEMUCapsPtr qemuCaps)
2168
{
2169
    return qemuCaps->kvmVersion;
2170 2171 2172
}


2173 2174 2175 2176 2177 2178
const char *virQEMUCapsGetPackage(virQEMUCapsPtr qemuCaps)
{
    return qemuCaps->package;
}


2179 2180
int virQEMUCapsAddCPUDefinition(virQEMUCapsPtr qemuCaps,
                                const char *name)
2181
{
2182 2183 2184
    char *tmp;

    if (VIR_STRDUP(tmp, name) < 0)
2185
        return -1;
2186
    if (VIR_EXPAND_N(qemuCaps->cpuDefinitions, qemuCaps->ncpuDefinitions, 1) < 0) {
2187 2188 2189
        VIR_FREE(tmp);
        return -1;
    }
2190
    qemuCaps->cpuDefinitions[qemuCaps->ncpuDefinitions-1] = tmp;
2191 2192 2193 2194
    return 0;
}


2195 2196
size_t virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
                                    char ***names)
2197
{
2198
    if (names)
2199 2200
        *names = qemuCaps->cpuDefinitions;
    return qemuCaps->ncpuDefinitions;
2201 2202 2203
}


2204 2205
size_t virQEMUCapsGetMachineTypes(virQEMUCapsPtr qemuCaps,
                                  char ***names)
2206
{
2207
    if (names)
2208 2209
        *names = qemuCaps->machineTypes;
    return qemuCaps->nmachineTypes;
2210 2211
}

2212 2213 2214
int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
                                   size_t *nmachines,
                                   virCapsGuestMachinePtr **machines)
2215 2216 2217 2218
{
    size_t i;

    *machines = NULL;
2219
    *nmachines = qemuCaps->nmachineTypes;
2220

2221 2222 2223 2224
    if (*nmachines &&
        VIR_ALLOC_N(*machines, qemuCaps->nmachineTypes) < 0)
        goto error;

2225
    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
2226 2227
        virCapsGuestMachinePtr mach;
        if (VIR_ALLOC(mach) < 0)
2228
            goto error;
2229
        (*machines)[i] = mach;
2230
        if (qemuCaps->machineAliases[i]) {
2231 2232 2233
            if (VIR_STRDUP(mach->name, qemuCaps->machineAliases[i]) < 0 ||
                VIR_STRDUP(mach->canonical, qemuCaps->machineTypes[i]) < 0)
                goto error;
2234
        } else {
2235 2236
            if (VIR_STRDUP(mach->name, qemuCaps->machineTypes[i]) < 0)
                goto error;
2237
        }
2238
        mach->maxCpus = qemuCaps->machineMaxCpus[i];
2239 2240
    }

2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278
    /* Make sure all canonical machine types also have their own entry so that
     * /capabilities/guest/arch[@name='...']/machine/text() XPath selects all
     * supported machine types.
     */
    i = 0;
    while (i < *nmachines) {
        size_t j;
        bool found = false;
        virCapsGuestMachinePtr machine = (*machines)[i];

        if (!machine->canonical) {
            i++;
            continue;
        }

        for (j = 0; j < *nmachines; j++) {
            if (STREQ(machine->canonical, (*machines)[j]->name)) {
                found = true;
                break;
            }
        }

        if (!found) {
            virCapsGuestMachinePtr mach;
            if (VIR_ALLOC(mach) < 0)
                goto error;
            if (VIR_INSERT_ELEMENT_COPY(*machines, i, *nmachines, mach) < 0) {
                VIR_FREE(mach);
                goto error;
            }
            if (VIR_STRDUP(mach->name, machine->canonical) < 0)
                goto error;
            mach->maxCpus = machine->maxCpus;
            i++;
        }
        i++;
    }

2279 2280
    return 0;

2281
 error:
2282 2283 2284 2285 2286 2287 2288 2289
    virCapabilitiesFreeMachines(*machines, *nmachines);
    *nmachines = 0;
    *machines = NULL;
    return -1;
}



2290

2291 2292
const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
                                           const char *name)
2293 2294 2295
{
    size_t i;

2296 2297 2298
    if (!name)
        return NULL;

2299
    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
2300
        if (!qemuCaps->machineAliases[i])
2301
            continue;
2302 2303
        if (STREQ(qemuCaps->machineAliases[i], name))
            return qemuCaps->machineTypes[i];
2304 2305 2306 2307
    }

    return name;
}
2308 2309


2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328
int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
                                 const char *name)
{
    size_t i;

    if (!name)
        return 0;

    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
        if (!qemuCaps->machineMaxCpus[i])
            continue;
        if (STREQ(qemuCaps->machineTypes[i], name))
            return qemuCaps->machineMaxCpus[i];
    }

    return 0;
}


2329
static int
2330 2331
virQEMUCapsProbeQMPCommands(virQEMUCapsPtr qemuCaps,
                            qemuMonitorPtr mon)
2332 2333 2334 2335 2336 2337 2338
{
    char **commands = NULL;
    int ncommands;

    if ((ncommands = qemuMonitorGetCommands(mon, &commands)) < 0)
        return -1;

2339 2340 2341 2342 2343
    virQEMUCapsProcessStringFlags(qemuCaps,
                                  ARRAY_CARDINALITY(virQEMUCapsCommands),
                                  virQEMUCapsCommands,
                                  ncommands, commands);
    virQEMUCapsFreeStringList(ncommands, commands);
2344

2345 2346 2347 2348
    /* QMP add-fd was introduced in 1.2, but did not support
     * management control of set numbering, and did not have a
     * counterpart -add-fd command line option.  We require the
     * add-fd features from 1.3 or later.  */
2349
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ADD_FD)) {
2350 2351 2352 2353 2354 2355 2356
        int fd = open("/dev/null", O_RDONLY);
        if (fd < 0) {
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("unable to probe for add-fd"));
            return -1;
        }
        if (qemuMonitorAddFd(mon, 0, fd, "/dev/null") < 0)
2357
            virQEMUCapsClear(qemuCaps, QEMU_CAPS_ADD_FD);
2358 2359 2360
        VIR_FORCE_CLOSE(fd);
    }

2361 2362 2363 2364 2365 2366
    /* Probe for active commit of qemu 2.1 (for now, we are choosing
     * to ignore the fact that qemu 2.0 can also do active commit) */
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCK_COMMIT) &&
        qemuMonitorSupportsActiveCommit(mon))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_ACTIVE_COMMIT);

2367 2368 2369 2370 2371
    return 0;
}


static int
2372 2373
virQEMUCapsProbeQMPEvents(virQEMUCapsPtr qemuCaps,
                          qemuMonitorPtr mon)
2374 2375 2376 2377 2378 2379 2380
{
    char **events = NULL;
    int nevents;

    if ((nevents = qemuMonitorGetEvents(mon, &events)) < 0)
        return -1;

2381 2382 2383 2384 2385
    virQEMUCapsProcessStringFlags(qemuCaps,
                                  ARRAY_CARDINALITY(virQEMUCapsEvents),
                                  virQEMUCapsEvents,
                                  nevents, events);
    virQEMUCapsFreeStringList(nevents, events);
2386 2387 2388 2389 2390

    return 0;
}


2391
static int
2392 2393
virQEMUCapsProbeQMPObjects(virQEMUCapsPtr qemuCaps,
                           qemuMonitorPtr mon)
2394 2395 2396 2397 2398 2399 2400
{
    int nvalues;
    char **values;
    size_t i;

    if ((nvalues = qemuMonitorGetObjectTypes(mon, &values)) < 0)
        return -1;
2401 2402 2403 2404 2405 2406
    virQEMUCapsProcessStringFlags(qemuCaps,
                                  ARRAY_CARDINALITY(virQEMUCapsObjectTypes),
                                  virQEMUCapsObjectTypes,
                                  nvalues, values);
    virQEMUCapsFreeStringList(nvalues, values);

2407
    for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsObjectProps); i++) {
2408
        const char *type = virQEMUCapsObjectProps[i].type;
2409 2410 2411 2412
        if ((nvalues = qemuMonitorGetObjectProps(mon,
                                                 type,
                                                 &values)) < 0)
            return -1;
2413 2414 2415 2416 2417
        virQEMUCapsProcessStringFlags(qemuCaps,
                                      virQEMUCapsObjectProps[i].nprops,
                                      virQEMUCapsObjectProps[i].props,
                                      nvalues, values);
        virQEMUCapsFreeStringList(nvalues, values);
2418 2419 2420
    }

    /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
2421 2422
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC))
        virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC);
2423
    /* If qemu supports newer -device qxl it supports -vga qxl as well */
2424 2425
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL))
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VGA_QXL);
2426 2427 2428 2429 2430 2431

    return 0;
}


static int
2432 2433
virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
                                qemuMonitorPtr mon)
2434 2435 2436 2437 2438
{
    qemuMonitorMachineInfoPtr *machines = NULL;
    int nmachines = 0;
    int ret = -1;
    size_t i;
2439
    size_t defIdx = 0;
2440 2441

    if ((nmachines = qemuMonitorGetMachines(mon, &machines)) < 0)
2442
        return -1;
2443

2444
    if (VIR_ALLOC_N(qemuCaps->machineTypes, nmachines) < 0)
2445
        goto cleanup;
2446
    if (VIR_ALLOC_N(qemuCaps->machineAliases, nmachines) < 0)
2447
        goto cleanup;
2448
    if (VIR_ALLOC_N(qemuCaps->machineMaxCpus, nmachines) < 0)
2449
        goto cleanup;
2450

2451
    for (i = 0; i < nmachines; i++) {
2452 2453
        if (STREQ(machines[i]->name, "none"))
            continue;
2454 2455 2456 2457 2458
        qemuCaps->nmachineTypes++;
        if (VIR_STRDUP(qemuCaps->machineAliases[qemuCaps->nmachineTypes -1],
                       machines[i]->alias) < 0 ||
            VIR_STRDUP(qemuCaps->machineTypes[qemuCaps->nmachineTypes - 1],
                       machines[i]->name) < 0)
2459
            goto cleanup;
2460
        if (machines[i]->isDefault)
2461
            defIdx = qemuCaps->nmachineTypes - 1;
2462 2463
        qemuCaps->machineMaxCpus[qemuCaps->nmachineTypes - 1] =
            machines[i]->maxCpus;
2464
    }
2465 2466

    if (defIdx)
2467
        virQEMUCapsSetDefaultMachine(qemuCaps, defIdx);
2468 2469 2470

    ret = 0;

2471
 cleanup:
2472
    for (i = 0; i < nmachines; i++)
2473 2474 2475 2476 2477 2478 2479
        qemuMonitorMachineInfoFree(machines[i]);
    VIR_FREE(machines);
    return ret;
}


static int
2480 2481
virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
                                  qemuMonitorPtr mon)
2482 2483 2484 2485 2486 2487 2488
{
    int ncpuDefinitions;
    char **cpuDefinitions;

    if ((ncpuDefinitions = qemuMonitorGetCPUDefinitions(mon, &cpuDefinitions)) < 0)
        return -1;

2489 2490
    qemuCaps->ncpuDefinitions = ncpuDefinitions;
    qemuCaps->cpuDefinitions = cpuDefinitions;
2491 2492 2493 2494

    return 0;
}

2495 2496
struct tpmTypeToCaps {
    int type;
2497
    virQEMUCapsFlags caps;
2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517
};

static const struct tpmTypeToCaps virQEMUCapsTPMTypesToCaps[] = {
    {
        .type = VIR_DOMAIN_TPM_TYPE_PASSTHROUGH,
        .caps = QEMU_CAPS_DEVICE_TPM_PASSTHROUGH,
    },
};

const struct tpmTypeToCaps virQEMUCapsTPMModelsToCaps[] = {
    {
        .type = VIR_DOMAIN_TPM_MODEL_TIS,
        .caps = QEMU_CAPS_DEVICE_TPM_TIS,
    },
};

static int
virQEMUCapsProbeQMPTPM(virQEMUCapsPtr qemuCaps,
                       qemuMonitorPtr mon)
{
2518 2519
    int nentries;
    size_t i;
2520
    char **entries = NULL;
S
Stefan Berger 已提交
2521

2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551
    if ((nentries = qemuMonitorGetTPMModels(mon, &entries)) < 0)
        return -1;

    if (nentries > 0) {
        for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsTPMModelsToCaps); i++) {
            const char *needle = virDomainTPMModelTypeToString(
                virQEMUCapsTPMModelsToCaps[i].type);
            if (virStringArrayHasString(entries, needle))
                virQEMUCapsSet(qemuCaps,
                               virQEMUCapsTPMModelsToCaps[i].caps);
        }
    }
    virStringFreeList(entries);

    if ((nentries = qemuMonitorGetTPMTypes(mon, &entries)) < 0)
        return -1;

    if (nentries > 0) {
        for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsTPMTypesToCaps); i++) {
            const char *needle = virDomainTPMBackendTypeToString(
                virQEMUCapsTPMTypesToCaps[i].type);
            if (virStringArrayHasString(entries, needle))
                virQEMUCapsSet(qemuCaps, virQEMUCapsTPMTypesToCaps[i].caps);
        }
    }
    virStringFreeList(entries);

    return 0;
}

2552

2553
static int
2554 2555
virQEMUCapsProbeQMPKVMState(virQEMUCapsPtr qemuCaps,
                            qemuMonitorPtr mon)
2556 2557 2558 2559
{
    bool enabled = false;
    bool present = false;

2560
    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
2561 2562 2563 2564 2565 2566
        return 0;

    if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0)
        return -1;

    /* The QEMU_CAPS_KVM flag was initially set according to the QEMU
2567
     * reporting the recognition of 'query-kvm' QMP command. That merely
N
Nehal J Wani 已提交
2568
     * indicates existence of the command though, not whether KVM support
2569 2570 2571 2572 2573 2574
     * is actually available, nor whether it is enabled by default.
     *
     * If it is not present we need to clear the flag, and if it is
     * not enabled by default we need to change the flag.
     */
    if (!present) {
2575
        virQEMUCapsClear(qemuCaps, QEMU_CAPS_KVM);
2576
    } else if (!enabled) {
2577 2578
        virQEMUCapsClear(qemuCaps, QEMU_CAPS_KVM);
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_ENABLE_KVM);
2579 2580 2581 2582 2583
    }

    return 0;
}

2584 2585 2586 2587 2588 2589 2590 2591
struct virQEMUCapsCommandLineProps {
    const char *option;
    const char *param;
    int flag;
};

static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = {
    { "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
2592
    { "machine", "vmport", QEMU_CAPS_MACHINE_VMPORT_OPT },
O
Osier Yang 已提交
2593
    { "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
2594
    { "realtime", "mlock", QEMU_CAPS_MLOCK },
2595
    { "boot-opts", "strict", QEMU_CAPS_BOOT_STRICT },
2596
    { "boot-opts", "reboot-timeout", QEMU_CAPS_REBOOT_TIMEOUT },
2597
    { "boot-opts", "splash-time", QEMU_CAPS_SPLASH_TIMEOUT },
2598
    { "spice", "disable-agent-file-xfer", QEMU_CAPS_SPICE_FILE_XFER_DISABLE },
2599
    { "msg", "timestamp", QEMU_CAPS_MSG_TIMESTAMP },
2600
    { "numa", NULL, QEMU_CAPS_NUMA },
2601
    { "drive", "throttling.bps-total-max", QEMU_CAPS_DRIVE_IOTUNE_MAX},
2602 2603
    { "machine", "aes-key-wrap", QEMU_CAPS_AES_KEY_WRAP },
    { "machine", "dea-key-wrap", QEMU_CAPS_DEA_KEY_WRAP },
2604
    { "chardev", "append", QEMU_CAPS_CHARDEV_FILE_APPEND },
2605 2606 2607 2608 2609 2610
};

static int
virQEMUCapsProbeQMPCommandLine(virQEMUCapsPtr qemuCaps,
                               qemuMonitorPtr mon)
{
2611
    bool found = false;
2612 2613 2614 2615 2616 2617 2618
    int nvalues;
    char **values;
    size_t i, j;

    for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsCommandLine); i++) {
        if ((nvalues = qemuMonitorGetCommandLineOptionParameters(mon,
                                                                 virQEMUCapsCommandLine[i].option,
2619 2620
                                                                 &values,
                                                                 &found)) < 0)
2621
            return -1;
2622 2623 2624 2625

        if (found && !virQEMUCapsCommandLine[i].param)
            virQEMUCapsSet(qemuCaps, virQEMUCapsCommandLine[i].flag);

2626
        for (j = 0; j < nvalues; j++) {
2627
            if (STREQ_NULLABLE(virQEMUCapsCommandLine[i].param, values[j])) {
2628 2629 2630 2631 2632 2633 2634 2635 2636
                virQEMUCapsSet(qemuCaps, virQEMUCapsCommandLine[i].flag);
                break;
            }
        }
        virStringFreeList(values);
    }

    return 0;
}
2637

2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656
static int
virQEMUCapsProbeQMPMigrationCapabilities(virQEMUCapsPtr qemuCaps,
                                         qemuMonitorPtr mon)
{
    char **caps = NULL;
    int ncaps;

    if ((ncaps = qemuMonitorGetMigrationCapabilities(mon, &caps)) < 0)
        return -1;

    virQEMUCapsProcessStringFlags(qemuCaps,
                                  ARRAY_CARDINALITY(virQEMUCapsMigration),
                                  virQEMUCapsMigration,
                                  ncaps, caps);
    virQEMUCapsFreeStringList(ncaps, caps);

    return 0;
}

2657 2658
int virQEMUCapsProbeQMP(virQEMUCapsPtr qemuCaps,
                        qemuMonitorPtr mon)
2659
{
2660
    VIR_DEBUG("qemuCaps=%p mon=%p", qemuCaps, mon);
2661

2662
    if (qemuCaps->usedQMP)
2663 2664
        return 0;

2665
    if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
2666 2667
        return -1;

2668
    if (virQEMUCapsProbeQMPEvents(qemuCaps, mon) < 0)
2669 2670 2671 2672 2673 2674
        return -1;

    return 0;
}


2675 2676 2677 2678 2679 2680
/*
 * Parsing a doc that looks like
 *
 * <qemuCaps>
 *   <qemuctime>234235253</qemuctime>
 *   <selfctime>234235253</selfctime>
2681
 *   <selfvers>1002016</selfvers>
2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693
 *   <usedQMP/>
 *   <flag name='foo'/>
 *   <flag name='bar'/>
 *   ...
 *   <cpu name="pentium3"/>
 *   ...
 *   <machine name="pc-1.0" alias="pc" maxCpus="4"/>
 *   ...
 * </qemuCaps>
 */
static int
virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
2694 2695
                     time_t *qemuctime, time_t *selfctime,
                     unsigned long *selfvers)
2696 2697 2698 2699 2700 2701 2702
{
    xmlDocPtr doc = NULL;
    int ret = -1;
    size_t i;
    int n;
    xmlNodePtr *nodes = NULL;
    xmlXPathContextPtr ctxt = NULL;
J
Ján Tomko 已提交
2703
    char *str = NULL;
2704
    long long int l;
2705
    unsigned long lu;
2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738

    if (!(doc = virXMLParseFile(filename)))
        goto cleanup;

    if (!(ctxt = xmlXPathNewContext(doc))) {
        virReportOOMError();
        goto cleanup;
    }

    ctxt->node = xmlDocGetRootElement(doc);

    if (STRNEQ((const char *)ctxt->node->name, "qemuCaps")) {
        virReportError(VIR_ERR_XML_ERROR,
                       _("unexpected root element <%s>, "
                         "expecting <qemuCaps>"),
                       ctxt->node->name);
        goto cleanup;
    }

    if (virXPathLongLong("string(./qemuctime)", ctxt, &l) < 0) {
        virReportError(VIR_ERR_XML_ERROR, "%s",
                       _("missing qemuctime in QEMU capabilities XML"));
        goto cleanup;
    }
    *qemuctime = (time_t)l;

    if (virXPathLongLong("string(./selfctime)", ctxt, &l) < 0) {
        virReportError(VIR_ERR_XML_ERROR, "%s",
                       _("missing selfctime in QEMU capabilities XML"));
        goto cleanup;
    }
    *selfctime = (time_t)l;

2739 2740 2741 2742
    *selfvers = 0;
    if (virXPathULong("string(./selfvers)", ctxt, &lu) == 0)
        *selfvers = lu;

2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783
    qemuCaps->usedQMP = virXPathBoolean("count(./usedQMP) > 0",
                                        ctxt) > 0;

    if ((n = virXPathNodeSet("./flag", ctxt, &nodes)) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("failed to parse qemu capabilities flags"));
        goto cleanup;
    }
    VIR_DEBUG("Got flags %d", n);
    if (n > 0) {
        for (i = 0; i < n; i++) {
            int flag;
            if (!(str = virXMLPropString(nodes[i], "name"))) {
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("missing flag name in QEMU capabilities cache"));
                goto cleanup;
            }
            flag = virQEMUCapsTypeFromString(str);
            if (flag < 0) {
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("Unknown qemu capabilities flag %s"), str);
                goto cleanup;
            }
            VIR_FREE(str);
            virQEMUCapsSet(qemuCaps, flag);
        }
    }
    VIR_FREE(nodes);

    if (virXPathUInt("string(./version)", ctxt, &qemuCaps->version) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("missing version in QEMU capabilities cache"));
        goto cleanup;
    }

    if (virXPathUInt("string(./kvmVersion)", ctxt, &qemuCaps->kvmVersion) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("missing version in QEMU capabilities cache"));
        goto cleanup;
    }

2784 2785 2786
    /* Don't check for NULL, since it is optional and thus may be missing */
    qemuCaps->package = virXPathString("string(./package)", ctxt);

2787 2788 2789 2790 2791 2792 2793 2794 2795 2796
    if (!(str = virXPathString("string(./arch)", ctxt))) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("missing arch in QEMU capabilities cache"));
        goto cleanup;
    }
    if (!(qemuCaps->arch = virArchFromString(str))) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unknown arch %s in QEMU capabilities cache"), str);
        goto cleanup;
    }
J
Ján Tomko 已提交
2797
    VIR_FREE(str);
2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810

    if ((n = virXPathNodeSet("./cpu", ctxt, &nodes)) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("failed to parse qemu capabilities cpus"));
        goto cleanup;
    }
    if (n > 0) {
        qemuCaps->ncpuDefinitions = n;
        if (VIR_ALLOC_N(qemuCaps->cpuDefinitions,
                        qemuCaps->ncpuDefinitions) < 0)
            goto cleanup;

        for (i = 0; i < n; i++) {
J
Ján Tomko 已提交
2811
            if (!(qemuCaps->cpuDefinitions[i] = virXMLPropString(nodes[i], "name"))) {
2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("missing cpu name in QEMU capabilities cache"));
                goto cleanup;
            }
        }
    }
    VIR_FREE(nodes);


    if ((n = virXPathNodeSet("./machine", ctxt, &nodes)) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("failed to parse qemu capabilities machines"));
        goto cleanup;
    }
    if (n > 0) {
        qemuCaps->nmachineTypes = n;
        if (VIR_ALLOC_N(qemuCaps->machineTypes,
                        qemuCaps->nmachineTypes) < 0 ||
            VIR_ALLOC_N(qemuCaps->machineAliases,
                        qemuCaps->nmachineTypes) < 0 ||
            VIR_ALLOC_N(qemuCaps->machineMaxCpus,
                        qemuCaps->nmachineTypes) < 0)
            goto cleanup;

        for (i = 0; i < n; i++) {
J
Ján Tomko 已提交
2837
            if (!(qemuCaps->machineTypes[i] = virXMLPropString(nodes[i], "name"))) {
2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("missing machine name in QEMU capabilities cache"));
                goto cleanup;
            }
            qemuCaps->machineAliases[i] = virXMLPropString(nodes[i], "alias");

            str = virXMLPropString(nodes[i], "maxCpus");
            if (str &&
                virStrToLong_ui(str, NULL, 10, &(qemuCaps->machineMaxCpus[i])) < 0) {
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("malformed machine cpu count in QEMU capabilities cache"));
                goto cleanup;
            }
J
Ján Tomko 已提交
2851
            VIR_FREE(str);
2852 2853 2854 2855 2856
        }
    }
    VIR_FREE(nodes);

    ret = 0;
2857
 cleanup:
J
Ján Tomko 已提交
2858
    VIR_FREE(str);
2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869
    VIR_FREE(nodes);
    xmlXPathFreeContext(ctxt);
    xmlFreeDoc(doc);
    return ret;
}


static int
virQEMUCapsSaveCache(virQEMUCapsPtr qemuCaps, const char *filename)
{
    virBuffer buf = VIR_BUFFER_INITIALIZER;
M
Michal Privoznik 已提交
2870
    char *xml = NULL;
2871 2872 2873 2874
    int ret = -1;
    size_t i;

    virBufferAddLit(&buf, "<qemuCaps>\n");
2875
    virBufferAdjustIndent(&buf, 2);
2876

2877
    virBufferAsprintf(&buf, "<qemuctime>%llu</qemuctime>\n",
2878
                      (long long)qemuCaps->ctime);
2879
    virBufferAsprintf(&buf, "<selfctime>%llu</selfctime>\n",
2880
                      (long long)virGetSelfLastChanged());
2881 2882
    virBufferAsprintf(&buf, "<selfvers>%lu</selfvers>\n",
                      (unsigned long)LIBVIR_VERSION_NUMBER);
2883 2884

    if (qemuCaps->usedQMP)
2885
        virBufferAddLit(&buf, "<usedQMP/>\n");
2886 2887 2888

    for (i = 0; i < QEMU_CAPS_LAST; i++) {
        if (virQEMUCapsGet(qemuCaps, i)) {
2889
            virBufferAsprintf(&buf, "<flag name='%s'/>\n",
2890 2891 2892 2893
                              virQEMUCapsTypeToString(i));
        }
    }

2894
    virBufferAsprintf(&buf, "<version>%d</version>\n",
2895 2896
                      qemuCaps->version);

2897
    virBufferAsprintf(&buf, "<kvmVersion>%d</kvmVersion>\n",
2898 2899
                      qemuCaps->kvmVersion);

2900 2901 2902 2903
    if (qemuCaps->package)
        virBufferAsprintf(&buf, "<package>%s</package>\n",
                          qemuCaps->package);

2904
    virBufferAsprintf(&buf, "<arch>%s</arch>\n",
2905 2906 2907
                      virArchToString(qemuCaps->arch));

    for (i = 0; i < qemuCaps->ncpuDefinitions; i++) {
2908
        virBufferEscapeString(&buf, "<cpu name='%s'/>\n",
2909 2910 2911 2912
                              qemuCaps->cpuDefinitions[i]);
    }

    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
2913
        virBufferEscapeString(&buf, "<machine name='%s'",
2914 2915 2916 2917 2918 2919 2920 2921
                              qemuCaps->machineTypes[i]);
        if (qemuCaps->machineAliases[i])
            virBufferEscapeString(&buf, " alias='%s'",
                              qemuCaps->machineAliases[i]);
        virBufferAsprintf(&buf, " maxCpus='%u'/>\n",
                          qemuCaps->machineMaxCpus[i]);
    }

2922
    virBufferAdjustIndent(&buf, -2);
2923 2924
    virBufferAddLit(&buf, "</qemuCaps>\n");

2925
    if (virBufferCheckError(&buf) < 0)
2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992
        goto cleanup;

    xml = virBufferContentAndReset(&buf);

    if (virFileWriteStr(filename, xml, 0600) < 0) {
        virReportSystemError(errno,
                             _("Failed to save '%s' for '%s'"),
                             filename, qemuCaps->binary);
        goto cleanup;
    }

    VIR_DEBUG("Saved caps '%s' for '%s' with (%lld, %lld)",
              filename, qemuCaps->binary,
              (long long)qemuCaps->ctime,
              (long long)virGetSelfLastChanged());

    ret = 0;
 cleanup:
    VIR_FREE(xml);
    return ret;
}

static int
virQEMUCapsRememberCached(virQEMUCapsPtr qemuCaps, const char *cacheDir)
{
    char *capsdir = NULL;
    char *capsfile = NULL;
    int ret = -1;
    char *binaryhash = NULL;

    if (virAsprintf(&capsdir, "%s/capabilities", cacheDir) < 0)
        goto cleanup;

    if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256,
                            qemuCaps->binary,
                            &binaryhash) < 0)
        goto cleanup;

    if (virAsprintf(&capsfile, "%s/%s.xml", capsdir, binaryhash) < 0)
        goto cleanup;

    if (virFileMakePath(capsdir) < 0) {
        virReportSystemError(errno,
                             _("Unable to create directory '%s'"),
                             capsdir);
        goto cleanup;
    }

    if (virQEMUCapsSaveCache(qemuCaps, capsfile) < 0)
        goto cleanup;

    ret = 0;
 cleanup:
    VIR_FREE(binaryhash);
    VIR_FREE(capsfile);
    VIR_FREE(capsdir);
    return ret;
}


static void
virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
{
    size_t i;

    virBitmapClearAll(qemuCaps->flags);
    qemuCaps->version = qemuCaps->kvmVersion = 0;
2993
    VIR_FREE(qemuCaps->package);
2994 2995 2996
    qemuCaps->arch = VIR_ARCH_NONE;
    qemuCaps->usedQMP = false;

2997
    for (i = 0; i < qemuCaps->ncpuDefinitions; i++)
2998 2999 3000 3001 3002 3003 3004 3005 3006 3007
        VIR_FREE(qemuCaps->cpuDefinitions[i]);
    VIR_FREE(qemuCaps->cpuDefinitions);
    qemuCaps->ncpuDefinitions = 0;

    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
        VIR_FREE(qemuCaps->machineTypes[i]);
        VIR_FREE(qemuCaps->machineAliases[i]);
    }
    VIR_FREE(qemuCaps->machineTypes);
    VIR_FREE(qemuCaps->machineAliases);
J
Ján Tomko 已提交
3008
    VIR_FREE(qemuCaps->machineMaxCpus);
3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022
    qemuCaps->nmachineTypes = 0;
}


static int
virQEMUCapsInitCached(virQEMUCapsPtr qemuCaps, const char *cacheDir)
{
    char *capsdir = NULL;
    char *capsfile = NULL;
    int ret = -1;
    char *binaryhash = NULL;
    struct stat sb;
    time_t qemuctime;
    time_t selfctime;
3023
    unsigned long selfvers;
3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055

    if (virAsprintf(&capsdir, "%s/capabilities", cacheDir) < 0)
        goto cleanup;

    if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256,
                            qemuCaps->binary,
                            &binaryhash) < 0)
        goto cleanup;

    if (virAsprintf(&capsfile, "%s/%s.xml", capsdir, binaryhash) < 0)
        goto cleanup;

    if (virFileMakePath(capsdir) < 0) {
        virReportSystemError(errno,
                             _("Unable to create directory '%s'"),
                             capsdir);
        goto cleanup;
    }

    if (stat(capsfile, &sb) < 0) {
        if (errno == ENOENT) {
            VIR_DEBUG("No cached capabilities '%s' for '%s'",
                      capsfile, qemuCaps->binary);
            ret = 0;
            goto cleanup;
        }
        virReportSystemError(errno,
                             _("Unable to access cache '%s' for '%s'"),
                             capsfile, qemuCaps->binary);
        goto cleanup;
    }

3056 3057
    if (virQEMUCapsLoadCache(qemuCaps, capsfile, &qemuctime, &selfctime,
                             &selfvers) < 0) {
3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
        virErrorPtr err = virGetLastError();
        VIR_WARN("Failed to load cached caps from '%s' for '%s': %s",
                 capsfile, qemuCaps->binary, err ? NULLSTR(err->message) :
                 _("unknown error"));
        virResetLastError();
        ret = 0;
        virQEMUCapsReset(qemuCaps);
        goto cleanup;
    }

3068
    /* Discard cache if QEMU binary or libvirtd changed */
3069
    if (qemuctime != qemuCaps->ctime ||
3070 3071
        selfctime != virGetSelfLastChanged() ||
        selfvers != LIBVIR_VERSION_NUMBER) {
3072
        VIR_DEBUG("Outdated cached capabilities '%s' for '%s' "
3073
                  "(%lld vs %lld, %lld vs %lld, %lu vs %lu)",
3074 3075
                  capsfile, qemuCaps->binary,
                  (long long)qemuctime, (long long)qemuCaps->ctime,
3076 3077
                  (long long)selfctime, (long long)virGetSelfLastChanged(),
                  selfvers, (unsigned long)LIBVIR_VERSION_NUMBER);
3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096
        ignore_value(unlink(capsfile));
        virQEMUCapsReset(qemuCaps);
        ret = 0;
        goto cleanup;
    }

    VIR_DEBUG("Loaded '%s' for '%s' ctime %lld usedQMP=%d",
              capsfile, qemuCaps->binary,
              (long long)qemuCaps->ctime, qemuCaps->usedQMP);

    ret = 1;
 cleanup:
    VIR_FREE(binaryhash);
    VIR_FREE(capsfile);
    VIR_FREE(capsdir);
    return ret;
}


3097 3098
#define QEMU_SYSTEM_PREFIX "qemu-system-"

3099
static int
3100
virQEMUCapsInitHelp(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid, const char *qmperr)
3101
{
3102
    virCommandPtr cmd = NULL;
3103
    bool is_kvm;
3104
    char *help = NULL;
3105 3106
    int ret = -1;
    const char *tmp;
3107

3108
    VIR_DEBUG("qemuCaps=%p", qemuCaps);
3109

3110
    tmp = strstr(qemuCaps->binary, QEMU_SYSTEM_PREFIX);
3111 3112
    if (tmp) {
        tmp += strlen(QEMU_SYSTEM_PREFIX);
3113

3114
        qemuCaps->arch = virQEMUCapsArchFromString(tmp);
3115
    } else {
3116
        qemuCaps->arch = virArchFromHost();
3117 3118
    }

3119
    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, NULL, runUid, runGid);
3120 3121 3122 3123
    virCommandAddArgList(cmd, "-help", NULL);
    virCommandSetOutputBuffer(cmd, &help);

    if (virCommandRun(cmd, NULL) < 0)
3124
        goto cleanup;
3125

3126 3127 3128 3129 3130
    if (virQEMUCapsParseHelpStr(qemuCaps->binary,
                                help, qemuCaps,
                                &qemuCaps->version,
                                &is_kvm,
                                &qemuCaps->kvmVersion,
3131 3132
                                false,
                                qmperr) < 0)
3133
        goto cleanup;
3134

D
Daniel P. Berrange 已提交
3135 3136 3137 3138 3139 3140 3141
    /* x86_64 and i686 support PCI-multibus on all machine types
     * since forever. For other architectures, it has been changing
     * across releases, per machine type, so we can't simply detect
     * it here. Thus the rest of the logic is provided in a separate
     * helper virQEMUCapsHasPCIMultiBus() which keys off the machine
     * stored in virDomainDef and QEMU version number
     */
3142
    if (qemuCaps->arch == VIR_ARCH_X86_64 ||
D
Daniel P. Berrange 已提交
3143
        qemuCaps->arch == VIR_ARCH_I686)
3144
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS);
D
Daniel P. Berrange 已提交
3145 3146 3147 3148 3149

    /* -no-acpi is not supported on non-x86
     * even if qemu reports it in -help */
    if (qemuCaps->arch != VIR_ARCH_X86_64 &&
        qemuCaps->arch != VIR_ARCH_I686)
3150
        virQEMUCapsClear(qemuCaps, QEMU_CAPS_NO_ACPI);
3151

3152
    /* virQEMUCapsExtractDeviceStr will only set additional caps if qemu
3153
     * understands the 0.13.0+ notion of "-device driver,".  */
3154
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE) &&
3155
        strstr(help, "-device driver,?") &&
3156 3157
        virQEMUCapsExtractDeviceStr(qemuCaps->binary,
                                    qemuCaps, runUid, runGid) < 0) {
3158
        goto cleanup;
3159
    }
3160

3161
    if (virQEMUCapsProbeCPUModels(qemuCaps, runUid, runGid) < 0)
3162
        goto cleanup;
3163

3164
    if (virQEMUCapsProbeMachineTypes(qemuCaps, runUid, runGid) < 0)
3165
        goto cleanup;
3166

3167
    ret = 0;
3168
 cleanup:
3169
    virCommandFree(cmd);
3170
    VIR_FREE(help);
3171 3172 3173 3174
    return ret;
}


3175
static void virQEMUCapsMonitorNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
3176 3177
                                     virDomainObjPtr vm ATTRIBUTE_UNUSED,
                                     void *opaque ATTRIBUTE_UNUSED)
3178 3179 3180 3181
{
}

static qemuMonitorCallbacks callbacks = {
3182 3183
    .eofNotify = virQEMUCapsMonitorNotify,
    .errorNotify = virQEMUCapsMonitorNotify,
3184 3185 3186 3187 3188 3189 3190
};


/* Capabilities that we assume are always enabled
 * for QEMU >= 1.2.0
 */
static void
3191
virQEMUCapsInitQMPBasic(virQEMUCapsPtr qemuCaps)
3192
{
3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_MEM_PATH);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_MONITOR_JSON);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_BALLOON);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_SDL);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_SMP_TOPOLOGY);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_RTC);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_VHOST_NET);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NODEFCONFIG);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_BOOT_MENU);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NAME_PROCESS);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_READONLY);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_SMBIOS_TYPE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_VGA_NONE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_AIO);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_QXL_VGA);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_SHUTDOWN);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_UNSAFE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV_READONLY);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_SG_IO);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_COPY_ON_READ);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_HOST);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_FSDEV_WRITEOUT);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DRIVE_IOTUNE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_WAKEUP);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV_BRIDGE);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_SECCOMP_SANDBOX);
O
Olivia Yin 已提交
3227
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB);
J
Ján Tomko 已提交
3228
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION);
3229 3230
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_OPT);
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE);
3231
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC_SHARE_POLICY);
3232
    virQEMUCapsSet(qemuCaps, QEMU_CAPS_HOST_PCI_MULTIDOMAIN);
3233 3234
}

3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253
/* Capabilities that are architecture depending
 * initialized for QEMU.
 */
static int
virQEMUCapsInitArchQMPBasic(virQEMUCapsPtr qemuCaps,
                            qemuMonitorPtr mon)
{
    char *archstr = NULL;
    int ret = -1;

    if (!(archstr = qemuMonitorGetTargetArch(mon)))
        return -1;

    if ((qemuCaps->arch = virQEMUCapsArchFromString(archstr)) == VIR_ARCH_NONE) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Unknown QEMU arch %s"), archstr);
        goto cleanup;
    }

D
Daniel P. Berrange 已提交
3254 3255 3256 3257 3258 3259 3260 3261
    /* x86_64 and i686 support PCI-multibus on all machine types
     * since forever. For other architectures, it has been changing
     * across releases, per machine type, so we can't simply detect
     * it here. Thus the rest of the logic is provided in a separate
     * helper virQEMUCapsHasPCIMultiBus() which keys off the machine
     * stored in virDomainDef and QEMU version number
     *
     * ACPI/HPET/KVM PIT are also x86 specific
3262 3263 3264 3265 3266
     */
    if (qemuCaps->arch == VIR_ARCH_X86_64 ||
        qemuCaps->arch == VIR_ARCH_I686) {
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS);
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_ACPI);
J
Ján Tomko 已提交
3267
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_HPET);
3268 3269 3270 3271 3272
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT);
    }

    ret = 0;

3273
 cleanup:
3274 3275 3276
    VIR_FREE(archstr);
    return ret;
}
3277

3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315
int
virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
                          qemuMonitorPtr mon)
{
    int ret = -1;
    int major, minor, micro;
    char *package = NULL;

    /* @mon is supposed to be locked by callee */

    if (qemuMonitorSetCapabilities(mon) < 0) {
        virErrorPtr err = virGetLastError();
        VIR_DEBUG("Failed to set monitor capabilities %s",
                  err ? err->message : "<unknown problem>");
        ret = 0;
        goto cleanup;
    }

    if (qemuMonitorGetVersion(mon,
                              &major, &minor, &micro,
                              &package) < 0) {
        virErrorPtr err = virGetLastError();
        VIR_DEBUG("Failed to query monitor version %s",
                  err ? err->message : "<unknown problem>");
        ret = 0;
        goto cleanup;
    }

    VIR_DEBUG("Got version %d.%d.%d (%s)",
              major, minor, micro, NULLSTR(package));

    if (major < 1 || (major == 1 && minor < 2)) {
        VIR_DEBUG("Not new enough for QMP capabilities detection");
        ret = 0;
        goto cleanup;
    }

    qemuCaps->version = major * 1000000 + minor * 1000 + micro;
3316
    qemuCaps->package = package;
3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331
    qemuCaps->usedQMP = true;

    virQEMUCapsInitQMPBasic(qemuCaps);

    if (virQEMUCapsInitArchQMPBasic(qemuCaps, mon) < 0)
        goto cleanup;

    /* USB option is supported v1.3.0 onwards */
    if (qemuCaps->version >= 1003000)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT);

    /* WebSockets were introduced between 1.3.0 and 1.3.1 */
    if (qemuCaps->version >= 1003001)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC_WEBSOCKET);

3332 3333 3334 3335 3336 3337
    /* -chardev spiceport is supported from 1.4.0, but usable through
     * qapi only since 1.5.0, however, it still cannot be queried
     * for as a capability */
    if (qemuCaps->version >= 1005000)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEPORT);

3338 3339 3340
    if (qemuCaps->version >= 1006000)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);

3341 3342 3343 3344
    /* vmport option is supported v2.2.0 onwards */
    if (qemuCaps->version >= 2002000)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_VMPORT_OPT);

3345 3346 3347 3348 3349 3350
    /* -cpu ...,aarch64=off supported in v2.3.0 and onwards. But it
       isn't detectable via qmp at this point */
    if (qemuCaps->arch == VIR_ARCH_AARCH64 &&
        qemuCaps->version >= 2003000)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_AARCH64_OFF);

3351 3352 3353
    /* vhost-user supports multi-queue from v2.4.0 onwards,
     * but there is no way to query for that capability */
    if (qemuCaps->version >= 2004000)
J
Ján Tomko 已提交
3354
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE);
3355

3356 3357 3358 3359
    /* Since 2.4.50 ARM virt machine supports gic-version option */
    if (qemuCaps->version >= 2004050)
        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACH_VIRT_GIC_VERSION);

3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375
    if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPEvents(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPObjects(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPCPUDefinitions(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPTPM(qemuCaps, mon) < 0)
        goto cleanup;
    if (virQEMUCapsProbeQMPCommandLine(qemuCaps, mon) < 0)
        goto cleanup;
3376 3377
    if (virQEMUCapsProbeQMPMigrationCapabilities(qemuCaps, mon) < 0)
        goto cleanup;
3378 3379

    ret = 0;
3380
 cleanup:
3381 3382 3383
    return ret;
}

3384
static int
3385 3386 3387
virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
                   const char *libDir,
                   uid_t runUid,
3388 3389
                   gid_t runGid,
                   char **qmperr)
3390 3391 3392 3393 3394 3395 3396 3397
{
    int ret = -1;
    virCommandPtr cmd = NULL;
    qemuMonitorPtr mon = NULL;
    int status = 0;
    virDomainChrSourceDef config;
    char *monarg = NULL;
    char *monpath = NULL;
3398
    char *pidfile = NULL;
3399
    pid_t pid = 0;
3400 3401
    virDomainObjPtr vm = NULL;
    virDomainXMLOptionPtr xmlopt = NULL;
3402

3403 3404 3405
    /* the ".sock" sufix is important to avoid a possible clash with a qemu
     * domain called "capabilities"
     */
3406
    if (virAsprintf(&monpath, "%s/%s", libDir, "capabilities.monitor.sock") < 0)
3407
        goto cleanup;
3408
    if (virAsprintf(&monarg, "unix:%s,server,nowait", monpath) < 0)
3409 3410
        goto cleanup;

3411 3412
    /* ".pidfile" suffix is used rather than ".pid" to avoid a possible clash
     * with a qemu domain called "capabilities"
3413 3414 3415
     * Normally we'd use runDir for pid files, but because we're using
     * -daemonize we need QEMU to be allowed to create them, rather
     * than libvirtd. So we're using libDir which QEMU can write to
3416
     */
3417
    if (virAsprintf(&pidfile, "%s/%s", libDir, "capabilities.pidfile") < 0)
3418 3419
        goto cleanup;

3420 3421 3422 3423 3424
    memset(&config, 0, sizeof(config));
    config.type = VIR_DOMAIN_CHR_TYPE_UNIX;
    config.data.nix.path = monpath;
    config.data.nix.listen = false;

3425 3426
    virPidFileForceCleanupPath(pidfile);

3427
    VIR_DEBUG("Try to get caps via QMP qemuCaps=%p", qemuCaps);
3428

3429 3430 3431 3432 3433 3434 3435
    /*
     * We explicitly need to use -daemonize here, rather than
     * virCommandDaemonize, because we need to synchronize
     * with QEMU creating its monitor socket API. Using
     * daemonize guarantees control won't return to libvirt
     * until the socket is present.
     */
3436
    cmd = virCommandNewArgList(qemuCaps->binary,
3437 3438 3439 3440 3441 3442
                               "-S",
                               "-no-user-config",
                               "-nodefaults",
                               "-nographic",
                               "-M", "none",
                               "-qmp", monarg,
3443 3444
                               "-pidfile", pidfile,
                               "-daemonize",
3445 3446 3447
                               NULL);
    virCommandAddEnvPassCommon(cmd);
    virCommandClearCaps(cmd);
3448 3449
    virCommandSetGID(cmd, runGid);
    virCommandSetUID(cmd, runUid);
3450

3451 3452
    virCommandSetErrorBuffer(cmd, qmperr);

3453
    /* Log, but otherwise ignore, non-zero status.  */
3454 3455 3456 3457 3458
    if (virCommandRun(cmd, &status) < 0)
        goto cleanup;

    if (status != 0) {
        ret = 0;
3459 3460
        VIR_DEBUG("QEMU %s exited with status %d: %s",
                  qemuCaps->binary, status, *qmperr);
3461 3462 3463
        goto cleanup;
    }

3464 3465 3466 3467 3468 3469
    if (virPidFileReadPath(pidfile, &pid) < 0) {
        VIR_DEBUG("Failed to read pidfile %s", pidfile);
        ret = 0;
        goto cleanup;
    }

3470 3471 3472 3473 3474
    if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)) ||
        !(vm = virDomainObjNew(xmlopt)))
        goto cleanup;

    vm->pid = pid;
3475

3476
    if (!(mon = qemuMonitorOpen(vm, &config, true, &callbacks, NULL))) {
3477
        ret = 0;
3478
        goto cleanup;
3479
    }
3480

3481
    virObjectLock(mon);
3482

3483
    if (virQEMUCapsInitQMPMonitor(qemuCaps, mon) < 0)
3484
        goto cleanup;
3485 3486 3487

    ret = 0;

3488
 cleanup:
3489
    if (mon)
3490
        virObjectUnlock(mon);
3491 3492
    qemuMonitorClose(mon);
    virCommandAbort(cmd);
3493
    virCommandFree(cmd);
3494
    VIR_FREE(monarg);
3495 3496
    if (monpath)
        ignore_value(unlink(monpath));
3497
    VIR_FREE(monpath);
M
Michal Privoznik 已提交
3498
    virDomainObjEndAPI(&vm);
3499
    virObjectUnref(xmlopt);
3500

3501
    if (pid != 0) {
3502 3503
        char ebuf[1024];

3504 3505 3506 3507 3508
        VIR_DEBUG("Killing QMP caps process %lld", (long long) pid);
        if (virProcessKill(pid, SIGKILL) < 0 && errno != ESRCH)
            VIR_ERROR(_("Failed to kill process %lld: %s"),
                      (long long) pid,
                      virStrerror(errno, ebuf, sizeof(ebuf)));
3509 3510

        VIR_FREE(*qmperr);
3511 3512
    }
    if (pidfile) {
3513 3514 3515
        unlink(pidfile);
        VIR_FREE(pidfile);
    }
3516 3517 3518 3519
    return ret;
}


3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531
#define MESSAGE_ID_CAPS_PROBE_FAILURE "8ae2f3fb-2dbe-498e-8fbd-012d40afa361"

static void
virQEMUCapsLogProbeFailure(const char *binary)
{
    virLogMetadata meta[] = {
        { .key = "MESSAGE_ID", .s = MESSAGE_ID_CAPS_PROBE_FAILURE, .iv = 0 },
        { .key = "LIBVIRT_QEMU_BINARY", .s = binary, .iv = 0 },
        { .key = NULL },
    };
    virErrorPtr err = virGetLastError();

3532
    virLogMessage(&virLogSelf,
3533 3534 3535 3536 3537 3538 3539 3540 3541
                  VIR_LOG_WARN,
                  __FILE__, __LINE__, __func__,
                  meta,
                  _("Failed to probe capabilities for %s: %s"),
                  binary, err && err->message ? err->message :
                  _("unknown failure"));
}


3542 3543
virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
                                       const char *libDir,
3544
                                       const char *cacheDir,
3545 3546
                                       uid_t runUid,
                                       gid_t runGid)
3547
{
3548
    virQEMUCapsPtr qemuCaps;
3549 3550
    struct stat sb;
    int rv;
3551
    char *qmperr = NULL;
3552

3553 3554 3555
    if (!(qemuCaps = virQEMUCapsNew()))
        goto error;

3556 3557
    if (VIR_STRDUP(qemuCaps->binary, binary) < 0)
        goto error;
3558 3559 3560 3561 3562 3563 3564 3565

    /* We would also want to check faccessat if we cared about ACLs,
     * but we don't.  */
    if (stat(binary, &sb) < 0) {
        virReportSystemError(errno, _("Cannot check QEMU binary %s"),
                             binary);
        goto error;
    }
3566
    qemuCaps->ctime = sb.st_ctime;
3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577

    /* Make sure the binary we are about to try exec'ing exists.
     * Technically we could catch the exec() failure, but that's
     * in a sub-process so it's hard to feed back a useful error.
     */
    if (!virFileIsExecutable(binary)) {
        virReportSystemError(errno, _("QEMU binary %s is not executable"),
                             binary);
        goto error;
    }

3578
    if ((rv = virQEMUCapsInitCached(qemuCaps, cacheDir)) < 0)
3579 3580
        goto error;

3581
    if (rv == 0) {
3582
        if (virQEMUCapsInitQMP(qemuCaps, libDir, runUid, runGid, &qmperr) < 0) {
3583 3584 3585 3586 3587
            virQEMUCapsLogProbeFailure(binary);
            goto error;
        }

        if (!qemuCaps->usedQMP &&
3588
            virQEMUCapsInitHelp(qemuCaps, runUid, runGid, qmperr) < 0) {
3589 3590 3591 3592 3593 3594
            virQEMUCapsLogProbeFailure(binary);
            goto error;
        }

        if (virQEMUCapsRememberCached(qemuCaps, cacheDir) < 0)
            goto error;
3595
    }
3596

3597
    VIR_FREE(qmperr);
3598
    return qemuCaps;
3599

3600
 error:
3601
    VIR_FREE(qmperr);
3602 3603
    virObjectUnref(qemuCaps);
    qemuCaps = NULL;
3604
    return NULL;
3605 3606 3607
}


3608
bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps)
3609 3610 3611
{
    struct stat sb;

3612
    if (!qemuCaps->binary)
3613 3614
        return true;

3615
    if (stat(qemuCaps->binary, &sb) < 0)
3616 3617
        return false;

3618
    return sb.st_ctime == qemuCaps->ctime;
3619
}
3620 3621


3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657
struct virQEMUCapsMachineTypeFilter {
    const char *machineType;
    virQEMUCapsFlags *flags;
    size_t nflags;
};

static const struct virQEMUCapsMachineTypeFilter virQEMUCapsMachineFilter[] = {
    /* { "blah", virQEMUCapsMachineBLAHFilter,
         ARRAY_CARDINALITY(virQEMUCapsMachineBLAHFilter) }, */
    { "", NULL, 0 },
};


void
virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
                               const char *machineType)
{
    size_t i;

    if (!machineType)
        return;

    for (i = 0; i < ARRAY_CARDINALITY(virQEMUCapsMachineFilter); i++) {
        const struct virQEMUCapsMachineTypeFilter *filter = &virQEMUCapsMachineFilter[i];
        size_t j;

        if (STRNEQ(filter->machineType, machineType))
            continue;

        for (j = 0; j < filter->nflags; j++)
            virQEMUCapsClear(qemuCaps, filter->flags[j]);
    }

}


3658 3659
virQEMUCapsCachePtr
virQEMUCapsCacheNew(const char *libDir,
3660
                    const char *cacheDir,
3661 3662
                    uid_t runUid,
                    gid_t runGid)
3663
{
3664
    virQEMUCapsCachePtr cache;
3665

3666
    if (VIR_ALLOC(cache) < 0)
3667 3668 3669 3670 3671 3672 3673 3674 3675
        return NULL;

    if (virMutexInit(&cache->lock) < 0) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Unable to initialize mutex"));
        VIR_FREE(cache);
        return NULL;
    }

E
Eric Blake 已提交
3676
    if (!(cache->binaries = virHashCreate(10, virObjectFreeHashData)))
3677
        goto error;
3678
    if (VIR_STRDUP(cache->libDir, libDir) < 0)
3679
        goto error;
3680 3681
    if (VIR_STRDUP(cache->cacheDir, cacheDir) < 0)
        goto error;
3682

3683 3684 3685
    cache->runUid = runUid;
    cache->runGid = runGid;

3686 3687
    return cache;

3688
 error:
3689
    virQEMUCapsCacheFree(cache);
3690 3691 3692
    return NULL;
}

3693
const char *qemuTestCapsName;
3694

3695 3696
virQEMUCapsPtr
virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary)
3697
{
3698
    virQEMUCapsPtr ret = NULL;
3699 3700 3701 3702 3703

    /* This is used only by test suite!!! */
    if (qemuTestCapsName)
        binary = qemuTestCapsName;

3704 3705 3706
    virMutexLock(&cache->lock);
    ret = virHashLookup(cache->binaries, binary);
    if (ret &&
3707
        !virQEMUCapsIsValid(ret)) {
3708 3709 3710 3711 3712 3713 3714 3715
        VIR_DEBUG("Cached capabilities %p no longer valid for %s",
                  ret, binary);
        virHashRemoveEntry(cache->binaries, binary);
        ret = NULL;
    }
    if (!ret) {
        VIR_DEBUG("Creating capabilities for %s",
                  binary);
3716
        ret = virQEMUCapsNewForBinary(binary, cache->libDir,
3717
                                      cache->cacheDir,
3718
                                      cache->runUid, cache->runGid);
3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734
        if (ret) {
            VIR_DEBUG("Caching capabilities %p for %s",
                      ret, binary);
            if (virHashAddEntry(cache->binaries, binary, ret) < 0) {
                virObjectUnref(ret);
                ret = NULL;
            }
        }
    }
    VIR_DEBUG("Returning caps %p for %s", ret, binary);
    virObjectRef(ret);
    virMutexUnlock(&cache->lock);
    return ret;
}


3735
virQEMUCapsPtr
3736 3737
virQEMUCapsCacheLookupCopy(virQEMUCapsCachePtr cache,
                           const char *binary,
3738
                           const char *machineType)
3739
{
3740 3741
    virQEMUCapsPtr qemuCaps = virQEMUCapsCacheLookup(cache, binary);
    virQEMUCapsPtr ret;
3742

3743
    if (!qemuCaps)
3744 3745
        return NULL;

3746 3747
    ret = virQEMUCapsNewCopy(qemuCaps);
    virObjectUnref(qemuCaps);
3748
    virQEMUCapsFilterByMachineType(ret, machineType);
3749 3750 3751 3752
    return ret;
}


3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769
static int
virQEMUCapsCompareArch(const void *payload,
                       const void *name ATTRIBUTE_UNUSED,
                       const void *opaque)
{
    struct virQEMUCapsSearchData *data = (struct virQEMUCapsSearchData *) opaque;
    const virQEMUCaps *qemuCaps = payload;

    return qemuCaps->arch == data->arch;
}


virQEMUCapsPtr
virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache,
                             virArch arch)
{
    virQEMUCapsPtr ret = NULL;
3770
    virArch target;
3771 3772 3773 3774
    struct virQEMUCapsSearchData data = { .arch = arch };

    virMutexLock(&cache->lock);
    ret = virHashSearch(cache->binaries, virQEMUCapsCompareArch, &data);
3775 3776 3777 3778 3779 3780 3781 3782 3783
    if (!ret) {
        /* If the first attempt at finding capabilities has failed, try
         * again using the QEMU target as lookup key instead */
        target = virQEMUCapsFindTarget(virArchFromHost(), data.arch);
        if (target != data.arch) {
            data.arch = target;
            ret = virHashSearch(cache->binaries, virQEMUCapsCompareArch, &data);
        }
    }
3784 3785 3786
    virObjectRef(ret);
    virMutexUnlock(&cache->lock);

3787 3788
    VIR_DEBUG("Returning caps %p for arch %s", ret, virArchToString(arch));

3789 3790 3791 3792
    return ret;
}


3793
void
3794
virQEMUCapsCacheFree(virQEMUCapsCachePtr cache)
3795 3796 3797 3798
{
    if (!cache)
        return;

3799
    VIR_FREE(cache->libDir);
3800
    VIR_FREE(cache->cacheDir);
3801 3802 3803 3804
    virHashFree(cache->binaries);
    virMutexDestroy(&cache->lock);
    VIR_FREE(cache);
}
3805

3806 3807 3808 3809

bool
virQEMUCapsSupportsChardev(virDomainDefPtr def,
                           virQEMUCapsPtr qemuCaps,
3810
                           virDomainChrDefPtr chr)
3811 3812 3813 3814 3815
{
    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
        !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
        return false;

3816
    if ((def->os.arch == VIR_ARCH_PPC) || ARCH_IS_PPC64(def->os.arch)) {
3817 3818 3819 3820 3821
        /* only pseries need -device spapr-vty with -chardev */
        return (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
                chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO);
    }

3822
    if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch != VIR_ARCH_AARCH64))
3823
        return true;
3824

3825 3826 3827 3828 3829 3830
    /* This may not be true for all ARM machine types, but at least
     * the only supported non-virtio serial devices of vexpress and versatile
     * don't have the -chardev property wired up. */
    return (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO ||
            (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
             chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO));
3831
}
3832 3833


3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846
bool
virQEMUCapsSupportsVmport(virQEMUCapsPtr qemuCaps,
                          const virDomainDef *def)
{
    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VMPORT_OPT))
        return false;

    return qemuDomainMachineIsI440FX(def) ||
        qemuDomainMachineIsQ35(def) ||
        STREQ(def->os.machine, "isapc");
}


3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858
bool
virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps,
                              const char *canonical_machine)
{
    size_t i;

    for (i = 0; i < qemuCaps->nmachineTypes; i++) {
        if (STREQ(canonical_machine, qemuCaps->machineTypes[i]))
            return true;
    }
    return false;
}
3859 3860 3861 3862 3863 3864 3865 3866 3867


const char *
virQEMUCapsGetDefaultMachine(virQEMUCapsPtr qemuCaps)
{
    if (!qemuCaps->nmachineTypes)
        return NULL;
    return qemuCaps->machineTypes[0];
}
3868 3869


3870
static int
3871
virQEMUCapsFillDomainLoaderCaps(virQEMUCapsPtr qemuCaps,
3872 3873 3874
                                virDomainCapsLoaderPtr capsLoader,
                                char **loader,
                                size_t nloader)
3875
{
3876 3877
    size_t i;

3878
    capsLoader->device.supported = true;
3879

3880
    if (VIR_ALLOC_N(capsLoader->values.values, nloader) < 0)
3881 3882
        return -1;

3883 3884
    for (i = 0; i < nloader; i++) {
        const char *filename = loader[i];
3885 3886 3887 3888 3889 3890

        if (!virFileExists(filename)) {
            VIR_DEBUG("loader filename=%s does not exist", filename);
            continue;
        }

3891
        if (VIR_STRDUP(capsLoader->values.values[capsLoader->values.nvalues],
3892 3893
                       filename) < 0)
            return -1;
3894
        capsLoader->values.nvalues++;
3895 3896
    }

3897
    VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->type,
3898 3899
                             VIR_DOMAIN_LOADER_TYPE_ROM);

3900 3901
    VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->type,
                             VIR_DOMAIN_LOADER_TYPE_PFLASH);
3902 3903 3904


    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY))
3905
        VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->readonly,
3906 3907
                                 VIR_TRISTATE_BOOL_YES,
                                 VIR_TRISTATE_BOOL_NO);
3908
    return 0;
3909 3910 3911
}


3912
static int
3913 3914
virQEMUCapsFillDomainOSCaps(virQEMUCapsPtr qemuCaps,
                            virDomainCapsOSPtr os,
3915 3916
                            char **loader,
                            size_t nloader)
3917
{
3918
    virDomainCapsLoaderPtr capsLoader = &os->loader;
3919 3920

    os->device.supported = true;
M
Michal Privoznik 已提交
3921
    if (virQEMUCapsFillDomainLoaderCaps(qemuCaps, capsLoader,
3922
                                        loader, nloader) < 0)
3923 3924
        return -1;
    return 0;
3925 3926 3927
}


3928
static int
3929
virQEMUCapsFillDomainDeviceDiskCaps(virQEMUCapsPtr qemuCaps,
3930
                                    const char *machine,
3931 3932 3933 3934 3935 3936
                                    virDomainCapsDeviceDiskPtr disk)
{
    disk->device.supported = true;
    /* QEMU supports all of these */
    VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice,
                             VIR_DOMAIN_DISK_DEVICE_DISK,
3937 3938 3939 3940 3941
                             VIR_DOMAIN_DISK_DEVICE_CDROM);

    /* PowerPC pseries based VMs do not support floppy device */
    if (!(ARCH_IS_PPC64(qemuCaps->arch) && STRPREFIX(machine, "pseries")))
        VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice, VIR_DOMAIN_DISK_DEVICE_FLOPPY);
3942 3943 3944 3945 3946 3947 3948 3949 3950 3951

    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_SG_IO))
        VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice, VIR_DOMAIN_DISK_DEVICE_LUN);

    VIR_DOMAIN_CAPS_ENUM_SET(disk->bus,
                             VIR_DOMAIN_DISK_BUS_IDE,
                             VIR_DOMAIN_DISK_BUS_SCSI,
                             VIR_DOMAIN_DISK_BUS_VIRTIO,
                             /* VIR_DOMAIN_DISK_BUS_SD */);

3952 3953 3954 3955
    /* PowerPC pseries based VMs do not support floppy device */
    if (!(ARCH_IS_PPC64(qemuCaps->arch) && STRPREFIX(machine, "pseries")))
        VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_FDC);

3956 3957
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_STORAGE))
        VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_USB);
3958
    return 0;
3959 3960 3961
}


3962
static int
3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982
virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
                                       virDomainCapsDeviceHostdevPtr hostdev)
{
    bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy();
    bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();

    hostdev->device.supported = true;
    /* VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES is for containers only */
    VIR_DOMAIN_CAPS_ENUM_SET(hostdev->mode,
                             VIR_DOMAIN_HOSTDEV_MODE_SUBSYS);

    VIR_DOMAIN_CAPS_ENUM_SET(hostdev->startupPolicy,
                             VIR_DOMAIN_STARTUP_POLICY_DEFAULT,
                             VIR_DOMAIN_STARTUP_POLICY_MANDATORY,
                             VIR_DOMAIN_STARTUP_POLICY_REQUISITE,
                             VIR_DOMAIN_STARTUP_POLICY_OPTIONAL);

    VIR_DOMAIN_CAPS_ENUM_SET(hostdev->subsysType,
                             VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB,
                             VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI);
3983
    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE) &&
3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005
        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SCSI_GENERIC))
        VIR_DOMAIN_CAPS_ENUM_SET(hostdev->subsysType,
                                 VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI);

    /* No virDomainHostdevCapsType for QEMU */
    virDomainCapsEnumClear(&hostdev->capsType);

    virDomainCapsEnumClear(&hostdev->pciBackend);
    if (supportsPassthroughVFIO &&
        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
        VIR_DOMAIN_CAPS_ENUM_SET(hostdev->pciBackend,
                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT,
                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO);
    }

    if (supportsPassthroughKVM &&
        (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIDEVICE) ||
         virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
        VIR_DOMAIN_CAPS_ENUM_SET(hostdev->pciBackend,
                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT,
                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM);
    }
4006
    return 0;
4007 4008 4009
}


4010
int
4011
virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
4012
                          virQEMUCapsPtr qemuCaps,
4013 4014
                          char **loader,
                          size_t nloader)
4015
{
4016
    virDomainCapsOSPtr os = &domCaps->os;
4017 4018 4019 4020 4021 4022
    virDomainCapsDeviceDiskPtr disk = &domCaps->disk;
    virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev;
    int maxvcpus = virQEMUCapsGetMachineMaxCpus(qemuCaps, domCaps->machine);

    domCaps->maxvcpus = maxvcpus;

M
Michal Privoznik 已提交
4023
    if (virQEMUCapsFillDomainOSCaps(qemuCaps, os,
4024
                                    loader, nloader) < 0 ||
4025
        virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk) < 0 ||
4026 4027 4028
        virQEMUCapsFillDomainDeviceHostdevCaps(qemuCaps, hostdev) < 0)
        return -1;
    return 0;
4029
}