Statistics
| Branch: | Revision:

root / qemu-config.c @ a08784dd

History | View | Annotate | Download (16.7 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 7282a033 Gerd Hoffmann
7 3329f07b Gerd Hoffmann
static QemuOptsList qemu_drive_opts = {
8 7282a033 Gerd Hoffmann
    .name = "drive",
9 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
10 7282a033 Gerd Hoffmann
    .desc = {
11 7282a033 Gerd Hoffmann
        {
12 7282a033 Gerd Hoffmann
            .name = "bus",
13 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
14 7282a033 Gerd Hoffmann
            .help = "bus number",
15 7282a033 Gerd Hoffmann
        },{
16 7282a033 Gerd Hoffmann
            .name = "unit",
17 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
18 7282a033 Gerd Hoffmann
            .help = "unit number (i.e. lun for scsi)",
19 7282a033 Gerd Hoffmann
        },{
20 7282a033 Gerd Hoffmann
            .name = "if",
21 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
22 7282a033 Gerd Hoffmann
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
23 7282a033 Gerd Hoffmann
        },{
24 7282a033 Gerd Hoffmann
            .name = "index",
25 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
26 7282a033 Gerd Hoffmann
        },{
27 7282a033 Gerd Hoffmann
            .name = "cyls",
28 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
29 7282a033 Gerd Hoffmann
            .help = "number of cylinders (ide disk geometry)",
30 7282a033 Gerd Hoffmann
        },{
31 7282a033 Gerd Hoffmann
            .name = "heads",
32 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
33 7282a033 Gerd Hoffmann
            .help = "number of heads (ide disk geometry)",
34 7282a033 Gerd Hoffmann
        },{
35 7282a033 Gerd Hoffmann
            .name = "secs",
36 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
37 7282a033 Gerd Hoffmann
            .help = "number of sectors (ide disk geometry)",
38 7282a033 Gerd Hoffmann
        },{
39 7282a033 Gerd Hoffmann
            .name = "trans",
40 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
41 7282a033 Gerd Hoffmann
            .help = "chs translation (auto, lba. none)",
42 7282a033 Gerd Hoffmann
        },{
43 7282a033 Gerd Hoffmann
            .name = "media",
44 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
45 7282a033 Gerd Hoffmann
            .help = "media type (disk, cdrom)",
46 7282a033 Gerd Hoffmann
        },{
47 7282a033 Gerd Hoffmann
            .name = "snapshot",
48 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
49 7282a033 Gerd Hoffmann
        },{
50 7282a033 Gerd Hoffmann
            .name = "file",
51 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
52 7282a033 Gerd Hoffmann
            .help = "disk image",
53 7282a033 Gerd Hoffmann
        },{
54 7282a033 Gerd Hoffmann
            .name = "cache",
55 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
56 016f5cf6 Alexander Graf
            .help = "host cache usage (none, writeback, writethrough, unsafe)",
57 7282a033 Gerd Hoffmann
        },{
58 5c6c3a6c Christoph Hellwig
            .name = "aio",
59 5c6c3a6c Christoph Hellwig
            .type = QEMU_OPT_STRING,
60 5c6c3a6c Christoph Hellwig
            .help = "host AIO implementation (threads, native)",
61 5c6c3a6c Christoph Hellwig
        },{
62 7282a033 Gerd Hoffmann
            .name = "format",
63 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
64 7282a033 Gerd Hoffmann
            .help = "disk format (raw, qcow2, ...)",
65 7282a033 Gerd Hoffmann
        },{
66 7282a033 Gerd Hoffmann
            .name = "serial",
67 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
68 7282a033 Gerd Hoffmann
        },{
69 e9b2e818 Kevin Wolf
            .name = "rerror",
70 e9b2e818 Kevin Wolf
            .type = QEMU_OPT_STRING,
71 e9b2e818 Kevin Wolf
        },{
72 7282a033 Gerd Hoffmann
            .name = "werror",
73 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
74 7282a033 Gerd Hoffmann
        },{
75 7282a033 Gerd Hoffmann
            .name = "addr",
76 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
77 7282a033 Gerd Hoffmann
            .help = "pci address (virtio only)",
78 59f2689d Naphtali Sprei
        },{
79 59f2689d Naphtali Sprei
            .name = "readonly",
80 59f2689d Naphtali Sprei
            .type = QEMU_OPT_BOOL,
81 7282a033 Gerd Hoffmann
        },
82 26056e0c Jes Sorensen
        { /* end of list */ }
83 7282a033 Gerd Hoffmann
    },
84 7282a033 Gerd Hoffmann
};
85 7282a033 Gerd Hoffmann
86 3329f07b Gerd Hoffmann
static QemuOptsList qemu_chardev_opts = {
87 191bc01b Gerd Hoffmann
    .name = "chardev",
88 8212c64f Markus Armbruster
    .implied_opt_name = "backend",
89 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
90 191bc01b Gerd Hoffmann
    .desc = {
91 7d31544f Gerd Hoffmann
        {
92 7d31544f Gerd Hoffmann
            .name = "backend",
93 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
94 7d31544f Gerd Hoffmann
        },{
95 7d31544f Gerd Hoffmann
            .name = "path",
96 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
97 aeb2c47a Gerd Hoffmann
        },{
98 aeb2c47a Gerd Hoffmann
            .name = "host",
99 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
100 aeb2c47a Gerd Hoffmann
        },{
101 aeb2c47a Gerd Hoffmann
            .name = "port",
102 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
103 aeb2c47a Gerd Hoffmann
        },{
104 7e1b35b4 Gerd Hoffmann
            .name = "localaddr",
105 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
106 7e1b35b4 Gerd Hoffmann
        },{
107 7e1b35b4 Gerd Hoffmann
            .name = "localport",
108 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
109 7e1b35b4 Gerd Hoffmann
        },{
110 aeb2c47a Gerd Hoffmann
            .name = "to",
111 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
112 aeb2c47a Gerd Hoffmann
        },{
113 aeb2c47a Gerd Hoffmann
            .name = "ipv4",
114 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
115 aeb2c47a Gerd Hoffmann
        },{
116 aeb2c47a Gerd Hoffmann
            .name = "ipv6",
117 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
118 aeb2c47a Gerd Hoffmann
        },{
119 aeb2c47a Gerd Hoffmann
            .name = "wait",
120 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
121 aeb2c47a Gerd Hoffmann
        },{
122 aeb2c47a Gerd Hoffmann
            .name = "server",
123 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
124 aeb2c47a Gerd Hoffmann
        },{
125 aeb2c47a Gerd Hoffmann
            .name = "delay",
126 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
127 aeb2c47a Gerd Hoffmann
        },{
128 aeb2c47a Gerd Hoffmann
            .name = "telnet",
129 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
130 6ea314d9 Gerd Hoffmann
        },{
131 6ea314d9 Gerd Hoffmann
            .name = "width",
132 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
133 6ea314d9 Gerd Hoffmann
        },{
134 6ea314d9 Gerd Hoffmann
            .name = "height",
135 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
136 6ea314d9 Gerd Hoffmann
        },{
137 6ea314d9 Gerd Hoffmann
            .name = "cols",
138 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
139 6ea314d9 Gerd Hoffmann
        },{
140 6ea314d9 Gerd Hoffmann
            .name = "rows",
141 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
142 c845f401 Gerd Hoffmann
        },{
143 c845f401 Gerd Hoffmann
            .name = "mux",
144 c845f401 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
145 5989020b Kusanagi Kouichi
        },{
146 5989020b Kusanagi Kouichi
            .name = "signal",
147 5989020b Kusanagi Kouichi
            .type = QEMU_OPT_BOOL,
148 cbcc6336 Alon Levy
        },{
149 cbcc6336 Alon Levy
            .name = "name",
150 cbcc6336 Alon Levy
            .type = QEMU_OPT_STRING,
151 cbcc6336 Alon Levy
        },{
152 cbcc6336 Alon Levy
            .name = "debug",
153 cbcc6336 Alon Levy
            .type = QEMU_OPT_NUMBER,
154 7d31544f Gerd Hoffmann
        },
155 26056e0c Jes Sorensen
        { /* end of list */ }
156 191bc01b Gerd Hoffmann
    },
157 191bc01b Gerd Hoffmann
};
158 191bc01b Gerd Hoffmann
159 74db920c Gautham R Shenoy
QemuOptsList qemu_fsdev_opts = {
160 74db920c Gautham R Shenoy
    .name = "fsdev",
161 74db920c Gautham R Shenoy
    .implied_opt_name = "fstype",
162 74db920c Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_fsdev_opts.head),
163 74db920c Gautham R Shenoy
    .desc = {
164 74db920c Gautham R Shenoy
        {
165 74db920c Gautham R Shenoy
            .name = "fstype",
166 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
167 74db920c Gautham R Shenoy
        }, {
168 74db920c Gautham R Shenoy
            .name = "path",
169 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
170 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
171 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
172 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
173 74db920c Gautham R Shenoy
        },
174 74db920c Gautham R Shenoy
        { /*End of list */ }
175 74db920c Gautham R Shenoy
    },
176 74db920c Gautham R Shenoy
};
177 74db920c Gautham R Shenoy
178 3d54abc7 Gautham R Shenoy
QemuOptsList qemu_virtfs_opts = {
179 3d54abc7 Gautham R Shenoy
    .name = "virtfs",
180 3d54abc7 Gautham R Shenoy
    .implied_opt_name = "fstype",
181 3d54abc7 Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_virtfs_opts.head),
182 3d54abc7 Gautham R Shenoy
    .desc = {
183 3d54abc7 Gautham R Shenoy
        {
184 3d54abc7 Gautham R Shenoy
            .name = "fstype",
185 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
186 3d54abc7 Gautham R Shenoy
        }, {
187 3d54abc7 Gautham R Shenoy
            .name = "path",
188 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
189 3d54abc7 Gautham R Shenoy
        }, {
190 3d54abc7 Gautham R Shenoy
            .name = "mount_tag",
191 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
192 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
193 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
194 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
195 3d54abc7 Gautham R Shenoy
        },
196 3d54abc7 Gautham R Shenoy
197 3d54abc7 Gautham R Shenoy
        { /*End of list */ }
198 3d54abc7 Gautham R Shenoy
    },
