Statistics
| Branch: | Revision:

root / qemu-config.c @ 94befa45

History | View | Annotate | Download (23.5 kB)

1 7282a033 Gerd Hoffmann
#include "qemu-common.h"
2 2f792016 Markus Armbruster
#include "qemu-error.h"
3 7282a033 Gerd Hoffmann
#include "qemu-option.h"
4 7282a033 Gerd Hoffmann
#include "qemu-config.h"
5 d0fef6fb Gerd Hoffmann
#include "hw/qdev.h"
6 2ac20613 Luiz Capitulino
#include "error.h"
7 7282a033 Gerd Hoffmann
8 3329f07b Gerd Hoffmann
static QemuOptsList qemu_drive_opts = {
9 7282a033 Gerd Hoffmann
    .name = "drive",
10 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
11 7282a033 Gerd Hoffmann
    .desc = {
12 7282a033 Gerd Hoffmann
        {
13 7282a033 Gerd Hoffmann
            .name = "bus",
14 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
15 7282a033 Gerd Hoffmann
            .help = "bus number",
16 7282a033 Gerd Hoffmann
        },{
17 7282a033 Gerd Hoffmann
            .name = "unit",
18 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
19 7282a033 Gerd Hoffmann
            .help = "unit number (i.e. lun for scsi)",
20 7282a033 Gerd Hoffmann
        },{
21 7282a033 Gerd Hoffmann
            .name = "if",
22 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
23 7282a033 Gerd Hoffmann
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
24 7282a033 Gerd Hoffmann
        },{
25 7282a033 Gerd Hoffmann
            .name = "index",
26 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
27 69d7e218 Luiz Capitulino
            .help = "index number",
28 7282a033 Gerd Hoffmann
        },{
29 7282a033 Gerd Hoffmann
            .name = "cyls",
30 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
31 7282a033 Gerd Hoffmann
            .help = "number of cylinders (ide disk geometry)",
32 7282a033 Gerd Hoffmann
        },{
33 7282a033 Gerd Hoffmann
            .name = "heads",
34 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
35 7282a033 Gerd Hoffmann
            .help = "number of heads (ide disk geometry)",
36 7282a033 Gerd Hoffmann
        },{
37 7282a033 Gerd Hoffmann
            .name = "secs",
38 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
39 7282a033 Gerd Hoffmann
            .help = "number of sectors (ide disk geometry)",
40 7282a033 Gerd Hoffmann
        },{
41 7282a033 Gerd Hoffmann
            .name = "trans",
42 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
43 7282a033 Gerd Hoffmann
            .help = "chs translation (auto, lba. none)",
44 7282a033 Gerd Hoffmann
        },{
45 7282a033 Gerd Hoffmann
            .name = "media",
46 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
47 7282a033 Gerd Hoffmann
            .help = "media type (disk, cdrom)",
48 7282a033 Gerd Hoffmann
        },{
49 7282a033 Gerd Hoffmann
            .name = "snapshot",
50 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
51 69d7e218 Luiz Capitulino
            .help = "enable/disable snapshot mode",
52 7282a033 Gerd Hoffmann
        },{
53 7282a033 Gerd Hoffmann
            .name = "file",
54 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
55 7282a033 Gerd Hoffmann
            .help = "disk image",
56 7282a033 Gerd Hoffmann
        },{
57 7282a033 Gerd Hoffmann
            .name = "cache",
58 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
59 92196b2f Stefan Hajnoczi
            .help = "host cache usage (none, writeback, writethrough, "
60 92196b2f Stefan Hajnoczi
                    "directsync, unsafe)",
61 7282a033 Gerd Hoffmann
        },{
62 5c6c3a6c Christoph Hellwig
            .name = "aio",
63 5c6c3a6c Christoph Hellwig
            .type = QEMU_OPT_STRING,
64 5c6c3a6c Christoph Hellwig
            .help = "host AIO implementation (threads, native)",
65 5c6c3a6c Christoph Hellwig
        },{
66 7282a033 Gerd Hoffmann
            .name = "format",
67 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
68 7282a033 Gerd Hoffmann
            .help = "disk format (raw, qcow2, ...)",
69 7282a033 Gerd Hoffmann
        },{
70 7282a033 Gerd Hoffmann
            .name = "serial",
71 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
72 69d7e218 Luiz Capitulino
            .help = "disk serial number",
73 7282a033 Gerd Hoffmann
        },{
74 e9b2e818 Kevin Wolf
            .name = "rerror",
75 e9b2e818 Kevin Wolf
            .type = QEMU_OPT_STRING,
76 69d7e218 Luiz Capitulino
            .help = "read error action",
77 e9b2e818 Kevin Wolf
        },{
78 7282a033 Gerd Hoffmann
            .name = "werror",
79 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
80 69d7e218 Luiz Capitulino
            .help = "write error action",
81 7282a033 Gerd Hoffmann
        },{
82 7282a033 Gerd Hoffmann
            .name = "addr",
83 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
84 7282a033 Gerd Hoffmann
            .help = "pci address (virtio only)",
85 59f2689d Naphtali Sprei
        },{
86 59f2689d Naphtali Sprei
            .name = "readonly",
87 59f2689d Naphtali Sprei
            .type = QEMU_OPT_BOOL,
88 69d7e218 Luiz Capitulino
            .help = "open drive file as read-only",
89 0563e191 Zhi Yong Wu
        },{
90 0563e191 Zhi Yong Wu
            .name = "iops",
91 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
92 0563e191 Zhi Yong Wu
            .help = "limit total I/O operations per second",
93 0563e191 Zhi Yong Wu
        },{
94 0563e191 Zhi Yong Wu
            .name = "iops_rd",
95 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
96 0563e191 Zhi Yong Wu
            .help = "limit read operations per second",
97 0563e191 Zhi Yong Wu
        },{
98 0563e191 Zhi Yong Wu
            .name = "iops_wr",
99 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
100 0563e191 Zhi Yong Wu
            .help = "limit write operations per second",
101 0563e191 Zhi Yong Wu
        },{
102 0563e191 Zhi Yong Wu
            .name = "bps",
103 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
104 0563e191 Zhi Yong Wu
            .help = "limit total bytes per second",
105 0563e191 Zhi Yong Wu
        },{
106 0563e191 Zhi Yong Wu
            .name = "bps_rd",
107 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
108 0563e191 Zhi Yong Wu
            .help = "limit read bytes per second",
109 0563e191 Zhi Yong Wu
        },{
110 0563e191 Zhi Yong Wu
            .name = "bps_wr",
111 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
112 0563e191 Zhi Yong Wu
            .help = "limit write bytes per second",
113 fb0490f6 Stefan Hajnoczi
        },{
114 fb0490f6 Stefan Hajnoczi
            .name = "copy-on-read",
115 fb0490f6 Stefan Hajnoczi
            .type = QEMU_OPT_BOOL,
116 fb0490f6 Stefan Hajnoczi
            .help = "copy read data from backing file into image file",
117 7282a033 Gerd Hoffmann
        },
118 26056e0c Jes Sorensen
        { /* end of list */ }
119 7282a033 Gerd Hoffmann
    },
120 7282a033 Gerd Hoffmann
};
121 7282a033 Gerd Hoffmann
122 f9dadc98 Ronnie Sahlberg
static QemuOptsList qemu_iscsi_opts = {
123 f9dadc98 Ronnie Sahlberg
    .name = "iscsi",
124 f9dadc98 Ronnie Sahlberg
    .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
125 f9dadc98 Ronnie Sahlberg
    .desc = {
126 f9dadc98 Ronnie Sahlberg
        {
127 f9dadc98 Ronnie Sahlberg
            .name = "user",
128 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
129 f9dadc98 Ronnie Sahlberg
            .help = "username for CHAP authentication to target",
130 f9dadc98 Ronnie Sahlberg
        },{
131 f9dadc98 Ronnie Sahlberg
            .name = "password",
132 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
133 f9dadc98 Ronnie Sahlberg
            .help = "password for CHAP authentication to target",
134 f9dadc98 Ronnie Sahlberg
        },{
135 f9dadc98 Ronnie Sahlberg
            .name = "header-digest",
136 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
137 f9dadc98 Ronnie Sahlberg
            .help = "HeaderDigest setting. "
138 f9dadc98 Ronnie Sahlberg
                    "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
139 f9dadc98 Ronnie Sahlberg
        },{
140 f9dadc98 Ronnie Sahlberg
            .name = "initiator-name",
141 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
142 f9dadc98 Ronnie Sahlberg
            .help = "Initiator iqn name to use when connecting",
143 f9dadc98 Ronnie Sahlberg
        },
144 f9dadc98 Ronnie Sahlberg
        { /* end of list */ }
145 f9dadc98 Ronnie Sahlberg
    },
146 f9dadc98 Ronnie Sahlberg
};
147 f9dadc98 Ronnie Sahlberg
148 3329f07b Gerd Hoffmann
static QemuOptsList qemu_chardev_opts = {
149 191bc01b Gerd Hoffmann
    .name = "chardev",
150 8212c64f Markus Armbruster
    .implied_opt_name = "backend",
151 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
152 191bc01b Gerd Hoffmann
    .desc = {
153 7d31544f Gerd Hoffmann
        {
154 7d31544f Gerd Hoffmann
            .name = "backend",
155 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
156 7d31544f Gerd Hoffmann
        },{
157 7d31544f Gerd Hoffmann
            .name = "path",
158 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
159 aeb2c47a Gerd Hoffmann
        },{
160 aeb2c47a Gerd Hoffmann
            .name = "host",
161 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
162 aeb2c47a Gerd Hoffmann
        },{
163 aeb2c47a Gerd Hoffmann
            .name = "port",
164 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
165 aeb2c47a Gerd Hoffmann
        },{
166 7e1b35b4 Gerd Hoffmann
            .name = "localaddr",
167 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
168 7e1b35b4 Gerd Hoffmann
        },{
169 7e1b35b4 Gerd Hoffmann
            .name = "localport",
170 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
171 7e1b35b4 Gerd Hoffmann
        },{
172 aeb2c47a Gerd Hoffmann
            .name = "to",
173 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
174 aeb2c47a Gerd Hoffmann
        },{
175 aeb2c47a Gerd Hoffmann
            .name = "ipv4",
176 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
177 aeb2c47a Gerd Hoffmann
        },{
178 aeb2c47a Gerd Hoffmann
            .name = "ipv6",
179 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
180 aeb2c47a Gerd Hoffmann
        },{
181 aeb2c47a Gerd Hoffmann
            .name = "wait",
182 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
183 aeb2c47a Gerd Hoffmann
        },{
184 aeb2c47a Gerd Hoffmann
            .name = "server",
185 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
186 aeb2c47a Gerd Hoffmann
        },{
187 aeb2c47a Gerd Hoffmann
            .name = "delay",
188 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
189 aeb2c47a Gerd Hoffmann
        },{
190 aeb2c47a Gerd Hoffmann
            .name = "telnet",
191 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
192 6ea314d9 Gerd Hoffmann
        },{
193 6ea314d9 Gerd Hoffmann
            .name = "width",
194 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
195 6ea314d9 Gerd Hoffmann
        },{
196 6ea314d9 Gerd Hoffmann
            .name = "height",
197 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
198 6ea314d9 Gerd Hoffmann
        },{
199 6ea314d9 Gerd Hoffmann
            .name = "cols",
200 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
201 6ea314d9 Gerd Hoffmann
        },{
202 6ea314d9 Gerd Hoffmann
            .name = "rows",
203 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
204 c845f401 Gerd Hoffmann
        },{
205 c845f401 Gerd Hoffmann
            .name = "mux",
206 c845f401 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
207 5989020b Kusanagi Kouichi
        },{
208 5989020b Kusanagi Kouichi
            .name = "signal",
209 5989020b Kusanagi Kouichi
            .type = QEMU_OPT_BOOL,
210 cbcc6336 Alon Levy
        },{
211 cbcc6336 Alon Levy
            .name = "name",
212 cbcc6336 Alon Levy
            .type = QEMU_OPT_STRING,
213 cbcc6336 Alon Levy
        },{
214 cbcc6336 Alon Levy
            .name = "debug",
215 cbcc6336 Alon Levy
            .type = QEMU_OPT_NUMBER,
216 7d31544f Gerd Hoffmann
        },
217 26056e0c Jes Sorensen
        { /* end of list */ }
218 191bc01b Gerd Hoffmann
    },
219 191bc01b Gerd Hoffmann
};
220 191bc01b Gerd Hoffmann
221 74db920c Gautham R Shenoy
QemuOptsList qemu_fsdev_opts = {
222 74db920c Gautham R Shenoy
    .name = "fsdev",
223 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
224 74db920c Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_fsdev_opts.head),
225 74db920c Gautham R Shenoy
    .desc = {
226 74db920c Gautham R Shenoy
        {
227 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
228 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
229 74db920c Gautham R Shenoy
        }, {
230 74db920c Gautham R Shenoy
            .name = "path",
231 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
232 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
233 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
234 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
235 d3ab98e6 Aneesh Kumar K.V
        }, {
236 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
237 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
238 2c74c2cb M. Mohan Kumar
        }, {
239 2c74c2cb M. Mohan Kumar
            .name = "readonly",
240 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
241 84a87cc4 M. Mohan Kumar
242 84a87cc4 M. Mohan Kumar
        }, {
243 84a87cc4 M. Mohan Kumar
            .name = "socket",
244 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
245 4c793dda M. Mohan Kumar
        }, {
246 4c793dda M. Mohan Kumar
            .name = "sock_fd",
247 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
248 74db920c Gautham R Shenoy
        },
249 2c74c2cb M. Mohan Kumar
250 74db920c Gautham R Shenoy
        { /*End of list */ }
251 74db920c Gautham R Shenoy
    },
