qemu-config.c 5.7 KB
Newer Older
G
Gerd Hoffmann 已提交
1 2 3
#include "qemu-common.h"
#include "qemu-option.h"
#include "qemu-config.h"
G
Gerd Hoffmann 已提交
4
#include "sysemu.h"
G
Gerd Hoffmann 已提交
5 6 7

QemuOptsList qemu_drive_opts = {
    .name = "drive",
B
Blue Swirl 已提交
8
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
G
Gerd Hoffmann 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    .desc = {
        {
            .name = "bus",
            .type = QEMU_OPT_NUMBER,
            .help = "bus number",
        },{
            .name = "unit",
            .type = QEMU_OPT_NUMBER,
            .help = "unit number (i.e. lun for scsi)",
        },{
            .name = "if",
            .type = QEMU_OPT_STRING,
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
        },{
            .name = "index",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "cyls",
            .type = QEMU_OPT_NUMBER,
            .help = "number of cylinders (ide disk geometry)",
        },{
            .name = "heads",
            .type = QEMU_OPT_NUMBER,
            .help = "number of heads (ide disk geometry)",
        },{
            .name = "secs",
            .type = QEMU_OPT_NUMBER,
            .help = "number of sectors (ide disk geometry)",
        },{
            .name = "trans",
            .type = QEMU_OPT_STRING,
            .help = "chs translation (auto, lba. none)",
        },{
            .name = "media",
            .type = QEMU_OPT_STRING,
            .help = "media type (disk, cdrom)",
        },{
            .name = "snapshot",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "file",
            .type = QEMU_OPT_STRING,
            .help = "disk image",
        },{
            .name = "cache",
            .type = QEMU_OPT_STRING,
            .help = "host cache usage (none, writeback, writethrough)",
56 57 58 59
        },{
            .name = "aio",
            .type = QEMU_OPT_STRING,
            .help = "host AIO implementation (threads, native)",
G
Gerd Hoffmann 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
        },{
            .name = "format",
            .type = QEMU_OPT_STRING,
            .help = "disk format (raw, qcow2, ...)",
        },{
            .name = "serial",
            .type = QEMU_OPT_STRING,
        },{
            .name = "werror",
            .type = QEMU_OPT_STRING,
        },{
            .name = "addr",
            .type = QEMU_OPT_STRING,
            .help = "pci address (virtio only)",
        },
        { /* end if list */ }
    },
};

79 80
QemuOptsList qemu_chardev_opts = {
    .name = "chardev",
B
Blue Swirl 已提交
81
    .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
82
    .desc = {
83 84 85 86 87 88
        {
            .name = "backend",
            .type = QEMU_OPT_STRING,
        },{
            .name = "path",
            .type = QEMU_OPT_STRING,
89 90 91 92 93 94
        },{
            .name = "host",
            .type = QEMU_OPT_STRING,
        },{
            .name = "port",
            .type = QEMU_OPT_STRING,
G
Gerd Hoffmann 已提交
95 96 97 98 99 100
        },{
            .name = "localaddr",
            .type = QEMU_OPT_STRING,
        },{
            .name = "localport",
            .type = QEMU_OPT_STRING,
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
        },{
            .name = "to",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "ipv4",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "ipv6",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "wait",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "server",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "delay",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "telnet",
            .type = QEMU_OPT_BOOL,
G
Gerd Hoffmann 已提交
122 123 124 125 126 127 128 129 130 131 132 133
        },{
            .name = "width",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "height",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "cols",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "rows",
            .type = QEMU_OPT_NUMBER,
G
Gerd Hoffmann 已提交
134 135 136
        },{
            .name = "mux",
            .type = QEMU_OPT_BOOL,
137
        },
138 139 140 141
        { /* end if list */ }
    },
};

G
Gerd Hoffmann 已提交
142 143
QemuOptsList qemu_device_opts = {
    .name = "device",
B
Blue Swirl 已提交
144
    .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head),
G
Gerd Hoffmann 已提交
145 146 147 148 149 150 151 152 153 154
    .desc = {
        /*
         * no elements => accept any
         * sanity checking will happen later
         * when setting device properties
         */
        { /* end if list */ }
    },
};

M
Mark McLoughlin 已提交
155 156 157 158 159 160 161 162 163 164 165 166
QemuOptsList qemu_net_opts = {
    .name = "net",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
    .desc = {
        /*
         * no elements => accept any params
         * validation will happen later
         */
        { /* end of list */ }
    },
};

J
Jan Kiszka 已提交
167 168 169 170 171 172 173
QemuOptsList qemu_rtc_opts = {
    .name = "rtc",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
    .desc = {
        {
            .name = "base",
            .type = QEMU_OPT_STRING,
J
Jan Kiszka 已提交
174 175 176
        },{
            .name = "clock",
            .type = QEMU_OPT_STRING,
J
Jan Kiszka 已提交
177 178 179 180 181 182 183 184 185 186
#ifdef TARGET_I386
        },{
            .name = "driftfix",
            .type = QEMU_OPT_STRING,
#endif
        },
        { /* end if list */ }
    },
};

G
Gerd Hoffmann 已提交
187 188
static QemuOptsList *lists[] = {
    &qemu_drive_opts,
189
    &qemu_chardev_opts,
G
Gerd Hoffmann 已提交
190
    &qemu_device_opts,
M
Mark McLoughlin 已提交
191
    &qemu_net_opts,
J
Jan Kiszka 已提交
192
    &qemu_rtc_opts,
G
Gerd Hoffmann 已提交
193 194 195 196 197 198 199 200 201 202 203
    NULL,
};

int qemu_set_option(const char *str)
{
    char group[64], id[64], arg[64];
    QemuOpts *opts;
    int i, rc, offset;

    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
    if (rc < 3 || str[offset] != '=') {
G
Gerd Hoffmann 已提交
204
        qemu_error("can't parse: \"%s\"\n", str);
G
Gerd Hoffmann 已提交
205 206 207 208 209 210 211 212
        return -1;
    }

    for (i = 0; lists[i] != NULL; i++) {
        if (strcmp(lists[i]->name, group) == 0)
            break;
    }
    if (lists[i] == NULL) {
G
Gerd Hoffmann 已提交
213
        qemu_error("there is no option group \"%s\"\n", group);
G
Gerd Hoffmann 已提交
214 215 216 217 218
        return -1;
    }

    opts = qemu_opts_find(lists[i], id);
    if (!opts) {
G
Gerd Hoffmann 已提交
219
        qemu_error("there is no %s \"%s\" defined\n",
G
Gerd Hoffmann 已提交
220 221 222 223
                lists[i]->name, id);
        return -1;
    }

M
Mark McLoughlin 已提交
224
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
G
Gerd Hoffmann 已提交
225 226 227 228 229
        return -1;
    }
    return 0;
}