199 3d54abc7 Gautham R Shenoy
};
200 3d54abc7 Gautham R Shenoy
201 3329f07b Gerd Hoffmann
static QemuOptsList qemu_device_opts = {
202 f31d07d1 Gerd Hoffmann
    .name = "device",
203 8212c64f Markus Armbruster
    .implied_opt_name = "driver",
204 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head),
205 f31d07d1 Gerd Hoffmann
    .desc = {
206 f31d07d1 Gerd Hoffmann
        /*
207 f31d07d1 Gerd Hoffmann
         * no elements => accept any
208 f31d07d1 Gerd Hoffmann
         * sanity checking will happen later
209 f31d07d1 Gerd Hoffmann
         * when setting device properties
210 f31d07d1 Gerd Hoffmann
         */
211 26056e0c Jes Sorensen
        { /* end of list */ }
212 f31d07d1 Gerd Hoffmann
    },
213 f31d07d1 Gerd Hoffmann
};
214 f31d07d1 Gerd Hoffmann
215 3329f07b Gerd Hoffmann
static QemuOptsList qemu_netdev_opts = {
216 a1ea458f Mark McLoughlin
    .name = "netdev",
217 8212c64f Markus Armbruster
    .implied_opt_name = "type",
218 a1ea458f Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head),
219 a1ea458f Mark McLoughlin
    .desc = {
220 a1ea458f Mark McLoughlin
        /*
221 a1ea458f Mark McLoughlin
         * no elements => accept any params
222 a1ea458f Mark McLoughlin
         * validation will happen later
223 a1ea458f Mark McLoughlin
         */
224 a1ea458f Mark McLoughlin
        { /* end of list */ }
225 a1ea458f Mark McLoughlin
    },