252 74db920c Gautham R Shenoy
};
253 74db920c Gautham R Shenoy
254 3d54abc7 Gautham R Shenoy
QemuOptsList qemu_virtfs_opts = {
255 3d54abc7 Gautham R Shenoy
    .name = "virtfs",
256 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
257 3d54abc7 Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_virtfs_opts.head),
258 3d54abc7 Gautham R Shenoy
    .desc = {
259 3d54abc7 Gautham R Shenoy
        {
260 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
261 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
262 3d54abc7 Gautham R Shenoy
        }, {
263 3d54abc7 Gautham R Shenoy
            .name = "path",
264 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
265 3d54abc7 Gautham R Shenoy
        }, {
266 3d54abc7 Gautham R Shenoy
            .name = "mount_tag",
267 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
268 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
269 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
270 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
271 d3ab98e6 Aneesh Kumar K.V
        }, {
272 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
273 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
274 2c74c2cb M. Mohan Kumar
        }, {
275 2c74c2cb M. Mohan Kumar
            .name = "readonly",
276 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
277 4c793dda M. Mohan Kumar
        }, {
278 84a87cc4 M. Mohan Kumar
            .name = "socket",
279 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
280 84a87cc4 M. Mohan Kumar
        }, {
281 4c793dda M. Mohan Kumar
            .name = "sock_fd",
282 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
283 3d54abc7 Gautham R Shenoy
        },
284 3d54abc7 Gautham R Shenoy
285 3d54abc7 Gautham R Shenoy
        { /*End of list */ }
286 3d54abc7 Gautham R Shenoy
    },
