Statistics
| Branch: | Revision:

root / qemu-config.c @ d4970b07

History | View | Annotate | Download (17.2 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 d4970b07 Hans de Goede
            .name = "disable-copy-paste",
389 d4970b07 Hans de Goede
            .type = QEMU_OPT_BOOL,
390 d4970b07 Hans de Goede
        },{
391 c448e855 Gerd Hoffmann
            .name = "x509-dir",
392 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
393 c448e855 Gerd Hoffmann
        },{
394 c448e855 Gerd Hoffmann
            .name = "x509-key-file",
395 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
396 c448e855 Gerd Hoffmann
        },{
397 c448e855 Gerd Hoffmann
            .name = "x509-key-password",
398 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
399 c448e855 Gerd Hoffmann
        },{
400 c448e855 Gerd Hoffmann
            .name = "x509-cert-file",
401 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
402 c448e855 Gerd Hoffmann
        },{
403 c448e855 Gerd Hoffmann
            .name = "x509-cacert-file",
404 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
405 c448e855 Gerd Hoffmann
        },{
406 c448e855 Gerd Hoffmann
            .name = "x509-dh-key-file",
407 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
408 c448e855 Gerd Hoffmann
        },{
409 c448e855 Gerd Hoffmann
            .name = "tls-ciphers",
410 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
411 9f04e09e Yonit Halperin
        },{
412 17b6dea0 Gerd Hoffmann
            .name = "tls-channel",
413 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
414 17b6dea0 Gerd Hoffmann
        },{
415 17b6dea0 Gerd Hoffmann
            .name = "plaintext-channel",
416 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
417 17b6dea0 Gerd Hoffmann
        },{
418 9f04e09e Yonit Halperin
            .name = "image-compression",
419 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
420 9f04e09e Yonit Halperin
        },{
421 9f04e09e Yonit Halperin
            .name = "jpeg-wan-compression",
422 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
423 9f04e09e Yonit Halperin
        },{
424 9f04e09e Yonit Halperin
            .name = "zlib-glz-wan-compression",
425 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
426 84a23f25 Gerd Hoffmann
        },{
427 84a23f25 Gerd Hoffmann
            .name = "streaming-video",
428 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
429 84a23f25 Gerd Hoffmann
        },{
430 84a23f25 Gerd Hoffmann
            .name = "agent-mouse",
431 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
432 84a23f25 Gerd Hoffmann
        },{
433 84a23f25 Gerd Hoffmann
            .name = "playback-compression",
434 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
435 29b0040b Gerd Hoffmann
        },
436 29b0040b Gerd Hoffmann
        { /* end if list */ }
437 29b0040b Gerd Hoffmann
    },
438 29b0040b Gerd Hoffmann
};
439 29b0040b Gerd Hoffmann
440 2e55e842 Gleb Natapov
QemuOptsList qemu_option_rom_opts = {
441 2e55e842 Gleb Natapov
    .name = "option-rom",
442 2e55e842 Gleb Natapov
    .implied_opt_name = "romfile",
443 2e55e842 Gleb Natapov
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
444 2e55e842 Gleb Natapov
    .desc = {
445 2e55e842 Gleb Natapov
        {
446 2e55e842 Gleb Natapov
            .name = "bootindex",
447 2e55e842 Gleb Natapov
            .type = QEMU_OPT_NUMBER,
448 2e55e842 Gleb Natapov
        }, {
449 2e55e842 Gleb Natapov
            .name = "romfile",
450 2e55e842 Gleb Natapov
            .type = QEMU_OPT_STRING,
451 2e55e842 Gleb Natapov
        },
452 2e55e842 Gleb Natapov
        { /* end if list */ }
453 2e55e842 Gleb Natapov
    },
454 2e55e842 Gleb Natapov
};
455 2e55e842 Gleb Natapov
456 303d4e86 Anthony PERARD
static QemuOptsList qemu_machine_opts = {
457 303d4e86 Anthony PERARD
    .name = "machine",
458 303d4e86 Anthony PERARD
    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
459 303d4e86 Anthony PERARD
    .desc = {
460 303d4e86 Anthony PERARD
        {
461 303d4e86 Anthony PERARD
            .name = "accel",
462 303d4e86 Anthony PERARD
            .type = QEMU_OPT_STRING,
463 303d4e86 Anthony PERARD
            .help = "accelerator list",
464 303d4e86 Anthony PERARD
        },
465 303d4e86 Anthony PERARD
        { /* End of list */ }
466 303d4e86 Anthony PERARD
    },
467 303d4e86 Anthony PERARD
};
468 303d4e86 Anthony PERARD
469 dfe795e7 Gerd Hoffmann
static QemuOptsList *vm_config_groups[32] = {
470 d058fe03 Gerd Hoffmann
    &qemu_drive_opts,
471 191bc01b Gerd Hoffmann
    &qemu_chardev_opts,
472 f31d07d1 Gerd Hoffmann
    &qemu_device_opts,
473 a1ea458f Mark McLoughlin
    &qemu_netdev_opts,
474 8119b33d Mark McLoughlin
    &qemu_net_opts,
475 5fdfbf7e Jan Kiszka
    &qemu_rtc_opts,
476 d0fef6fb Gerd Hoffmann
    &qemu_global_opts,
477 88589343 Gerd Hoffmann
    &qemu_mon_opts,
478 b5ec5ce0 john cooper
    &qemu_cpudef_opts,
479 ab6540d5 Prerna Saxena
#ifdef CONFIG_SIMPLE_TRACE
480 ab6540d5 Prerna Saxena
    &qemu_trace_opts,
481 ab6540d5 Prerna Saxena
#endif
482 2e55e842 Gleb Natapov
    &qemu_option_rom_opts,
483 303d4e86 Anthony PERARD
    &qemu_machine_opts,
484 d058fe03 Gerd Hoffmann
    NULL,
485 d058fe03 Gerd Hoffmann
};
486 d058fe03 Gerd Hoffmann
487 490b648e Kevin Wolf
static QemuOptsList *find_list(QemuOptsList **lists, const char *group)
488 ddc97855 Gerd Hoffmann
{
489 ddc97855 Gerd Hoffmann
    int i;
490 ddc97855 Gerd Hoffmann
491 ddc97855 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
492 ddc97855 Gerd Hoffmann
        if (strcmp(lists[i]->name, group) == 0)
493 ddc97855 Gerd Hoffmann
            break;
494 ddc97855 Gerd Hoffmann
    }