226 a1ea458f Mark McLoughlin
};
227 a1ea458f Mark McLoughlin
228 3329f07b Gerd Hoffmann
static QemuOptsList qemu_net_opts = {
229 8119b33d Mark McLoughlin
    .name = "net",
230 8212c64f Markus Armbruster
    .implied_opt_name = "type",
231 8119b33d Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
232 8119b33d Mark McLoughlin
    .desc = {
233 8119b33d Mark McLoughlin
        /*
234 8119b33d Mark McLoughlin
         * no elements => accept any params
235 8119b33d Mark McLoughlin
         * validation will happen later
236 8119b33d Mark McLoughlin
         */
237 8119b33d Mark McLoughlin
        { /* end of list */ }
238 8119b33d Mark McLoughlin
    },
239 8119b33d Mark McLoughlin
};
240 8119b33d Mark McLoughlin
241 3329f07b Gerd Hoffmann
static QemuOptsList qemu_rtc_opts = {
242 1ed2fc1f Jan Kiszka
    .name = "rtc",
243 1ed2fc1f Jan Kiszka
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
244 1ed2fc1f Jan Kiszka
    .desc = {
245 1ed2fc1f Jan Kiszka
        {
246 1ed2fc1f Jan Kiszka
            .name = "base",
247 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
248 6875204c Jan Kiszka
        },{
249 6875204c Jan Kiszka
            .name = "clock",
250 6875204c Jan Kiszka
            .type = QEMU_OPT_STRING,
251 1ed2fc1f Jan Kiszka
        },{
252 1ed2fc1f Jan Kiszka
            .name = "driftfix",
253 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
254 1ed2fc1f Jan Kiszka
        },
255 26056e0c Jes Sorensen
        { /* end of list */ }
256 1ed2fc1f Jan Kiszka
    },
257 1ed2fc1f Jan Kiszka
};
258 1ed2fc1f Jan Kiszka
259 3329f07b Gerd Hoffmann
static QemuOptsList qemu_global_opts = {
260 d0fef6fb Gerd Hoffmann
    .name = "global",
261 d0fef6fb Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head),
262 d0fef6fb Gerd Hoffmann
    .desc = {
263 d0fef6fb Gerd Hoffmann
        {
264 d0fef6fb Gerd Hoffmann
            .name = "driver",
265 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
266 d0fef6fb Gerd Hoffmann
        },{
267 d0fef6fb Gerd Hoffmann
            .name = "property",
268 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
269 d0fef6fb Gerd Hoffmann
        },{
270 d0fef6fb Gerd Hoffmann
            .name = "value",
271 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
272 d0fef6fb Gerd Hoffmann
        },
273 26056e0c Jes Sorensen
        { /* end of list */ }
274 d0fef6fb Gerd Hoffmann
    },