287 3d54abc7 Gautham R Shenoy
};
288 3d54abc7 Gautham R Shenoy
289 3329f07b Gerd Hoffmann
static QemuOptsList qemu_device_opts = {
290 f31d07d1 Gerd Hoffmann
    .name = "device",
291 8212c64f Markus Armbruster
    .implied_opt_name = "driver",
292 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head),
293 f31d07d1 Gerd Hoffmann
    .desc = {
294 f31d07d1 Gerd Hoffmann
        /*
295 f31d07d1 Gerd Hoffmann
         * no elements => accept any
296 f31d07d1 Gerd Hoffmann
         * sanity checking will happen later
297 f31d07d1 Gerd Hoffmann
         * when setting device properties
298 f31d07d1 Gerd Hoffmann
         */
299 26056e0c Jes Sorensen
        { /* end of list */ }
300 f31d07d1 Gerd Hoffmann
    },
301 f31d07d1 Gerd Hoffmann
};
302 f31d07d1 Gerd Hoffmann
303 3329f07b Gerd Hoffmann
static QemuOptsList qemu_netdev_opts = {
304 a1ea458f Mark McLoughlin
    .name = "netdev",
305 8212c64f Markus Armbruster
    .implied_opt_name = "type",
306 a1ea458f Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head),
307 a1ea458f Mark McLoughlin
    .desc = {
308 a1ea458f Mark McLoughlin
        /*
309 a1ea458f Mark McLoughlin
         * no elements => accept any params
310 a1ea458f Mark McLoughlin
         * validation will happen later
311 a1ea458f Mark McLoughlin
         */
312 a1ea458f Mark McLoughlin
        { /* end of list */ }
313 a1ea458f Mark McLoughlin
    },
314 a1ea458f Mark McLoughlin
};
315 a1ea458f Mark McLoughlin
316 3329f07b Gerd Hoffmann
static QemuOptsList qemu_net_opts = {
317 8119b33d Mark McLoughlin
    .name = "net",
318 8212c64f Markus Armbruster
    .implied_opt_name = "type",
319 8119b33d Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
320 8119b33d Mark McLoughlin
    .desc = {
321 8119b33d Mark McLoughlin
        /*
322 8119b33d Mark McLoughlin
         * no elements => accept any params
323 8119b33d Mark McLoughlin
         * validation will happen later
324 8119b33d Mark McLoughlin
         */
325 8119b33d Mark McLoughlin
        { /* end of list */ }
326 8119b33d Mark McLoughlin
    },
327 8119b33d Mark McLoughlin
};
328 8119b33d Mark McLoughlin
329 3329f07b Gerd Hoffmann
static QemuOptsList qemu_rtc_opts = {
330 1ed2fc1f Jan Kiszka
    .name = "rtc",
331 1ed2fc1f Jan Kiszka
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
332 1ed2fc1f Jan Kiszka
    .desc = {
333 1ed2fc1f Jan Kiszka
        {
334 1ed2fc1f Jan Kiszka
            .name = "base",
335 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
336 6875204c Jan Kiszka
        },{
337 6875204c Jan Kiszka
            .name = "clock",
338 6875204c Jan Kiszka
            .type = QEMU_OPT_STRING,
339 1ed2fc1f Jan Kiszka
        },{
340 1ed2fc1f Jan Kiszka
            .name = "driftfix",
341 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
342 1ed2fc1f Jan Kiszka
        },
343 26056e0c Jes Sorensen
        { /* end of list */ }
344 1ed2fc1f Jan Kiszka
    },
345 1ed2fc1f Jan Kiszka
};
346 1ed2fc1f Jan Kiszka
347 3329f07b Gerd Hoffmann
static QemuOptsList qemu_global_opts = {
348 d0fef6fb Gerd Hoffmann
    .name = "global",
349 d0fef6fb Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head),
350 d0fef6fb Gerd Hoffmann
    .desc = {
351 d0fef6fb Gerd Hoffmann
        {
352 d0fef6fb Gerd Hoffmann
            .name = "driver",
353 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
354 d0fef6fb Gerd Hoffmann
        },{
355 d0fef6fb Gerd Hoffmann
            .name = "property",
356 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
357 d0fef6fb Gerd Hoffmann
        },{
358 d0fef6fb Gerd Hoffmann
            .name = "value",
359 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
360 d0fef6fb Gerd Hoffmann
        },
361 26056e0c Jes Sorensen
        { /* end of list */ }
362 d0fef6fb Gerd Hoffmann
    },