495 ddc97855 Gerd Hoffmann
    if (lists[i] == NULL) {
496 1ecda02b Markus Armbruster
        error_report("there is no option group \"%s\"", group);
497 ddc97855 Gerd Hoffmann
    }
498 ddc97855 Gerd Hoffmann
    return lists[i];
499 ddc97855 Gerd Hoffmann
}
500 ddc97855 Gerd Hoffmann
501 490b648e Kevin Wolf
QemuOptsList *qemu_find_opts(const char *group)
502 490b648e Kevin Wolf
{
503 490b648e Kevin Wolf
    return find_list(vm_config_groups, group);
504 490b648e Kevin Wolf
}
505 490b648e Kevin Wolf
506 dfe795e7 Gerd Hoffmann
void qemu_add_opts(QemuOptsList *list)
507 dfe795e7 Gerd Hoffmann
{
508 dfe795e7 Gerd Hoffmann
    int entries, i;
509 dfe795e7 Gerd Hoffmann
510 dfe795e7 Gerd Hoffmann
    entries = ARRAY_SIZE(vm_config_groups);
511 dfe795e7 Gerd Hoffmann
    entries--; /* keep list NULL terminated */
512 dfe795e7 Gerd Hoffmann
    for (i = 0; i < entries; i++) {
513 dfe795e7 Gerd Hoffmann
        if (vm_config_groups[i] == NULL) {
514 dfe795e7 Gerd Hoffmann
            vm_config_groups[i] = list;
515 dfe795e7 Gerd Hoffmann
            return;
516 dfe795e7 Gerd Hoffmann
        }
517 dfe795e7 Gerd Hoffmann
    }
518 dfe795e7 Gerd Hoffmann
    fprintf(stderr, "ran out of space in vm_config_groups");
519 dfe795e7 Gerd Hoffmann
    abort();
520 dfe795e7 Gerd Hoffmann
}
521 dfe795e7 Gerd Hoffmann
522 d058fe03 Gerd Hoffmann
int qemu_set_option(const char *str)
523 d058fe03 Gerd Hoffmann
{
524 d058fe03 Gerd Hoffmann
    char group[64], id[64], arg[64];
525 ddc97855 Gerd Hoffmann
    QemuOptsList *list;
526 d058fe03 Gerd Hoffmann
    QemuOpts *opts;
527 ddc97855 Gerd Hoffmann
    int rc, offset;
528 d058fe03 Gerd Hoffmann
529 d058fe03 Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
530 d058fe03 Gerd Hoffmann
    if (rc < 3 || str[offset] != '=') {
531 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
532 d058fe03 Gerd Hoffmann
        return -1;
533 d058fe03 Gerd Hoffmann
    }
534 d058fe03 Gerd Hoffmann
535 304329ee Markus Armbruster
    list = qemu_find_opts(group);
536 ddc97855 Gerd Hoffmann
    if (list == NULL) {
537 d058fe03 Gerd Hoffmann
        return -1;
538 d058fe03 Gerd Hoffmann
    }
539 d058fe03 Gerd Hoffmann
540 ddc97855 Gerd Hoffmann
    opts = qemu_opts_find(list, id);
541 d058fe03 Gerd Hoffmann
    if (!opts) {
542 1ecda02b Markus Armbruster
        error_report("there is no %s \"%s\" defined",
543 1ecda02b Markus Armbruster
                     list->name, id);
544 d058fe03 Gerd Hoffmann
        return -1;
545 d058fe03 Gerd Hoffmann
    }
546 d058fe03 Gerd Hoffmann
547 3df04ac3 Mark McLoughlin
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
548 d058fe03 Gerd Hoffmann
        return -1;
549 d058fe03 Gerd Hoffmann
    }