275 d0fef6fb Gerd Hoffmann
};
276 d0fef6fb Gerd Hoffmann
277 3329f07b Gerd Hoffmann
static QemuOptsList qemu_mon_opts = {
278 88589343 Gerd Hoffmann
    .name = "mon",
279 8212c64f Markus Armbruster
    .implied_opt_name = "chardev",
280 88589343 Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
281 88589343 Gerd Hoffmann
    .desc = {
282 88589343 Gerd Hoffmann
        {
283 88589343 Gerd Hoffmann
            .name = "mode",
284 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
285 88589343 Gerd Hoffmann
        },{
286 88589343 Gerd Hoffmann
            .name = "chardev",
287 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
288 88589343 Gerd Hoffmann
        },{
289 88589343 Gerd Hoffmann
            .name = "default",
290 88589343 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
291 39eaab9a Daniel P. Berrange
        },{
292 39eaab9a Daniel P. Berrange
            .name = "pretty",
293 39eaab9a Daniel P. Berrange
            .type = QEMU_OPT_BOOL,
294 88589343 Gerd Hoffmann
        },
295 26056e0c Jes Sorensen
        { /* end of list */ }
296 88589343 Gerd Hoffmann
    },
297 88589343 Gerd Hoffmann
};
298 88589343 Gerd Hoffmann
299 ab6540d5 Prerna Saxena
#ifdef CONFIG_SIMPLE_TRACE
300 ab6540d5 Prerna Saxena
static QemuOptsList qemu_trace_opts = {
301 ab6540d5 Prerna Saxena
    .name = "trace",
302 ab6540d5 Prerna Saxena
    .implied_opt_name = "trace",
303 ab6540d5 Prerna Saxena
    .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
304 ab6540d5 Prerna Saxena
    .desc = {
305 ab6540d5 Prerna Saxena
        {
306 ab6540d5 Prerna Saxena
            .name = "file",
307 ab6540d5 Prerna Saxena
            .type = QEMU_OPT_STRING,
308 ab6540d5 Prerna Saxena
        },
309 ab6540d5 Prerna Saxena
        { /* end if list */ }
310 ab6540d5 Prerna Saxena
    },
311 ab6540d5 Prerna Saxena
};
312 ab6540d5 Prerna Saxena
#endif
313 ab6540d5 Prerna Saxena
314 3329f07b Gerd Hoffmann
static QemuOptsList qemu_cpudef_opts = {
315 b5ec5ce0 john cooper
    .name = "cpudef",
316 b5ec5ce0 john cooper
    .head = QTAILQ_HEAD_INITIALIZER(qemu_cpudef_opts.head),
317 b5ec5ce0 john cooper
    .desc = {
318 b5ec5ce0 john cooper
        {
319 b5ec5ce0 john cooper
            .name = "name",
320 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
321 b5ec5ce0 john cooper
        },{
322 b5ec5ce0 john cooper
            .name = "level",
323 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
324 b5ec5ce0 john cooper
        },{
325 b5ec5ce0 john cooper
            .name = "vendor",
326 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
327 b5ec5ce0 john cooper
        },{
328 b5ec5ce0 john cooper
            .name = "family",
329 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
330 b5ec5ce0 john cooper
        },{
331 b5ec5ce0 john cooper
            .name = "model",
332 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
333 b5ec5ce0 john cooper
        },{
334 b5ec5ce0 john cooper
            .name = "stepping",
335 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
336 b5ec5ce0 john cooper
        },{
337 b5ec5ce0 john cooper
            .name = "feature_edx",      /* cpuid 0000_0001.edx */
338 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
339 b5ec5ce0 john cooper
        },{
340 b5ec5ce0 john cooper
            .name = "feature_ecx",      /* cpuid 0000_0001.ecx */
341 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
342 b5ec5ce0 john cooper
        },{
343 b5ec5ce0 john cooper
            .name = "extfeature_edx",   /* cpuid 8000_0001.edx */
344 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
345 b5ec5ce0 john cooper
        },{
346 b5ec5ce0 john cooper
            .name = "extfeature_ecx",   /* cpuid 8000_0001.ecx */
347 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
348 b5ec5ce0 john cooper
        },{
349 b5ec5ce0 john cooper
            .name = "xlevel",
350 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
351 b5ec5ce0 john cooper
        },{
352 b5ec5ce0 john cooper
            .name = "model_id",
353 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
354 b5ec5ce0 john cooper
        },{
355 b5ec5ce0 john cooper
            .name = "vendor_override",
356 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
357 b5ec5ce0 john cooper
        },
358 b5ec5ce0 john cooper
        { /* end of list */ }
359 b5ec5ce0 john cooper
    },
360 b5ec5ce0 john cooper
};
361 b5ec5ce0 john cooper
362 29b0040b Gerd Hoffmann
QemuOptsList qemu_spice_opts = {
363 29b0040b Gerd Hoffmann
    .name = "spice",
364 29b0040b Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head),
365 29b0040b Gerd Hoffmann
    .desc = {
366 29b0040b Gerd Hoffmann
        {
367 29b0040b Gerd Hoffmann
            .name = "port",
368 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
369 29b0040b Gerd Hoffmann
        },{
370 c448e855 Gerd Hoffmann
            .name = "tls-port",
371 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
372 c448e855 Gerd Hoffmann
        },{
373 333b0eeb Gerd Hoffmann
            .name = "addr",
374 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
375 333b0eeb Gerd Hoffmann
        },{
376 333b0eeb Gerd Hoffmann
            .name = "ipv4",
377 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
378 333b0eeb Gerd Hoffmann
        },{
379 333b0eeb Gerd Hoffmann
            .name = "ipv6",
380 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
381 333b0eeb Gerd Hoffmann
        },{
382 29b0040b Gerd Hoffmann
            .name = "password",
383 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_STRING,
384 29b0040b Gerd Hoffmann
        },{
385 29b0040b Gerd Hoffmann
            .name = "disable-ticketing",
386 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
387 c448e855 Gerd Hoffmann
        },{
388 c448e855 Gerd Hoffmann
            .name = "x509-dir",
389 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
390 c448e855 Gerd Hoffmann
        },{
391 c448e855 Gerd Hoffmann
            .name = "x509-key-file",
392 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
393 c448e855 Gerd Hoffmann
        },{
394 c448e855 Gerd Hoffmann
            .name = "x509-key-password",
395 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
396 c448e855 Gerd Hoffmann
        },{
397 c448e855 Gerd Hoffmann
            .name = "x509-cert-file",
398 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
399 c448e855 Gerd Hoffmann
        },{
400 c448e855 Gerd Hoffmann
            .name = "x509-cacert-file",
401 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
402 c448e855 Gerd Hoffmann
        },{
403 c448e855 Gerd Hoffmann
            .name = "x509-dh-key-file",
404 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
405 c448e855 Gerd Hoffmann
        },{
406 c448e855 Gerd Hoffmann
            .name = "tls-ciphers",
407 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
408 9f04e09e Yonit Halperin
        },{
409 17b6dea0 Gerd Hoffmann
            .name = "tls-channel",
410 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
411 17b6dea0 Gerd Hoffmann
        },{
412 17b6dea0 Gerd Hoffmann
            .name = "plaintext-channel",
413 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
414 17b6dea0 Gerd Hoffmann
        },{
415 9f04e09e Yonit Halperin
            .name = "image-compression",
416 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
417 9f04e09e Yonit Halperin
        },{
418 9f04e09e Yonit Halperin
            .name = "jpeg-wan-compression",
419 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
420 9f04e09e Yonit Halperin
        },{
421 9f04e09e Yonit Halperin
            .name = "zlib-glz-wan-compression",
422 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
423 84a23f25 Gerd Hoffmann
        },{
424 84a23f25 Gerd Hoffmann
            .name = "streaming-video",
425 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
426 84a23f25 Gerd Hoffmann
        },{
427 84a23f25 Gerd Hoffmann
            .name = "agent-mouse",
428 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
429 84a23f25 Gerd Hoffmann
        },{
430 84a23f25 Gerd Hoffmann
            .name = "playback-compression",
431 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
432 29b0040b Gerd Hoffmann
        },
433 29b0040b Gerd Hoffmann
        { /* end if list */ }
434 29b0040b Gerd Hoffmann
    },