363 d0fef6fb Gerd Hoffmann
};
364 d0fef6fb Gerd Hoffmann
365 7d76ad4f Eduardo Otubo
QemuOptsList qemu_sandbox_opts = {
366 7d76ad4f Eduardo Otubo
    .name = "sandbox",
367 7d76ad4f Eduardo Otubo
    .implied_opt_name = "enable",
368 7d76ad4f Eduardo Otubo
    .head = QTAILQ_HEAD_INITIALIZER(qemu_sandbox_opts.head),
369 7d76ad4f Eduardo Otubo
    .desc = {
370 7d76ad4f Eduardo Otubo
        {
371 7d76ad4f Eduardo Otubo
            .name = "enable",
372 7d76ad4f Eduardo Otubo
            .type = QEMU_OPT_BOOL,
373 7d76ad4f Eduardo Otubo
        },
374 7d76ad4f Eduardo Otubo
        { /* end of list */ }
375 7d76ad4f Eduardo Otubo
    },
376 7d76ad4f Eduardo Otubo
};
377 7d76ad4f Eduardo Otubo
378 3329f07b Gerd Hoffmann
static QemuOptsList qemu_mon_opts = {
379 88589343 Gerd Hoffmann
    .name = "mon",
380 8212c64f Markus Armbruster
    .implied_opt_name = "chardev",
381 88589343 Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
382 88589343 Gerd Hoffmann
    .desc = {
383 88589343 Gerd Hoffmann
        {
384 88589343 Gerd Hoffmann
            .name = "mode",
385 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
386 88589343 Gerd Hoffmann
        },{
387 88589343 Gerd Hoffmann
            .name = "chardev",
388 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
389 88589343 Gerd Hoffmann
        },{
390 88589343 Gerd Hoffmann
            .name = "default",
391 88589343 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
392 39eaab9a Daniel P. Berrange
        },{
393 39eaab9a Daniel P. Berrange
            .name = "pretty",
394 39eaab9a Daniel P. Berrange
            .type = QEMU_OPT_BOOL,
395 88589343 Gerd Hoffmann
        },
396 26056e0c Jes Sorensen
        { /* end of list */ }
397 88589343 Gerd Hoffmann
    },
398 88589343 Gerd Hoffmann
};
399 88589343 Gerd Hoffmann
400 ab6540d5 Prerna Saxena
static QemuOptsList qemu_trace_opts = {
401 ab6540d5 Prerna Saxena
    .name = "trace",
402 ab6540d5 Prerna Saxena
    .implied_opt_name = "trace",
403 ab6540d5 Prerna Saxena
    .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
404 ab6540d5 Prerna Saxena
    .desc = {
405 ab6540d5 Prerna Saxena
        {
406 23d15e86 Lluรญs
            .name = "events",
407 23d15e86 Lluรญs
            .type = QEMU_OPT_STRING,
408 23d15e86 Lluรญs
        },{
409 ab6540d5 Prerna Saxena
            .name = "file",
410 ab6540d5 Prerna Saxena
            .type = QEMU_OPT_STRING,
411 ab6540d5 Prerna Saxena
        },
412 44bd6907 Gerd Hoffmann
        { /* end of list */ }
413 ab6540d5 Prerna Saxena
    },
414 ab6540d5 Prerna Saxena
};
415 ab6540d5 Prerna Saxena
416 3329f07b Gerd Hoffmann
static QemuOptsList qemu_cpudef_opts = {
417 b5ec5ce0 john cooper
    .name = "cpudef",
418 b5ec5ce0 john cooper
    .head = QTAILQ_HEAD_INITIALIZER(qemu_cpudef_opts.head),
419 b5ec5ce0 john cooper
    .desc = {
420 b5ec5ce0 john cooper
        {
421 b5ec5ce0 john cooper
            .name = "name",
422 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
423 b5ec5ce0 john cooper
        },{
424 b5ec5ce0 john cooper
            .name = "level",
425 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
426 b5ec5ce0 john cooper
        },{
427 b5ec5ce0 john cooper
            .name = "vendor",
428 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
429 b5ec5ce0 john cooper
        },{
430 b5ec5ce0 john cooper
            .name = "family",
431 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
432 b5ec5ce0 john cooper
        },{
433 b5ec5ce0 john cooper
            .name = "model",
434 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
435 b5ec5ce0 john cooper
        },{
436 b5ec5ce0 john cooper
            .name = "stepping",
437 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
438 b5ec5ce0 john cooper
        },{
439 b5ec5ce0 john cooper
            .name = "feature_edx",      /* cpuid 0000_0001.edx */
440 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
441 b5ec5ce0 john cooper
        },{
442 b5ec5ce0 john cooper
            .name = "feature_ecx",      /* cpuid 0000_0001.ecx */
443 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
444 b5ec5ce0 john cooper
        },{
445 b5ec5ce0 john cooper
            .name = "extfeature_edx",   /* cpuid 8000_0001.edx */
446 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
447 b5ec5ce0 john cooper
        },{
448 b5ec5ce0 john cooper
            .name = "extfeature_ecx",   /* cpuid 8000_0001.ecx */
449 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
450 b5ec5ce0 john cooper
        },{
451 b5ec5ce0 john cooper
            .name = "xlevel",
452 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
453 b5ec5ce0 john cooper
        },{
454 b5ec5ce0 john cooper
            .name = "model_id",
455 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
456 b5ec5ce0 john cooper
        },{
457 b5ec5ce0 john cooper
            .name = "vendor_override",
458 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
459 b5ec5ce0 john cooper
        },
460 b5ec5ce0 john cooper
        { /* end of list */ }
461 b5ec5ce0 john cooper
    },
462 b5ec5ce0 john cooper
};
463 b5ec5ce0 john cooper
464 29b0040b Gerd Hoffmann
QemuOptsList qemu_spice_opts = {
465 29b0040b Gerd Hoffmann
    .name = "spice",
466 29b0040b Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head),
467 29b0040b Gerd Hoffmann
    .desc = {
468 29b0040b Gerd Hoffmann
        {
469 29b0040b Gerd Hoffmann
            .name = "port",
470 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
471 29b0040b Gerd Hoffmann
        },{
472 c448e855 Gerd Hoffmann
            .name = "tls-port",
473 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
474 c448e855 Gerd Hoffmann
        },{
475 333b0eeb Gerd Hoffmann
            .name = "addr",
476 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
477 333b0eeb Gerd Hoffmann
        },{
478 333b0eeb Gerd Hoffmann
            .name = "ipv4",
479 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
480 333b0eeb Gerd Hoffmann
        },{
481 333b0eeb Gerd Hoffmann
            .name = "ipv6",
482 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
483 333b0eeb Gerd Hoffmann
        },{
484 29b0040b Gerd Hoffmann
            .name = "password",
485 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_STRING,
486 29b0040b Gerd Hoffmann
        },{
487 29b0040b Gerd Hoffmann
            .name = "disable-ticketing",
488 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
489 c448e855 Gerd Hoffmann
        },{
490 d4970b07 Hans de Goede
            .name = "disable-copy-paste",
491 d4970b07 Hans de Goede
            .type = QEMU_OPT_BOOL,
492 d4970b07 Hans de Goede
        },{
493 48b3ed0a Marc-Andrรฉ Lureau
            .name = "sasl",
494 48b3ed0a Marc-Andrรฉ Lureau
            .type = QEMU_OPT_BOOL,
495 48b3ed0a Marc-Andrรฉ Lureau
        },{
496 c448e855 Gerd Hoffmann
            .name = "x509-dir",
497 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
498 c448e855 Gerd Hoffmann
        },{
499 c448e855 Gerd Hoffmann
            .name = "x509-key-file",
500 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
501 c448e855 Gerd Hoffmann
        },{
502 c448e855 Gerd Hoffmann
            .name = "x509-key-password",
503 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
504 c448e855 Gerd Hoffmann
        },{
505 c448e855 Gerd Hoffmann
            .name = "x509-cert-file",
506 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
507 c448e855 Gerd Hoffmann
        },{
508 c448e855 Gerd Hoffmann
            .name = "x509-cacert-file",
509 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
510 c448e855 Gerd Hoffmann
        },{
511 c448e855 Gerd Hoffmann
            .name = "x509-dh-key-file",
512 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
513 c448e855 Gerd Hoffmann
        },{
514 c448e855 Gerd Hoffmann
            .name = "tls-ciphers",
515 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
516 9f04e09e Yonit Halperin
        },{
517 17b6dea0 Gerd Hoffmann
            .name = "tls-channel",
518 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
519 17b6dea0 Gerd Hoffmann
        },{
520 17b6dea0 Gerd Hoffmann
            .name = "plaintext-channel",
521 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
522 17b6dea0 Gerd Hoffmann
        },{
523 9f04e09e Yonit Halperin
            .name = "image-compression",
524 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
525 9f04e09e Yonit Halperin
        },{
526 9f04e09e Yonit Halperin
            .name = "jpeg-wan-compression",
527 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
528 9f04e09e Yonit Halperin
        },{
529 9f04e09e Yonit Halperin
            .name = "zlib-glz-wan-compression",
530 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
531 84a23f25 Gerd Hoffmann
        },{
532 84a23f25 Gerd Hoffmann
            .name = "streaming-video",
533 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
534 84a23f25 Gerd Hoffmann
        },{
535 84a23f25 Gerd Hoffmann
            .name = "agent-mouse",
536 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
537 84a23f25 Gerd Hoffmann
        },{
538 84a23f25 Gerd Hoffmann
            .name = "playback-compression",
539 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
540 8c957053 Yonit Halperin
        }, {
541 8c957053 Yonit Halperin
            .name = "seamless-migration",
542 8c957053 Yonit Halperin
            .type = QEMU_OPT_BOOL,
543 29b0040b Gerd Hoffmann
        },
544 44bd6907 Gerd Hoffmann
        { /* end of list */ }
545 29b0040b Gerd Hoffmann
    },
