testutilsqemu.c 11.3 KB
Newer Older
1
#include <config.h>
A
Atsushi SAKAI 已提交
2
#ifdef WITH_QEMU
3
# include <stdlib.h>
4

5 6
# include "testutilsqemu.h"
# include "testutils.h"
7
# include "viralloc.h"
J
Jiri Denemark 已提交
8
# include "cpu_conf.h"
9
# include "qemu/qemu_driver.h"
10
# include "qemu/qemu_domain.h"
11 12 13
# include "virstring.h"

# define VIR_FROM_THIS VIR_FROM_QEMU
14

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
static virCapsGuestMachinePtr *testQemuAllocMachines(int *nmachines)
{
    virCapsGuestMachinePtr *machines;
    static const char *const x86_machines[] = {
        "pc", "isapc"
    };

    machines = virCapabilitiesAllocMachines(x86_machines,
                                            ARRAY_CARDINALITY(x86_machines));
    if (machines == NULL)
        return NULL;

    *nmachines = ARRAY_CARDINALITY(x86_machines);

    return machines;
}

M
Mark McLoughlin 已提交
32 33 34 35 36 37 38 39 40 41 42 43
/* Newer versions of qemu have versioned machine types to allow
 * compatibility with older releases.
 * The 'pc' machine type is an alias of the newest machine type.
 */
static virCapsGuestMachinePtr *testQemuAllocNewerMachines(int *nmachines)
{
    virCapsGuestMachinePtr *machines;
    char *canonical;
    static const char *const x86_machines[] = {
        "pc-0.11", "pc", "pc-0.10", "isapc"
    };

44
    if (VIR_STRDUP(canonical, x86_machines[0]) < 0)
M
Mark McLoughlin 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
        return NULL;

    machines = virCapabilitiesAllocMachines(x86_machines,
                                            ARRAY_CARDINALITY(x86_machines));
    if (machines == NULL) {
        VIR_FREE(canonical);
        return NULL;
    }

    machines[1]->canonical = canonical;

    *nmachines = ARRAY_CARDINALITY(x86_machines);

    return machines;
}

61

62 63 64 65 66 67 68 69 70 71
static int testQemuAddPPC64Guest(virCapsPtr caps)
{
    static const char *machine[] = { "pseries" };
    virCapsGuestMachinePtr *machines = NULL;
    virCapsGuestPtr guest;

    machines = virCapabilitiesAllocMachines(machine, 1);
    if (!machines)
        goto error;

72
    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_PPC64,
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
                                    "/usr/bin/qemu-system-ppc64", NULL,
                                     1, machines);
    if (!guest)
        goto error;

    if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL))
        goto error;

    return 0;

error:
    /* No way to free a guest? */
    virCapabilitiesFreeMachines(machines, 1);
    return -1;
}

O
Olivia Yin 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
static int testQemuAddPPCGuest(virCapsPtr caps)
{
    static const char *machine[] = { "g3beige",
                                     "mac99",
                                     "prep",
                                     "ppce500v2" };
    virCapsGuestMachinePtr *machines = NULL;
    virCapsGuestPtr guest;

    machines = virCapabilitiesAllocMachines(machine, 1);
    if (!machines)
        goto error;

    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_PPC,
                                    "/usr/bin/qemu-system-ppc", NULL,
                                     1, machines);
    if (!guest)
        goto error;

    if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL))
        goto error;

    return 0;

error:
    /* No way to free a guest? */
    virCapabilitiesFreeMachines(machines, 1);
    return -1;
}

119 120
static int testQemuAddS390Guest(virCapsPtr caps)
{
121 122
    static const char *s390_machines[] = { "s390-virtio",
                                           "s390-ccw-virtio" };
123 124 125 126 127 128 129 130
    virCapsGuestMachinePtr *machines = NULL;
    virCapsGuestPtr guest;

    machines = virCapabilitiesAllocMachines(s390_machines,
                                            ARRAY_CARDINALITY(s390_machines));
    if (!machines)
        goto error;

131
    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_S390X,
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
                                    "/usr/bin/qemu-system-s390x", NULL,
                                    ARRAY_CARDINALITY(s390_machines),
                                    machines);
    if (!guest)
        goto error;

    if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL))
        goto error;

    return 0;