435 29b0040b Gerd Hoffmann
};
436 29b0040b Gerd Hoffmann
437 2e55e842 Gleb Natapov
QemuOptsList qemu_option_rom_opts = {
438 2e55e842 Gleb Natapov
    .name = "option-rom",
439 2e55e842 Gleb Natapov
    .implied_opt_name = "romfile",
440 2e55e842 Gleb Natapov
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
441 2e55e842 Gleb Natapov
    .desc = {
442 2e55e842 Gleb Natapov
        {
443 2e55e842 Gleb Natapov
            .name = "bootindex",
444 2e55e842 Gleb Natapov
            .type = QEMU_OPT_NUMBER,
445 2e55e842 Gleb Natapov
        }, {
446 2e55e842 Gleb Natapov
            .name = "romfile",
447 2e55e842 Gleb Natapov
            .type = QEMU_OPT_STRING,
448 2e55e842 Gleb Natapov
        },
449 2e55e842 Gleb Natapov
        { /* end if list */ }
450 2e55e842 Gleb Natapov
    },
451 2e55e842 Gleb Natapov
};
452 2e55e842 Gleb Natapov
453 dfe795e7 Gerd Hoffmann
static QemuOptsList *vm_config_groups[32] = {
454 d058fe03 Gerd Hoffmann
    &qemu_drive_opts,
455 191bc01b Gerd Hoffmann
    &qemu_chardev_opts,
456 f31d07d1 Gerd Hoffmann
    &qemu_device_opts,
457 a1ea458f Mark McLoughlin
    &qemu_netdev_opts,
458 8119b33d Mark McLoughlin
    &qemu_net_opts,
459 5fdfbf7e Jan Kiszka
    &qemu_rtc_opts,
460 d0fef6fb Gerd Hoffmann
    &qemu_global_opts,
461 88589343 Gerd Hoffmann
    &qemu_mon_opts,
462 b5ec5ce0 john cooper
    &qemu_cpudef_opts,
463 ab6540d5 Prerna Saxena
#ifdef CONFIG_SIMPLE_TRACE
464 ab6540d5 Prerna Saxena
    &qemu_trace_opts,
465 ab6540d5 Prerna Saxena
#endif
466 2e55e842 Gleb Natapov
    &qemu_option_rom_opts,
467 d058fe03 Gerd Hoffmann
    NULL,
468 d058fe03 Gerd Hoffmann
};
469 d058fe03 Gerd Hoffmann
470 490b648e Kevin Wolf
static QemuOptsList *find_list(QemuOptsList **lists, const char *group)
471 ddc97855 Gerd Hoffmann
{
472 ddc97855 Gerd Hoffmann
    int i;
473 ddc97855 Gerd Hoffmann
474 ddc97855 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
475 ddc97855 Gerd Hoffmann
        if (strcmp(lists[i]->name, group) == 0)
476 ddc97855 Gerd Hoffmann
            break;
477 ddc97855 Gerd Hoffmann
    }