546 29b0040b Gerd Hoffmann
};
547 29b0040b Gerd Hoffmann
548 2e55e842 Gleb Natapov
QemuOptsList qemu_option_rom_opts = {
549 2e55e842 Gleb Natapov
    .name = "option-rom",
550 2e55e842 Gleb Natapov
    .implied_opt_name = "romfile",
551 2e55e842 Gleb Natapov
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
552 2e55e842 Gleb Natapov
    .desc = {
553 2e55e842 Gleb Natapov
        {
554 2e55e842 Gleb Natapov
            .name = "bootindex",
555 2e55e842 Gleb Natapov
            .type = QEMU_OPT_NUMBER,
556 2e55e842 Gleb Natapov
        }, {
557 2e55e842 Gleb Natapov
            .name = "romfile",
558 2e55e842 Gleb Natapov
            .type = QEMU_OPT_STRING,
559 2e55e842 Gleb Natapov
        },
560 44bd6907 Gerd Hoffmann
        { /* end of list */ }
561 2e55e842 Gleb Natapov
    },
562 2e55e842 Gleb Natapov
};
563 2e55e842 Gleb Natapov
564 303d4e86 Anthony PERARD
static QemuOptsList qemu_machine_opts = {
565 303d4e86 Anthony PERARD
    .name = "machine",
566 9052ea6b Jan Kiszka
    .implied_opt_name = "type",
567 9de36b1a Peter Maydell
    .merge_lists = true,
568 303d4e86 Anthony PERARD
    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
569 303d4e86 Anthony PERARD
    .desc = {
570 303d4e86 Anthony PERARD
        {
571 9052ea6b Jan Kiszka
            .name = "type",
572 9052ea6b Jan Kiszka
            .type = QEMU_OPT_STRING,
573 9052ea6b Jan Kiszka
            .help = "emulated machine"
574 9052ea6b Jan Kiszka
        }, {
575 303d4e86 Anthony PERARD
            .name = "accel",
576 303d4e86 Anthony PERARD
            .type = QEMU_OPT_STRING,
577 303d4e86 Anthony PERARD
            .help = "accelerator list",
578 6a48ffaa Jan Kiszka
        }, {
579 6a48ffaa Jan Kiszka
            .name = "kernel_irqchip",
580 6a48ffaa Jan Kiszka
            .type = QEMU_OPT_BOOL,
581 6a48ffaa Jan Kiszka
            .help = "use KVM in-kernel irqchip",
582 39d6960a Jan Kiszka
        }, {
583 39d6960a Jan Kiszka
            .name = "kvm_shadow_mem",
584 39d6960a Jan Kiszka
            .type = QEMU_OPT_SIZE,
585 39d6960a Jan Kiszka
            .help = "KVM shadow MMU size",
586 a0abe474 Peter Maydell
        }, {
587 a0abe474 Peter Maydell
            .name = "kernel",
588 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
589 a0abe474 Peter Maydell
            .help = "Linux kernel image file",
590 a0abe474 Peter Maydell
        }, {
591 a0abe474 Peter Maydell
            .name = "initrd",
592 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
593 a0abe474 Peter Maydell
            .help = "Linux initial ramdisk file",
594 a0abe474 Peter Maydell
        }, {
595 a0abe474 Peter Maydell
            .name = "append",
596 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
597 a0abe474 Peter Maydell
            .help = "Linux kernel command line",
598 412beee6 Grant Likely
        }, {
599 412beee6 Grant Likely
            .name = "dtb",
600 412beee6 Grant Likely
            .type = QEMU_OPT_STRING,
601 412beee6 Grant Likely
            .help = "Linux kernel device tree file",
602 25b42708 Alexander Graf
        }, {
603 25b42708 Alexander Graf
            .name = "dumpdtb",
604 25b42708 Alexander Graf
            .type = QEMU_OPT_STRING,
605 25b42708 Alexander Graf
            .help = "Dump current dtb to a file and quit",
606 4b1b1c89 Alexander Graf
        }, {
607 4b1b1c89 Alexander Graf
            .name = "phandle_start",
608 4b1b1c89 Alexander Graf
            .type = QEMU_OPT_STRING,
609 4b1b1c89 Alexander Graf
            .help = "The first phandle ID we may generate dynamically",
610 caedc737 Alexander Graf
        }, {
611 caedc737 Alexander Graf
            .name = "dt_compatible",
612 caedc737 Alexander Graf
            .type = QEMU_OPT_STRING,
613 caedc737 Alexander Graf
            .help = "Overrides the \"compatible\" property of the dt root node",
614 ddb97f1d Jason Baron
        }, {
615 ddb97f1d Jason Baron
            .name = "dump-guest-core",
616 ddb97f1d Jason Baron
            .type = QEMU_OPT_BOOL,
617 ddb97f1d Jason Baron
            .help = "Include guest memory in  a core dump",
618 8490fc78 Luiz Capitulino
        }, {
619 8490fc78 Luiz Capitulino
            .name = "mem-merge",
620 8490fc78 Luiz Capitulino
            .type = QEMU_OPT_BOOL,
621 8490fc78 Luiz Capitulino
            .help = "enable/disable memory merge support",
622 303d4e86 Anthony PERARD
        },
623 303d4e86 Anthony PERARD
        { /* End of list */ }
624 303d4e86 Anthony PERARD
    },
625 303d4e86 Anthony PERARD
};
626 303d4e86 Anthony PERARD
627 3d3b8303 wayne
QemuOptsList qemu_boot_opts = {
628 3d3b8303 wayne
    .name = "boot-opts",
629 3d3b8303 wayne
    .head = QTAILQ_HEAD_INITIALIZER(qemu_boot_opts.head),
630 3d3b8303 wayne
    .desc = {
631 3d3b8303 wayne
        /* the three names below are not used now */
632 3d3b8303 wayne
        {
633 3d3b8303 wayne
            .name = "order",
634 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
635 3d3b8303 wayne
        }, {
636 3d3b8303 wayne
            .name = "once",
637 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
638 3d3b8303 wayne
        }, {
639 3d3b8303 wayne
            .name = "menu",
640 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
641 3d3b8303 wayne
        /* following are really used */
642 3d3b8303 wayne
        }, {
643 3d3b8303 wayne
            .name = "splash",
644 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
645 3d3b8303 wayne
        }, {
646 3d3b8303 wayne
            .name = "splash-time",
647 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
648 ac05f349 Amos Kong
        }, {
649 ac05f349 Amos Kong
            .name = "reboot-timeout",
650 ac05f349 Amos Kong
            .type = QEMU_OPT_STRING,
651 3d3b8303 wayne
        },
652 3d3b8303 wayne
        { /*End of list */ }
653 3d3b8303 wayne
    },
654 3d3b8303 wayne
};
655 3d3b8303 wayne
656 dfe795e7 Gerd Hoffmann
static QemuOptsList *vm_config_groups[32] = {
657 d058fe03 Gerd Hoffmann
    &qemu_drive_opts,
658 191bc01b Gerd Hoffmann
    &qemu_chardev_opts,
659 f31d07d1 Gerd Hoffmann
    &qemu_device_opts,
660 a1ea458f Mark McLoughlin
    &qemu_netdev_opts,
661 8119b33d Mark McLoughlin
    &qemu_net_opts,
662 5fdfbf7e Jan Kiszka
    &qemu_rtc_opts,
663 d0fef6fb Gerd Hoffmann
    &qemu_global_opts,
664 88589343 Gerd Hoffmann
    &qemu_mon_opts,
665 b5ec5ce0 john cooper
    &qemu_cpudef_opts,
666 ab6540d5 Prerna Saxena
    &qemu_trace_opts,
667 2e55e842 Gleb Natapov
    &qemu_option_rom_opts,
668 303d4e86 Anthony PERARD
    &qemu_machine_opts,
669 3d3b8303 wayne
    &qemu_boot_opts,
670 f9dadc98 Ronnie Sahlberg
    &qemu_iscsi_opts,
671 7d76ad4f Eduardo Otubo
    &qemu_sandbox_opts,
672 d058fe03 Gerd Hoffmann
    NULL,
673 d058fe03 Gerd Hoffmann
};
674 d058fe03 Gerd Hoffmann
675 2ac20613 Luiz Capitulino
static QemuOptsList *find_list(QemuOptsList **lists, const char *group,
676 2ac20613 Luiz Capitulino
                               Error **errp)