error:
    virCapabilitiesFreeMachines(machines, ARRAY_CARDINALITY(s390_machines));
    return -1;
}

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
static int testQemuAddArmGuest(virCapsPtr caps)
{
    static const char *machines[] = { "vexpress-a9",
                                      "vexpress-a15",
                                      "versatilepb" };
    virCapsGuestMachinePtr *capsmachines = NULL;
    virCapsGuestPtr guest;

    capsmachines = virCapabilitiesAllocMachines(machines,
                                                ARRAY_CARDINALITY(machines));
    if (!capsmachines)
        goto error;

    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_ARMV7L,
                                    "/usr/bin/qemu-system-arm", NULL,
                                    ARRAY_CARDINALITY(machines),
                                    capsmachines);
    if (!guest)
        goto error;

    if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL))
        goto error;

    return 0;

error:
    virCapabilitiesFreeMachines(capsmachines, ARRAY_CARDINALITY(machines));
    return -1;
}

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
static int testQemuAddAARCH64Guest(virCapsPtr caps)
{
    static const char *machines[] = { "virt"};
    virCapsGuestMachinePtr *capsmachines = NULL;
    virCapsGuestPtr guest;

    capsmachines = virCapabilitiesAllocMachines(machines,
                                                ARRAY_CARDINALITY(machines));
    if (!capsmachines)
        goto error;

    guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_AARCH64,
                                    "/usr/bin/qemu-system-aarch64", NULL,
                                    ARRAY_CARDINALITY(machines),
                                    capsmachines);
    if (!guest)
        goto error;

    if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL))
        goto error;

    return 0;

error:
    virCapabilitiesFreeMachines(capsmachines, ARRAY_CARDINALITY(machines));
    return -1;
}
205

206 207 208
virCapsPtr testQemuCapsInit(void) {
    virCapsPtr caps;
    virCapsGuestPtr guest;
209 210
    virCapsGuestMachinePtr *machines = NULL;
    int nmachines = 0;
211 212 213
    static const char *const xen_machines[] = {
        "xenner"
    };
J
Jiri Denemark 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
    static virCPUFeatureDef host_cpu_features[] = {
        { (char *) "lahf_lm",   -1 },
        { (char *) "xtpr",      -1 },
        { (char *) "cx16",      -1 },
        { (char *) "tm2",       -1 },
        { (char *) "est",       -1 },
        { (char *) "vmx",       -1 },
        { (char *) "ds_cpl",    -1 },
        { (char *) "pbe",       -1 },
        { (char *) "tm",        -1 },
        { (char *) "ht",        -1 },
        { (char *) "ss",        -1 },
        { (char *) "acpi",      -1 },
        { (char *) "ds",        -1 }
    };
    static virCPUDef host_cpu = {
        VIR_CPU_TYPE_HOST,      /* type */
231
        0,                      /* mode */
J
Jiri Denemark 已提交
232
        0,                      /* match */
233
        VIR_ARCH_X86_64,        /* arch */
J
Jiri Denemark 已提交
234
        (char *) "core2duo",    /* model */
235
        NULL,                   /* vendor_id */
236
        0,                      /* fallback */
J
Jiri Denemark 已提交
237
        (char *) "Intel",       /* vendor */
J
Jiri Denemark 已提交
238 239 240 241
        1,                      /* sockets */
        2,                      /* cores */
        1,                      /* threads */
        ARRAY_CARDINALITY(host_cpu_features), /* nfeatures */
E
Eric Blake 已提交
242
        ARRAY_CARDINALITY(host_cpu_features), /* nfeatures_max */
E
Eric Blake 已提交
243 244 245 246 247
        host_cpu_features,      /* features */
        0,                      /* ncells */
        0,                      /* ncells_max */
        NULL,                   /* cells */
        0,                      /* cells_cpus */
J
Jiri Denemark 已提交
248
    };
249

250
    if ((caps = virCapabilitiesNew(host_cpu.arch,
251 252 253
                                   0, 0)) == NULL)
        return NULL;

J
Jiri Denemark 已提交
254 255
    if ((caps->host.cpu = virCPUDefCopy(&host_cpu)) == NULL ||
        (machines = testQemuAllocMachines(&nmachines)) == NULL)
256 257
        goto cleanup;

258
    if ((guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_I686,
259
                                         "/usr/bin/qemu", NULL,
260 261
                                         nmachines, machines)) == NULL ||
        !virCapabilitiesAddGuestFeature(guest, "cpuselection", 1, 0))