478 ddc97855 Gerd Hoffmann
    if (lists[i] == NULL) {
479 1ecda02b Markus Armbruster
        error_report("there is no option group \"%s\"", group);
480 ddc97855 Gerd Hoffmann
    }
481 ddc97855 Gerd Hoffmann
    return lists[i];
482 ddc97855 Gerd Hoffmann
}
483 ddc97855 Gerd Hoffmann
484 490b648e Kevin Wolf
QemuOptsList *qemu_find_opts(const char *group)
485 490b648e Kevin Wolf
{
486 490b648e Kevin Wolf
    return find_list(vm_config_groups, group);
487 490b648e Kevin Wolf
}
488 490b648e Kevin Wolf
489 dfe795e7 Gerd Hoffmann
void qemu_add_opts(QemuOptsList *list)
490 dfe795e7 Gerd Hoffmann
{
491 dfe795e7 Gerd Hoffmann
    int entries, i;
492 dfe795e7 Gerd Hoffmann
493 dfe795e7 Gerd Hoffmann
    entries = ARRAY_SIZE(vm_config_groups);
494 dfe795e7 Gerd Hoffmann
    entries--; /* keep list NULL terminated */
495 dfe795e7 Gerd Hoffmann
    for (i = 0; i < entries; i++) {
496 dfe795e7 Gerd Hoffmann
        if (vm_config_groups[i] == NULL) {
497 dfe795e7 Gerd Hoffmann
            vm_config_groups[i] = list;
498 dfe795e7 Gerd Hoffmann
            return;
499 dfe795e7 Gerd Hoffmann
        }
500 dfe795e7 Gerd Hoffmann
    }
501 dfe795e7 Gerd Hoffmann
    fprintf(stderr, "ran out of space in vm_config_groups");
502 dfe795e7 Gerd Hoffmann
    abort();
503 dfe795e7 Gerd Hoffmann
}
504 dfe795e7 Gerd Hoffmann
505 d058fe03 Gerd Hoffmann
int qemu_set_option(const char *str)
506 d058fe03 Gerd Hoffmann
{
507 d058fe03 Gerd Hoffmann
    char group[64], id[64], arg[64];
508 ddc97855 Gerd Hoffmann
    QemuOptsList *list;
509 d058fe03 Gerd Hoffmann
    QemuOpts *opts;
510 ddc97855 Gerd Hoffmann
    int rc, offset;
511 d058fe03 Gerd Hoffmann
512 d058fe03 Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
513 d058fe03 Gerd Hoffmann
    if (rc < 3 || str[offset] != '=') {
514 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
515 d058fe03 Gerd Hoffmann
        return -1;
516 d058fe03 Gerd Hoffmann
    }
517 d058fe03 Gerd Hoffmann
518 304329ee Markus Armbruster
    list = qemu_find_opts(group);
519 ddc97855 Gerd Hoffmann
    if (list == NULL) {
520 d058fe03 Gerd Hoffmann
        return -1;
521 d058fe03 Gerd Hoffmann
    }
522 d058fe03 Gerd Hoffmann
523 ddc97855 Gerd Hoffmann
    opts = qemu_opts_find(list, id);
524 d058fe03 Gerd Hoffmann
    if (!opts) {
525 1ecda02b Markus Armbruster
        error_report("there is no %s \"%s\" defined",
526 1ecda02b Markus Armbruster
                     list->name, id);
527 d058fe03 Gerd Hoffmann
        return -1;
528 d058fe03 Gerd Hoffmann
    }
529 d058fe03 Gerd Hoffmann
530 3df04ac3 Mark McLoughlin
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
531 d058fe03 Gerd Hoffmann
        return -1;
532 d058fe03 Gerd Hoffmann
    }