677 ddc97855 Gerd Hoffmann
{
678 ddc97855 Gerd Hoffmann
    int i;
679 ddc97855 Gerd Hoffmann
680 ddc97855 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
681 ddc97855 Gerd Hoffmann
        if (strcmp(lists[i]->name, group) == 0)
682 ddc97855 Gerd Hoffmann
            break;
683 ddc97855 Gerd Hoffmann
    }
684 ddc97855 Gerd Hoffmann
    if (lists[i] == NULL) {
685 2ac20613 Luiz Capitulino
        error_set(errp, QERR_INVALID_OPTION_GROUP, group);
686 ddc97855 Gerd Hoffmann
    }
687 ddc97855 Gerd Hoffmann
    return lists[i];
688 ddc97855 Gerd Hoffmann
}
689 ddc97855 Gerd Hoffmann
690 490b648e Kevin Wolf
QemuOptsList *qemu_find_opts(const char *group)
691 490b648e Kevin Wolf
{
692 2ac20613 Luiz Capitulino
    QemuOptsList *ret;
693 2ac20613 Luiz Capitulino
    Error *local_err = NULL;
694 2ac20613 Luiz Capitulino
695 2ac20613 Luiz Capitulino
    ret = find_list(vm_config_groups, group, &local_err);
696 2ac20613 Luiz Capitulino
    if (error_is_set(&local_err)) {
697 2ac20613 Luiz Capitulino
        error_report("%s\n", error_get_pretty(local_err));
698 2ac20613 Luiz Capitulino
        error_free(local_err);
699 2ac20613 Luiz Capitulino
    }
700 2ac20613 Luiz Capitulino
701 2ac20613 Luiz Capitulino
    return ret;
702 490b648e Kevin Wolf
}
703 490b648e Kevin Wolf
704 60d5666f Luiz Capitulino
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
705 60d5666f Luiz Capitulino
{
706 60d5666f Luiz Capitulino
    return find_list(vm_config_groups, group, errp);
707 60d5666f Luiz Capitulino
}
708 60d5666f Luiz Capitulino
709 dfe795e7 Gerd Hoffmann
void qemu_add_opts(QemuOptsList *list)
710 dfe795e7 Gerd Hoffmann
{
711 dfe795e7 Gerd Hoffmann
    int entries, i;
712 dfe795e7 Gerd Hoffmann
713 dfe795e7 Gerd Hoffmann
    entries = ARRAY_SIZE(vm_config_groups);
714 dfe795e7 Gerd Hoffmann
    entries--; /* keep list NULL terminated */
715 dfe795e7 Gerd Hoffmann
    for (i = 0; i < entries; i++) {
716 dfe795e7 Gerd Hoffmann
        if (vm_config_groups[i] == NULL) {
717 dfe795e7 Gerd Hoffmann
            vm_config_groups[i] = list;
718 dfe795e7 Gerd Hoffmann
            return;
719 dfe795e7 Gerd Hoffmann
        }
720 dfe795e7 Gerd Hoffmann
    }
721 dfe795e7 Gerd Hoffmann
    fprintf(stderr, "ran out of space in vm_config_groups");
722 dfe795e7 Gerd Hoffmann
    abort();
723 dfe795e7 Gerd Hoffmann
}
724 dfe795e7 Gerd Hoffmann
725 d058fe03 Gerd Hoffmann
int qemu_set_option(const char *str)
726 d058fe03 Gerd Hoffmann
{
727 d058fe03 Gerd Hoffmann
    char group[64], id[64], arg[64];
728 ddc97855 Gerd Hoffmann
    QemuOptsList *list;
729 d058fe03 Gerd Hoffmann
    QemuOpts *opts;
730 ddc97855 Gerd Hoffmann
    int rc, offset;
731 d058fe03 Gerd Hoffmann
732 d058fe03 Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
733 d058fe03 Gerd Hoffmann
    if (rc < 3 || str[offset] != '=') {
734 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
735 d058fe03 Gerd Hoffmann
        return -1;
736 d058fe03 Gerd Hoffmann
    }
737 d058fe03 Gerd Hoffmann
738 304329ee Markus Armbruster
    list = qemu_find_opts(group);
739 ddc97855 Gerd Hoffmann
    if (list == NULL) {
740 d058fe03 Gerd Hoffmann
        return -1;
741 d058fe03 Gerd Hoffmann
    }
742 d058fe03 Gerd Hoffmann
743 ddc97855 Gerd Hoffmann
    opts = qemu_opts_find(list, id);
744 d058fe03 Gerd Hoffmann
    if (!opts) {
745 1ecda02b Markus Armbruster
        error_report("there is no %s \"%s\" defined",
746 1ecda02b Markus Armbruster
                     list->name, id);
747 d058fe03 Gerd Hoffmann
        return -1;
748 d058fe03 Gerd Hoffmann
    }
749 d058fe03 Gerd Hoffmann
750 3df04ac3 Mark McLoughlin
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
751 d058fe03 Gerd Hoffmann
        return -1;
752 d058fe03 Gerd Hoffmann
    }