262
        goto cleanup;
263 264
    machines = NULL;

265 266 267 268 269 270 271 272
    if (virCapabilitiesAddGuestDomain(guest,
                                      "qemu",
                                      NULL,
                                      NULL,
                                      0,
                                      NULL) == NULL)
        goto cleanup;

M
Mark McLoughlin 已提交
273
    if ((machines = testQemuAllocNewerMachines(&nmachines)) == NULL)
274 275
        goto cleanup;

276
    if ((guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_X86_64,
277
                                         "/usr/bin/qemu-system-x86_64", NULL,
278 279
                                         nmachines, machines)) == NULL ||
        !virCapabilitiesAddGuestFeature(guest, "cpuselection", 1, 0))
280
        goto cleanup;
281 282
    machines = NULL;

283 284 285 286 287 288 289
    if (virCapabilitiesAddGuestDomain(guest,
                                      "qemu",
                                      NULL,
                                      NULL,
                                      0,
                                      NULL) == NULL)
        goto cleanup;
290 291 292 293

    if ((machines = testQemuAllocMachines(&nmachines)) == NULL)
        goto cleanup;

294 295 296 297
    if (virCapabilitiesAddGuestDomain(guest,
                                      "kvm",
                                      "/usr/bin/kvm",
                                      NULL,
298 299
                                      nmachines,
                                      machines) == NULL)
300
        goto cleanup;
301
    machines = NULL;
302

303
    nmachines = ARRAY_CARDINALITY(xen_machines);
304 305 306
    if ((machines = virCapabilitiesAllocMachines(xen_machines, nmachines)) == NULL)
        goto cleanup;

307
    if ((guest = virCapabilitiesAddGuest(caps, "xen", VIR_ARCH_X86_64,
308
                                         "/usr/bin/xenner", NULL,
309
                                         nmachines, machines)) == NULL)
310
        goto cleanup;
311 312
    machines = NULL;

313 314 315 316 317 318 319 320
    if (virCapabilitiesAddGuestDomain(guest,
                                      "kvm",
                                      "/usr/bin/kvm",
                                      NULL,
                                      0,
                                      NULL) == NULL)
        goto cleanup;

321 322 323
    if (testQemuAddPPC64Guest(caps))
        goto cleanup;

O
Olivia Yin 已提交
324 325 326
    if (testQemuAddPPCGuest(caps))
        goto cleanup;

327 328 329
    if (testQemuAddS390Guest(caps))
        goto cleanup;

330 331 332
    if (testQemuAddArmGuest(caps))
        goto cleanup;

333 334 335
    if (testQemuAddAARCH64Guest(caps))
        goto cleanup;

336
    if (virTestGetDebug()) {
337 338 339 340 341 342 343 344 345 346 347
        char *caps_str;

        caps_str = virCapabilitiesFormatXML(caps);
        if (!caps_str)
            goto cleanup;

        fprintf(stderr, "QEMU driver capabilities:\n%s", caps_str);

        VIR_FREE(caps_str);
    }

348 349 350
    return caps;

cleanup:
351
    virCapabilitiesFreeMachines(machines, nmachines);
352
    virObjectUnref(caps);
353 354
    return NULL;
}
355 356 357


static char *
358 359
testSCSIDeviceGetSgName(const char *sysfs_prefix ATTRIBUTE_UNUSED,
                        const char *adapter ATTRIBUTE_UNUSED,
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
                        unsigned int bus ATTRIBUTE_UNUSED,
                        unsigned int target ATTRIBUTE_UNUSED,
                        unsigned int unit ATTRIBUTE_UNUSED)
{
    char *sg = NULL;

    if (VIR_STRDUP(sg, "sg0") < 0)
        return NULL;

    return sg;
}

qemuBuildCommandLineCallbacks testCallbacks = {
    .qemuGetSCSIDeviceSgName = testSCSIDeviceGetSgName,
};
A
Atsushi SAKAI 已提交
375
#endif