533 d058fe03 Gerd Hoffmann
    return 0;
534 d058fe03 Gerd Hoffmann
}
535 d058fe03 Gerd Hoffmann
536 d0fef6fb Gerd Hoffmann
int qemu_global_option(const char *str)
537 d0fef6fb Gerd Hoffmann
{
538 d0fef6fb Gerd Hoffmann
    char driver[64], property[64];
539 d0fef6fb Gerd Hoffmann
    QemuOpts *opts;
540 d0fef6fb Gerd Hoffmann
    int rc, offset;
541 d0fef6fb Gerd Hoffmann
542 d0fef6fb Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
543 d0fef6fb Gerd Hoffmann
    if (rc < 2 || str[offset] != '=') {
544 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
545 d0fef6fb Gerd Hoffmann
        return -1;
546 d0fef6fb Gerd Hoffmann
    }
547 d0fef6fb Gerd Hoffmann
548 d0fef6fb Gerd Hoffmann
    opts = qemu_opts_create(&qemu_global_opts, NULL, 0);
549 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "driver", driver);
550 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "property", property);
551 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "value", str+offset+1);
552 d0fef6fb Gerd Hoffmann
    return 0;
553 d0fef6fb Gerd Hoffmann
}
554 d0fef6fb Gerd Hoffmann
555 9d993394 Gerd Hoffmann
struct ConfigWriteData {
556 9d993394 Gerd Hoffmann
    QemuOptsList *list;
557 9d993394 Gerd Hoffmann
    FILE *fp;
558 9d993394 Gerd Hoffmann
};
559 9d993394 Gerd Hoffmann
560 9d993394 Gerd Hoffmann
static int config_write_opt(const char *name, const char *value, void *opaque)
561 9d993394 Gerd Hoffmann
{
562 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
563 9d993394 Gerd Hoffmann
564 9d993394 Gerd Hoffmann
    fprintf(data->fp, "  %s = \"%s\"\n", name, value);
565 9d993394 Gerd Hoffmann
    return 0;
566 9d993394 Gerd Hoffmann
}
567 9d993394 Gerd Hoffmann
568 9d993394 Gerd Hoffmann
static int config_write_opts(QemuOpts *opts, void *opaque)
569 9d993394 Gerd Hoffmann
{
570 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
571 9d993394 Gerd Hoffmann
    const char *id = qemu_opts_id(opts);
572 9d993394 Gerd Hoffmann
573 9d993394 Gerd Hoffmann
    if (id) {
574 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
575 9d993394 Gerd Hoffmann
    } else {
576 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s]\n", data->list->name);
577 9d993394 Gerd Hoffmann
    }
578 9d993394 Gerd Hoffmann
    qemu_opt_foreach(opts, config_write_opt, data, 0);
579 9d993394 Gerd Hoffmann
    fprintf(data->fp, "\n");
580 9d993394 Gerd Hoffmann
    return 0;
581 9d993394 Gerd Hoffmann
}
582 9d993394 Gerd Hoffmann
583 9d993394 Gerd Hoffmann
void qemu_config_write(FILE *fp)
584 9d993394 Gerd Hoffmann
{
585 9d993394 Gerd Hoffmann
    struct ConfigWriteData data = { .fp = fp };
586 490b648e Kevin Wolf
    QemuOptsList **lists = vm_config_groups;
587 9d993394 Gerd Hoffmann
    int i;
588 9d993394 Gerd Hoffmann
589 9d993394 Gerd Hoffmann
    fprintf(fp, "# qemu config file\n\n");
590 9d993394 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
591 9d993394 Gerd Hoffmann
        data.list = lists[i];
592 9d993394 Gerd Hoffmann
        qemu_opts_foreach(data.list, config_write_opts, &data, 0);
593 9d993394 Gerd Hoffmann
    }