753 d058fe03 Gerd Hoffmann
    return 0;
754 d058fe03 Gerd Hoffmann
}
755 d058fe03 Gerd Hoffmann
756 d0fef6fb Gerd Hoffmann
int qemu_global_option(const char *str)
757 d0fef6fb Gerd Hoffmann
{
758 d0fef6fb Gerd Hoffmann
    char driver[64], property[64];
759 d0fef6fb Gerd Hoffmann
    QemuOpts *opts;
760 d0fef6fb Gerd Hoffmann
    int rc, offset;
761 d0fef6fb Gerd Hoffmann
762 d0fef6fb Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
763 d0fef6fb Gerd Hoffmann
    if (rc < 2 || str[offset] != '=') {
764 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
765 d0fef6fb Gerd Hoffmann
        return -1;
766 d0fef6fb Gerd Hoffmann
    }
767 d0fef6fb Gerd Hoffmann
768 8be7e7e4 Luiz Capitulino
    opts = qemu_opts_create(&qemu_global_opts, NULL, 0, NULL);
769 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "driver", driver);
770 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "property", property);
771 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "value", str+offset+1);
772 d0fef6fb Gerd Hoffmann
    return 0;
773 d0fef6fb Gerd Hoffmann
}
774 d0fef6fb Gerd Hoffmann
775 9d993394 Gerd Hoffmann
struct ConfigWriteData {
776 9d993394 Gerd Hoffmann
    QemuOptsList *list;
777 9d993394 Gerd Hoffmann
    FILE *fp;
778 9d993394 Gerd Hoffmann
};
779 9d993394 Gerd Hoffmann
780 9d993394 Gerd Hoffmann
static int config_write_opt(const char *name, const char *value, void *opaque)
781 9d993394 Gerd Hoffmann
{
782 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
783 9d993394 Gerd Hoffmann
784 9d993394 Gerd Hoffmann
    fprintf(data->fp, "  %s = \"%s\"\n", name, value);
785 9d993394 Gerd Hoffmann
    return 0;
786 9d993394 Gerd Hoffmann
}
787 9d993394 Gerd Hoffmann
788 9d993394 Gerd Hoffmann
static int config_write_opts(QemuOpts *opts, void *opaque)
789 9d993394 Gerd Hoffmann
{
790 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
791 9d993394 Gerd Hoffmann
    const char *id = qemu_opts_id(opts);
792 9d993394 Gerd Hoffmann
793 9d993394 Gerd Hoffmann
    if (id) {
794 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
795 9d993394 Gerd Hoffmann
    } else {
796 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s]\n", data->list->name);
797 9d993394 Gerd Hoffmann
    }
798 9d993394 Gerd Hoffmann
    qemu_opt_foreach(opts, config_write_opt, data, 0);
799 9d993394 Gerd Hoffmann
    fprintf(data->fp, "\n");
800 9d993394 Gerd Hoffmann
    return 0;