550 d058fe03 Gerd Hoffmann
    return 0;
551 d058fe03 Gerd Hoffmann
}
552 d058fe03 Gerd Hoffmann
553 d0fef6fb Gerd Hoffmann
int qemu_global_option(const char *str)
554 d0fef6fb Gerd Hoffmann
{
555 d0fef6fb Gerd Hoffmann
    char driver[64], property[64];
556 d0fef6fb Gerd Hoffmann
    QemuOpts *opts;
557 d0fef6fb Gerd Hoffmann
    int rc, offset;
558 d0fef6fb Gerd Hoffmann
559 d0fef6fb Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
560 d0fef6fb Gerd Hoffmann
    if (rc < 2 || str[offset] != '=') {
561 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
562 d0fef6fb Gerd Hoffmann
        return -1;
563 d0fef6fb Gerd Hoffmann
    }
564 d0fef6fb Gerd Hoffmann
565 d0fef6fb Gerd Hoffmann
    opts = qemu_opts_create(&qemu_global_opts, NULL, 0);
566 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "driver", driver);
567 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "property", property);
568 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "value", str+offset+1);
569 d0fef6fb Gerd Hoffmann
    return 0;
570 d0fef6fb Gerd Hoffmann
}
571 d0fef6fb Gerd Hoffmann
572 9d993394 Gerd Hoffmann
struct ConfigWriteData {
573 9d993394 Gerd Hoffmann
    QemuOptsList *list;
574 9d993394 Gerd Hoffmann
    FILE *fp;
575 9d993394 Gerd Hoffmann
};
576 9d993394 Gerd Hoffmann
577 9d993394 Gerd Hoffmann
static int config_write_opt(const char *name, const char *value, void *opaque)
578 9d993394 Gerd Hoffmann
{
579 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
580 9d993394 Gerd Hoffmann
581 9d993394 Gerd Hoffmann
    fprintf(data->fp, "  %s = \"%s\"\n", name, value);
582 9d993394 Gerd Hoffmann
    return 0;
583 9d993394 Gerd Hoffmann
}
584 9d993394 Gerd Hoffmann
585 9d993394 Gerd Hoffmann
static int config_write_opts(QemuOpts *opts, void *opaque)
586 9d993394 Gerd Hoffmann
{
587 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
588 9d993394 Gerd Hoffmann
    const char *id = qemu_opts_id(opts);
589 9d993394 Gerd Hoffmann
590 9d993394 Gerd Hoffmann
    if (id) {
591 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
592 9d993394 Gerd Hoffmann
    } else {
593 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s]\n", data->list->name);
594 9d993394 Gerd Hoffmann
    }
595 9d993394 Gerd Hoffmann
    qemu_opt_foreach(opts, config_write_opt, data, 0);
596 9d993394 Gerd Hoffmann
    fprintf(data->fp, "\n");
597 9d993394 Gerd Hoffmann
    return 0;
598 9d993394 Gerd Hoffmann
}
599 9d993394 Gerd Hoffmann
600 9d993394 Gerd Hoffmann
void qemu_config_write(FILE *fp)
601 9d993394 Gerd Hoffmann
{
602 9d993394 Gerd Hoffmann
    struct ConfigWriteData data = { .fp = fp };
603 490b648e Kevin Wolf
    QemuOptsList **lists = vm_config_groups;
604 9d993394 Gerd Hoffmann
    int i;
605 9d993394 Gerd Hoffmann
606 9d993394 Gerd Hoffmann
    fprintf(fp, "# qemu config file\n\n");
607 9d993394 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
608 9d993394 Gerd Hoffmann
        data.list = lists[i];
609 9d993394 Gerd Hoffmann
        qemu_opts_foreach(data.list, config_write_opts, &data, 0);
610 9d993394 Gerd Hoffmann
    }