594 9d993394 Gerd Hoffmann
}
595 42262ba8 Gerd Hoffmann
596 490b648e Kevin Wolf
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
597 42262ba8 Gerd Hoffmann
{
598 42262ba8 Gerd Hoffmann
    char line[1024], group[64], id[64], arg[64], value[1024];
599 cf5a65aa Markus Armbruster
    Location loc;
600 42262ba8 Gerd Hoffmann
    QemuOptsList *list = NULL;
601 42262ba8 Gerd Hoffmann
    QemuOpts *opts = NULL;
602 cf5a65aa Markus Armbruster
    int res = -1, lno = 0;
603 42262ba8 Gerd Hoffmann
604 cf5a65aa Markus Armbruster
    loc_push_none(&loc);
605 42262ba8 Gerd Hoffmann
    while (fgets(line, sizeof(line), fp) != NULL) {
606 cf5a65aa Markus Armbruster
        loc_set_file(fname, ++lno);
607 42262ba8 Gerd Hoffmann
        if (line[0] == '\n') {
608 42262ba8 Gerd Hoffmann
            /* skip empty lines */
609 42262ba8 Gerd Hoffmann
            continue;
610 42262ba8 Gerd Hoffmann
        }
611 42262ba8 Gerd Hoffmann
        if (line[0] == '#') {
612 42262ba8 Gerd Hoffmann
            /* comment */
613 42262ba8 Gerd Hoffmann
            continue;
614 42262ba8 Gerd Hoffmann
        }
615 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
616 42262ba8 Gerd Hoffmann
            /* group with id */
617 490b648e Kevin Wolf
            list = find_list(lists, group);
618 42262ba8 Gerd Hoffmann
            if (list == NULL)
619 cf5a65aa Markus Armbruster
                goto out;
620 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, id, 1);
621 42262ba8 Gerd Hoffmann
            continue;
622 42262ba8 Gerd Hoffmann
        }
623 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63[^]]]", group) == 1) {
624 42262ba8 Gerd Hoffmann
            /* group without id */
625 490b648e Kevin Wolf
            list = find_list(lists, group);
626 42262ba8 Gerd Hoffmann
            if (list == NULL)
627 cf5a65aa Markus Armbruster
                goto out;
628 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, NULL, 0);
629 42262ba8 Gerd Hoffmann
            continue;
630 42262ba8 Gerd Hoffmann
        }
631 42262ba8 Gerd Hoffmann
        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
632 42262ba8 Gerd Hoffmann
            /* arg = value */
633 42262ba8 Gerd Hoffmann
            if (opts == NULL) {
634 cf5a65aa Markus Armbruster
                error_report("no group defined");
635 cf5a65aa Markus Armbruster
                goto out;
636 42262ba8 Gerd Hoffmann
            }
637 42262ba8 Gerd Hoffmann
            if (qemu_opt_set(opts, arg, value) != 0) {
638 cf5a65aa Markus Armbruster
                goto out;
639 42262ba8 Gerd Hoffmann
            }
640 42262ba8 Gerd Hoffmann
            continue;
641 42262ba8 Gerd Hoffmann
        }
642 cf5a65aa Markus Armbruster
        error_report("parse error");
643 cf5a65aa Markus Armbruster
        goto out;
644 42262ba8 Gerd Hoffmann
    }
645 ef82516d Markus Armbruster
    if (ferror(fp)) {
646 ef82516d Markus Armbruster
        error_report("error reading file");
647 ef82516d Markus Armbruster
        goto out;
648 ef82516d Markus Armbruster
    }
649 cf5a65aa Markus Armbruster
    res = 0;
650 cf5a65aa Markus Armbruster
out:
651 cf5a65aa Markus Armbruster
    loc_pop(&loc);
652 cf5a65aa Markus Armbruster
    return res;
653 42262ba8 Gerd Hoffmann
}
654 dcfb0939 Kevin Wolf
655 dcfb0939 Kevin Wolf
int qemu_read_config_file(const char *filename)
656 dcfb0939 Kevin Wolf
{
657 dcfb0939 Kevin Wolf
    FILE *f = fopen(filename, "r");
658 019e78ba Kevin Wolf
    int ret;
659 019e78ba Kevin Wolf
660 dcfb0939 Kevin Wolf
    if (f == NULL) {
661 dcfb0939 Kevin Wolf
        return -errno;
662 dcfb0939 Kevin Wolf
    }
663 dcfb0939 Kevin Wolf
664 019e78ba Kevin Wolf
    ret = qemu_config_parse(f, vm_config_groups, filename);
665 dcfb0939 Kevin Wolf
    fclose(f);
666 dcfb0939 Kevin Wolf
667 019e78ba Kevin Wolf
    if (ret == 0) {
668 019e78ba Kevin Wolf
        return 0;
669 019e78ba Kevin Wolf
    } else {
670 019e78ba Kevin Wolf
        return -EINVAL;
671 019e78ba Kevin Wolf
    }
672 dcfb0939 Kevin Wolf
}