801 9d993394 Gerd Hoffmann
}
802 9d993394 Gerd Hoffmann
803 9d993394 Gerd Hoffmann
void qemu_config_write(FILE *fp)
804 9d993394 Gerd Hoffmann
{
805 9d993394 Gerd Hoffmann
    struct ConfigWriteData data = { .fp = fp };
806 490b648e Kevin Wolf
    QemuOptsList **lists = vm_config_groups;
807 9d993394 Gerd Hoffmann
    int i;
808 9d993394 Gerd Hoffmann
809 9d993394 Gerd Hoffmann
    fprintf(fp, "# qemu config file\n\n");
810 9d993394 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
811 9d993394 Gerd Hoffmann
        data.list = lists[i];
812 9d993394 Gerd Hoffmann
        qemu_opts_foreach(data.list, config_write_opts, &data, 0);
813 9d993394 Gerd Hoffmann
    }
814 9d993394 Gerd Hoffmann
}
815 42262ba8 Gerd Hoffmann
816 490b648e Kevin Wolf
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
817 42262ba8 Gerd Hoffmann
{
818 42262ba8 Gerd Hoffmann
    char line[1024], group[64], id[64], arg[64], value[1024];
819 cf5a65aa Markus Armbruster
    Location loc;
820 42262ba8 Gerd Hoffmann
    QemuOptsList *list = NULL;
821 2ac20613 Luiz Capitulino
    Error *local_err = NULL;
822 42262ba8 Gerd Hoffmann
    QemuOpts *opts = NULL;
823 cf5a65aa Markus Armbruster
    int res = -1, lno = 0;
824 42262ba8 Gerd Hoffmann
825 cf5a65aa Markus Armbruster
    loc_push_none(&loc);
826 42262ba8 Gerd Hoffmann
    while (fgets(line, sizeof(line), fp) != NULL) {
827 cf5a65aa Markus Armbruster
        loc_set_file(fname, ++lno);
828 42262ba8 Gerd Hoffmann
        if (line[0] == '\n') {
829 42262ba8 Gerd Hoffmann
            /* skip empty lines */
830 42262ba8 Gerd Hoffmann
            continue;
831 42262ba8 Gerd Hoffmann
        }
832 42262ba8 Gerd Hoffmann
        if (line[0] == '#') {
833 42262ba8 Gerd Hoffmann
            /* comment */
834 42262ba8 Gerd Hoffmann
            continue;
835 42262ba8 Gerd Hoffmann
        }
836 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
837 42262ba8 Gerd Hoffmann
            /* group with id */
838 2ac20613 Luiz Capitulino
            list = find_list(lists, group, &local_err);
839 2ac20613 Luiz Capitulino
            if (error_is_set(&local_err)) {
840 2ac20613 Luiz Capitulino
                error_report("%s\n", error_get_pretty(local_err));
841 2ac20613 Luiz Capitulino
                error_free(local_err);
842 cf5a65aa Markus Armbruster
                goto out;
843 2ac20613 Luiz Capitulino
            }
844 8be7e7e4 Luiz Capitulino
            opts = qemu_opts_create(list, id, 1, NULL);
845 42262ba8 Gerd Hoffmann
            continue;
846 42262ba8 Gerd Hoffmann
        }
847 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63[^]]]", group) == 1) {
848 42262ba8 Gerd Hoffmann
            /* group without id */
849 2ac20613 Luiz Capitulino
            list = find_list(lists, group, &local_err);
850 2ac20613 Luiz Capitulino
            if (error_is_set(&local_err)) {
851 2ac20613 Luiz Capitulino
                error_report("%s\n", error_get_pretty(local_err));
852 2ac20613 Luiz Capitulino
                error_free(local_err);
853 cf5a65aa Markus Armbruster
                goto out;
854 2ac20613 Luiz Capitulino
            }
855 8be7e7e4 Luiz Capitulino
            opts = qemu_opts_create(list, NULL, 0, NULL);
856 42262ba8 Gerd Hoffmann
            continue;
857 42262ba8 Gerd Hoffmann
        }
858 42262ba8 Gerd Hoffmann
        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
859 42262ba8 Gerd Hoffmann
            /* arg = value */
860 42262ba8 Gerd Hoffmann
            if (opts == NULL) {
861 cf5a65aa Markus Armbruster
                error_report("no group defined");
862 cf5a65aa Markus Armbruster
                goto out;
863 42262ba8 Gerd Hoffmann
            }
864 42262ba8 Gerd Hoffmann
            if (qemu_opt_set(opts, arg, value) != 0) {
865 cf5a65aa Markus Armbruster
                goto out;
866 42262ba8 Gerd Hoffmann
            }
867 42262ba8 Gerd Hoffmann
            continue;
868 42262ba8 Gerd Hoffmann
        }
869 cf5a65aa Markus Armbruster
        error_report("parse error");
870 cf5a65aa Markus Armbruster
        goto out;
871 42262ba8 Gerd Hoffmann
    }
872 ef82516d Markus Armbruster
    if (ferror(fp)) {
873 ef82516d Markus Armbruster
        error_report("error reading file");
874 ef82516d Markus Armbruster
        goto out;
875 ef82516d Markus Armbruster
    }
876 cf5a65aa Markus Armbruster
    res = 0;
877 cf5a65aa Markus Armbruster
out:
878 cf5a65aa Markus Armbruster
    loc_pop(&loc);
879 cf5a65aa Markus Armbruster
    return res;
880 42262ba8 Gerd Hoffmann
}
881 dcfb0939 Kevin Wolf
882 dcfb0939 Kevin Wolf
int qemu_read_config_file(const char *filename)
883 dcfb0939 Kevin Wolf
{
884 dcfb0939 Kevin Wolf
    FILE *f = fopen(filename, "r");
885 019e78ba Kevin Wolf
    int ret;
886 019e78ba Kevin Wolf
887 dcfb0939 Kevin Wolf
    if (f == NULL) {
888 dcfb0939 Kevin Wolf
        return -errno;
889 dcfb0939 Kevin Wolf
    }
890 dcfb0939 Kevin Wolf
891 019e78ba Kevin Wolf
    ret = qemu_config_parse(f, vm_config_groups, filename);
892 dcfb0939 Kevin Wolf
    fclose(f);
893 dcfb0939 Kevin Wolf
894 019e78ba Kevin Wolf
    if (ret == 0) {
895 019e78ba Kevin Wolf
        return 0;
896 019e78ba Kevin Wolf
    } else {
897 019e78ba Kevin Wolf
        return -EINVAL;
898 019e78ba Kevin Wolf
    }
899 dcfb0939 Kevin Wolf
}