611 9d993394 Gerd Hoffmann
}
612 42262ba8 Gerd Hoffmann
613 490b648e Kevin Wolf
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
614 42262ba8 Gerd Hoffmann
{
615 42262ba8 Gerd Hoffmann
    char line[1024], group[64], id[64], arg[64], value[1024];
616 cf5a65aa Markus Armbruster
    Location loc;
617 42262ba8 Gerd Hoffmann
    QemuOptsList *list = NULL;
618 42262ba8 Gerd Hoffmann
    QemuOpts *opts = NULL;
619 cf5a65aa Markus Armbruster
    int res = -1, lno = 0;
620 42262ba8 Gerd Hoffmann
621 cf5a65aa Markus Armbruster
    loc_push_none(&loc);
622 42262ba8 Gerd Hoffmann
    while (fgets(line, sizeof(line), fp) != NULL) {
623 cf5a65aa Markus Armbruster
        loc_set_file(fname, ++lno);
624 42262ba8 Gerd Hoffmann
        if (line[0] == '\n') {
625 42262ba8 Gerd Hoffmann
            /* skip empty lines */
626 42262ba8 Gerd Hoffmann
            continue;
627 42262ba8 Gerd Hoffmann
        }
628 42262ba8 Gerd Hoffmann
        if (line[0] == '#') {
629 42262ba8 Gerd Hoffmann
            /* comment */
630 42262ba8 Gerd Hoffmann
            continue;
631 42262ba8 Gerd Hoffmann
        }
632 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
633 42262ba8 Gerd Hoffmann
            /* group with id */
634 490b648e Kevin Wolf
            list = find_list(lists, group);
635 42262ba8 Gerd Hoffmann
            if (list == NULL)
636 cf5a65aa Markus Armbruster
                goto out;
637 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, id, 1);
638 42262ba8 Gerd Hoffmann
            continue;
639 42262ba8 Gerd Hoffmann
        }
640 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63[^]]]", group) == 1) {
641 42262ba8 Gerd Hoffmann
            /* group without id */
642 490b648e Kevin Wolf
            list = find_list(lists, group);
643 42262ba8 Gerd Hoffmann
            if (list == NULL)
644 cf5a65aa Markus Armbruster
                goto out;
645 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, NULL, 0);
646 42262ba8 Gerd Hoffmann
            continue;
647 42262ba8 Gerd Hoffmann
        }
648 42262ba8 Gerd Hoffmann
        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
649 42262ba8 Gerd Hoffmann
            /* arg = value */
650 42262ba8 Gerd Hoffmann
            if (opts == NULL) {
651 cf5a65aa Markus Armbruster
                error_report("no group defined");
652 cf5a65aa Markus Armbruster
                goto out;
653 42262ba8 Gerd Hoffmann
            }
654 42262ba8 Gerd Hoffmann
            if (qemu_opt_set(opts, arg, value) != 0) {
655 cf5a65aa Markus Armbruster
                goto out;
656 42262ba8 Gerd Hoffmann
            }
657 42262ba8 Gerd Hoffmann
            continue;
658 42262ba8 Gerd Hoffmann
        }
659 cf5a65aa Markus Armbruster
        error_report("parse error");
660 cf5a65aa Markus Armbruster
        goto out;
661 42262ba8 Gerd Hoffmann
    }
662 ef82516d Markus Armbruster
    if (ferror(fp)) {
663 ef82516d Markus Armbruster
        error_report("error reading file");
664 ef82516d Markus Armbruster
        goto out;
665 ef82516d Markus Armbruster
    }
666 cf5a65aa Markus Armbruster
    res = 0;
667 cf5a65aa Markus Armbruster
out:
668 cf5a65aa Markus Armbruster
    loc_pop(&loc);
669 cf5a65aa Markus Armbruster
    return res;
670 42262ba8 Gerd Hoffmann
}
671 dcfb0939 Kevin Wolf
672 dcfb0939 Kevin Wolf
int qemu_read_config_file(const char *filename)
673 dcfb0939 Kevin Wolf
{
674 dcfb0939 Kevin Wolf
    FILE *f = fopen(filename, "r");
675 019e78ba Kevin Wolf
    int ret;
676 019e78ba Kevin Wolf
677 dcfb0939 Kevin Wolf
    if (f == NULL) {
678 dcfb0939 Kevin Wolf
        return -errno;
679 dcfb0939 Kevin Wolf
    }
680 dcfb0939 Kevin Wolf
681 019e78ba Kevin Wolf
    ret = qemu_config_parse(f, vm_config_groups, filename);
682 dcfb0939 Kevin Wolf
    fclose(f);
683 dcfb0939 Kevin Wolf
684 019e78ba Kevin Wolf
    if (ret == 0) {
685 019e78ba Kevin Wolf
        return 0;
686 019e78ba Kevin Wolf
    } else {
687 019e78ba Kevin Wolf
        return -EINVAL;
688 019e78ba Kevin Wolf
    }
689 dcfb0939 Kevin Wolf
}