root / hw / core / qdev-properties-system.c @ f487b677
History | View | Annotate | Download (9.4 kB)
1 | a404b612 | Eduardo Habkost | /*
|
---|---|---|---|
2 | a404b612 | Eduardo Habkost | * qdev property parsing and global properties
|
3 | a404b612 | Eduardo Habkost | * (parts specific for qemu-system-*)
|
4 | a404b612 | Eduardo Habkost | *
|
5 | a404b612 | Eduardo Habkost | * This file is based on code from hw/qdev-properties.c from
|
6 | a404b612 | Eduardo Habkost | * commit 074a86fccd185616469dfcdc0e157f438aebba18,
|
7 | a404b612 | Eduardo Habkost | * Copyright (c) Gerd Hoffmann <kraxel@redhat.com> and other contributors.
|
8 | a404b612 | Eduardo Habkost | *
|
9 | a404b612 | Eduardo Habkost | * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
10 | a404b612 | Eduardo Habkost | * See the COPYING file in the top-level directory.
|
11 | a404b612 | Eduardo Habkost | */
|
12 | a404b612 | Eduardo Habkost | |
13 | 501a7ce7 | Andreas Färber | #include "net/net.h" |
14 | 83c9f4ca | Paolo Bonzini | #include "hw/qdev.h" |
15 | 501a7ce7 | Andreas Färber | #include "qapi/qmp/qerror.h" |
16 | 501a7ce7 | Andreas Färber | #include "sysemu/blockdev.h" |
17 | 0d09e41a | Paolo Bonzini | #include "hw/block/block.h" |
18 | a404b612 | Eduardo Habkost | #include "net/hub.h" |
19 | 501a7ce7 | Andreas Färber | #include "qapi/visitor.h" |
20 | dccfcd0e | Paolo Bonzini | #include "sysemu/char.h" |
21 | a404b612 | Eduardo Habkost | |
22 | a404b612 | Eduardo Habkost | static void get_pointer(Object *obj, Visitor *v, Property *prop, |
23 | a404b612 | Eduardo Habkost | const char *(*print)(void *ptr), |
24 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
25 | a404b612 | Eduardo Habkost | { |
26 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
27 | a404b612 | Eduardo Habkost | void **ptr = qdev_get_prop_ptr(dev, prop);
|
28 | a404b612 | Eduardo Habkost | char *p;
|
29 | a404b612 | Eduardo Habkost | |
30 | a404b612 | Eduardo Habkost | p = (char *) (*ptr ? print(*ptr) : ""); |
31 | a404b612 | Eduardo Habkost | visit_type_str(v, &p, name, errp); |
32 | a404b612 | Eduardo Habkost | } |
33 | a404b612 | Eduardo Habkost | |
34 | a404b612 | Eduardo Habkost | static void set_pointer(Object *obj, Visitor *v, Property *prop, |
35 | a404b612 | Eduardo Habkost | int (*parse)(DeviceState *dev, const char *str, |
36 | a404b612 | Eduardo Habkost | void **ptr),
|
37 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
38 | a404b612 | Eduardo Habkost | { |
39 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
40 | a404b612 | Eduardo Habkost | Error *local_err = NULL;
|
41 | a404b612 | Eduardo Habkost | void **ptr = qdev_get_prop_ptr(dev, prop);
|
42 | a404b612 | Eduardo Habkost | char *str;
|
43 | a404b612 | Eduardo Habkost | int ret;
|
44 | a404b612 | Eduardo Habkost | |
45 | 7983c8a3 | Andreas Färber | if (dev->realized) {
|
46 | b000dfbd | Peter Maydell | qdev_prop_set_after_realize(dev, name, errp); |
47 | a404b612 | Eduardo Habkost | return;
|
48 | a404b612 | Eduardo Habkost | } |
49 | a404b612 | Eduardo Habkost | |
50 | a404b612 | Eduardo Habkost | visit_type_str(v, &str, name, &local_err); |
51 | a404b612 | Eduardo Habkost | if (local_err) {
|
52 | a404b612 | Eduardo Habkost | error_propagate(errp, local_err); |
53 | a404b612 | Eduardo Habkost | return;
|
54 | a404b612 | Eduardo Habkost | } |
55 | a404b612 | Eduardo Habkost | if (!*str) {
|
56 | a404b612 | Eduardo Habkost | g_free(str); |
57 | a404b612 | Eduardo Habkost | *ptr = NULL;
|
58 | a404b612 | Eduardo Habkost | return;
|
59 | a404b612 | Eduardo Habkost | } |
60 | a404b612 | Eduardo Habkost | ret = parse(dev, str, ptr); |
61 | a404b612 | Eduardo Habkost | error_set_from_qdev_prop_error(errp, ret, dev, prop, str); |
62 | a404b612 | Eduardo Habkost | g_free(str); |
63 | a404b612 | Eduardo Habkost | } |
64 | a404b612 | Eduardo Habkost | |
65 | a404b612 | Eduardo Habkost | /* --- drive --- */
|
66 | a404b612 | Eduardo Habkost | |
67 | a404b612 | Eduardo Habkost | static int parse_drive(DeviceState *dev, const char *str, void **ptr) |
68 | a404b612 | Eduardo Habkost | { |
69 | a404b612 | Eduardo Habkost | BlockDriverState *bs; |
70 | a404b612 | Eduardo Habkost | |
71 | a404b612 | Eduardo Habkost | bs = bdrv_find(str); |
72 | a404b612 | Eduardo Habkost | if (bs == NULL) { |
73 | a404b612 | Eduardo Habkost | return -ENOENT;
|
74 | a404b612 | Eduardo Habkost | } |
75 | a404b612 | Eduardo Habkost | if (bdrv_attach_dev(bs, dev) < 0) { |
76 | a404b612 | Eduardo Habkost | return -EEXIST;
|
77 | a404b612 | Eduardo Habkost | } |
78 | a404b612 | Eduardo Habkost | *ptr = bs; |
79 | a404b612 | Eduardo Habkost | return 0; |
80 | a404b612 | Eduardo Habkost | } |
81 | a404b612 | Eduardo Habkost | |
82 | a404b612 | Eduardo Habkost | static void release_drive(Object *obj, const char *name, void *opaque) |
83 | a404b612 | Eduardo Habkost | { |
84 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
85 | a404b612 | Eduardo Habkost | Property *prop = opaque; |
86 | a404b612 | Eduardo Habkost | BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop); |
87 | a404b612 | Eduardo Habkost | |
88 | a404b612 | Eduardo Habkost | if (*ptr) {
|
89 | a404b612 | Eduardo Habkost | bdrv_detach_dev(*ptr, dev); |
90 | a404b612 | Eduardo Habkost | blockdev_auto_del(*ptr); |
91 | a404b612 | Eduardo Habkost | } |
92 | a404b612 | Eduardo Habkost | } |
93 | a404b612 | Eduardo Habkost | |
94 | a404b612 | Eduardo Habkost | static const char *print_drive(void *ptr) |
95 | a404b612 | Eduardo Habkost | { |
96 | a404b612 | Eduardo Habkost | return bdrv_get_device_name(ptr);
|
97 | a404b612 | Eduardo Habkost | } |
98 | a404b612 | Eduardo Habkost | |
99 | a404b612 | Eduardo Habkost | static void get_drive(Object *obj, Visitor *v, void *opaque, |
100 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
101 | a404b612 | Eduardo Habkost | { |
102 | a404b612 | Eduardo Habkost | get_pointer(obj, v, opaque, print_drive, name, errp); |
103 | a404b612 | Eduardo Habkost | } |
104 | a404b612 | Eduardo Habkost | |
105 | a404b612 | Eduardo Habkost | static void set_drive(Object *obj, Visitor *v, void *opaque, |
106 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
107 | a404b612 | Eduardo Habkost | { |
108 | a404b612 | Eduardo Habkost | set_pointer(obj, v, opaque, parse_drive, name, errp); |
109 | a404b612 | Eduardo Habkost | } |
110 | a404b612 | Eduardo Habkost | |
111 | a404b612 | Eduardo Habkost | PropertyInfo qdev_prop_drive = { |
112 | a404b612 | Eduardo Habkost | .name = "drive",
|
113 | a404b612 | Eduardo Habkost | .get = get_drive, |
114 | a404b612 | Eduardo Habkost | .set = set_drive, |
115 | a404b612 | Eduardo Habkost | .release = release_drive, |
116 | a404b612 | Eduardo Habkost | }; |
117 | a404b612 | Eduardo Habkost | |
118 | a404b612 | Eduardo Habkost | /* --- character device --- */
|
119 | a404b612 | Eduardo Habkost | |
120 | a404b612 | Eduardo Habkost | static int parse_chr(DeviceState *dev, const char *str, void **ptr) |
121 | a404b612 | Eduardo Habkost | { |
122 | a404b612 | Eduardo Habkost | CharDriverState *chr = qemu_chr_find(str); |
123 | a404b612 | Eduardo Habkost | if (chr == NULL) { |
124 | a404b612 | Eduardo Habkost | return -ENOENT;
|
125 | a404b612 | Eduardo Habkost | } |
126 | 44c473de | Hans de Goede | if (qemu_chr_fe_claim(chr) != 0) { |
127 | a404b612 | Eduardo Habkost | return -EEXIST;
|
128 | a404b612 | Eduardo Habkost | } |
129 | a404b612 | Eduardo Habkost | *ptr = chr; |
130 | a404b612 | Eduardo Habkost | return 0; |
131 | a404b612 | Eduardo Habkost | } |
132 | a404b612 | Eduardo Habkost | |
133 | a404b612 | Eduardo Habkost | static void release_chr(Object *obj, const char *name, void *opaque) |
134 | a404b612 | Eduardo Habkost | { |
135 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
136 | a404b612 | Eduardo Habkost | Property *prop = opaque; |
137 | a404b612 | Eduardo Habkost | CharDriverState **ptr = qdev_get_prop_ptr(dev, prop); |
138 | 85d91e32 | Hans de Goede | CharDriverState *chr = *ptr; |
139 | a404b612 | Eduardo Habkost | |
140 | 85d91e32 | Hans de Goede | if (chr) {
|
141 | 85d91e32 | Hans de Goede | qemu_chr_add_handlers(chr, NULL, NULL, NULL, NULL); |
142 | 44c473de | Hans de Goede | qemu_chr_fe_release(chr); |
143 | a404b612 | Eduardo Habkost | } |
144 | a404b612 | Eduardo Habkost | } |
145 | a404b612 | Eduardo Habkost | |
146 | a404b612 | Eduardo Habkost | |
147 | a404b612 | Eduardo Habkost | static const char *print_chr(void *ptr) |
148 | a404b612 | Eduardo Habkost | { |
149 | a404b612 | Eduardo Habkost | CharDriverState *chr = ptr; |
150 | a404b612 | Eduardo Habkost | |
151 | a404b612 | Eduardo Habkost | return chr->label ? chr->label : ""; |
152 | a404b612 | Eduardo Habkost | } |
153 | a404b612 | Eduardo Habkost | |
154 | a404b612 | Eduardo Habkost | static void get_chr(Object *obj, Visitor *v, void *opaque, |
155 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
156 | a404b612 | Eduardo Habkost | { |
157 | a404b612 | Eduardo Habkost | get_pointer(obj, v, opaque, print_chr, name, errp); |
158 | a404b612 | Eduardo Habkost | } |
159 | a404b612 | Eduardo Habkost | |
160 | a404b612 | Eduardo Habkost | static void set_chr(Object *obj, Visitor *v, void *opaque, |
161 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
162 | a404b612 | Eduardo Habkost | { |
163 | a404b612 | Eduardo Habkost | set_pointer(obj, v, opaque, parse_chr, name, errp); |
164 | a404b612 | Eduardo Habkost | } |
165 | a404b612 | Eduardo Habkost | |
166 | a404b612 | Eduardo Habkost | PropertyInfo qdev_prop_chr = { |
167 | a404b612 | Eduardo Habkost | .name = "chr",
|
168 | a404b612 | Eduardo Habkost | .get = get_chr, |
169 | a404b612 | Eduardo Habkost | .set = set_chr, |
170 | a404b612 | Eduardo Habkost | .release = release_chr, |
171 | a404b612 | Eduardo Habkost | }; |
172 | a404b612 | Eduardo Habkost | |
173 | a404b612 | Eduardo Habkost | /* --- netdev device --- */
|
174 | a404b612 | Eduardo Habkost | |
175 | a404b612 | Eduardo Habkost | static int parse_netdev(DeviceState *dev, const char *str, void **ptr) |
176 | a404b612 | Eduardo Habkost | { |
177 | 1ceef9f2 | Jason Wang | NICPeers *peers_ptr = (NICPeers *)ptr; |
178 | 1ceef9f2 | Jason Wang | NICConf *conf = container_of(peers_ptr, NICConf, peers); |
179 | 1ceef9f2 | Jason Wang | NetClientState **ncs = peers_ptr->ncs; |
180 | 1ceef9f2 | Jason Wang | NetClientState *peers[MAX_QUEUE_NUM]; |
181 | 1ceef9f2 | Jason Wang | int queues, i = 0; |
182 | 1ceef9f2 | Jason Wang | int ret;
|
183 | a404b612 | Eduardo Habkost | |
184 | 1ceef9f2 | Jason Wang | queues = qemu_find_net_clients_except(str, peers, |
185 | 1ceef9f2 | Jason Wang | NET_CLIENT_OPTIONS_KIND_NIC, |
186 | 1ceef9f2 | Jason Wang | MAX_QUEUE_NUM); |
187 | 1ceef9f2 | Jason Wang | if (queues == 0) { |
188 | 1ceef9f2 | Jason Wang | ret = -ENOENT; |
189 | 1ceef9f2 | Jason Wang | goto err;
|
190 | a404b612 | Eduardo Habkost | } |
191 | 1ceef9f2 | Jason Wang | |
192 | 1ceef9f2 | Jason Wang | if (queues > MAX_QUEUE_NUM) {
|
193 | 1ceef9f2 | Jason Wang | ret = -E2BIG; |
194 | 1ceef9f2 | Jason Wang | goto err;
|
195 | 1ceef9f2 | Jason Wang | } |
196 | 1ceef9f2 | Jason Wang | |
197 | 1ceef9f2 | Jason Wang | for (i = 0; i < queues; i++) { |
198 | 1ceef9f2 | Jason Wang | if (peers[i] == NULL) { |
199 | 1ceef9f2 | Jason Wang | ret = -ENOENT; |
200 | 1ceef9f2 | Jason Wang | goto err;
|
201 | 1ceef9f2 | Jason Wang | } |
202 | 1ceef9f2 | Jason Wang | |
203 | 1ceef9f2 | Jason Wang | if (peers[i]->peer) {
|
204 | 1ceef9f2 | Jason Wang | ret = -EEXIST; |
205 | 1ceef9f2 | Jason Wang | goto err;
|
206 | 1ceef9f2 | Jason Wang | } |
207 | 1ceef9f2 | Jason Wang | |
208 | 1ceef9f2 | Jason Wang | ncs[i] = peers[i]; |
209 | 1ceef9f2 | Jason Wang | ncs[i]->queue_index = i; |
210 | a404b612 | Eduardo Habkost | } |
211 | 1ceef9f2 | Jason Wang | |
212 | 1ceef9f2 | Jason Wang | conf->queues = queues; |
213 | 1ceef9f2 | Jason Wang | |
214 | a404b612 | Eduardo Habkost | return 0; |
215 | 1ceef9f2 | Jason Wang | |
216 | 1ceef9f2 | Jason Wang | err:
|
217 | 1ceef9f2 | Jason Wang | return ret;
|
218 | a404b612 | Eduardo Habkost | } |
219 | a404b612 | Eduardo Habkost | |
220 | a404b612 | Eduardo Habkost | static const char *print_netdev(void *ptr) |
221 | a404b612 | Eduardo Habkost | { |
222 | a404b612 | Eduardo Habkost | NetClientState *netdev = ptr; |
223 | a404b612 | Eduardo Habkost | |
224 | a404b612 | Eduardo Habkost | return netdev->name ? netdev->name : ""; |
225 | a404b612 | Eduardo Habkost | } |
226 | a404b612 | Eduardo Habkost | |
227 | a404b612 | Eduardo Habkost | static void get_netdev(Object *obj, Visitor *v, void *opaque, |
228 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
229 | a404b612 | Eduardo Habkost | { |
230 | a404b612 | Eduardo Habkost | get_pointer(obj, v, opaque, print_netdev, name, errp); |
231 | a404b612 | Eduardo Habkost | } |
232 | a404b612 | Eduardo Habkost | |
233 | a404b612 | Eduardo Habkost | static void set_netdev(Object *obj, Visitor *v, void *opaque, |
234 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
235 | a404b612 | Eduardo Habkost | { |
236 | a404b612 | Eduardo Habkost | set_pointer(obj, v, opaque, parse_netdev, name, errp); |
237 | a404b612 | Eduardo Habkost | } |
238 | a404b612 | Eduardo Habkost | |
239 | a404b612 | Eduardo Habkost | PropertyInfo qdev_prop_netdev = { |
240 | a404b612 | Eduardo Habkost | .name = "netdev",
|
241 | a404b612 | Eduardo Habkost | .get = get_netdev, |
242 | a404b612 | Eduardo Habkost | .set = set_netdev, |
243 | a404b612 | Eduardo Habkost | }; |
244 | a404b612 | Eduardo Habkost | |
245 | a404b612 | Eduardo Habkost | /* --- vlan --- */
|
246 | a404b612 | Eduardo Habkost | |
247 | a404b612 | Eduardo Habkost | static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len) |
248 | a404b612 | Eduardo Habkost | { |
249 | a404b612 | Eduardo Habkost | NetClientState **ptr = qdev_get_prop_ptr(dev, prop); |
250 | a404b612 | Eduardo Habkost | |
251 | a404b612 | Eduardo Habkost | if (*ptr) {
|
252 | a404b612 | Eduardo Habkost | int id;
|
253 | a404b612 | Eduardo Habkost | if (!net_hub_id_for_client(*ptr, &id)) {
|
254 | a404b612 | Eduardo Habkost | return snprintf(dest, len, "%d", id); |
255 | a404b612 | Eduardo Habkost | } |
256 | a404b612 | Eduardo Habkost | } |
257 | a404b612 | Eduardo Habkost | |
258 | a404b612 | Eduardo Habkost | return snprintf(dest, len, "<null>"); |
259 | a404b612 | Eduardo Habkost | } |
260 | a404b612 | Eduardo Habkost | |
261 | a404b612 | Eduardo Habkost | static void get_vlan(Object *obj, Visitor *v, void *opaque, |
262 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
263 | a404b612 | Eduardo Habkost | { |
264 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
265 | a404b612 | Eduardo Habkost | Property *prop = opaque; |
266 | a404b612 | Eduardo Habkost | NetClientState **ptr = qdev_get_prop_ptr(dev, prop); |
267 | a404b612 | Eduardo Habkost | int32_t id = -1;
|
268 | a404b612 | Eduardo Habkost | |
269 | a404b612 | Eduardo Habkost | if (*ptr) {
|
270 | a404b612 | Eduardo Habkost | int hub_id;
|
271 | a404b612 | Eduardo Habkost | if (!net_hub_id_for_client(*ptr, &hub_id)) {
|
272 | a404b612 | Eduardo Habkost | id = hub_id; |
273 | a404b612 | Eduardo Habkost | } |
274 | a404b612 | Eduardo Habkost | } |
275 | a404b612 | Eduardo Habkost | |
276 | a404b612 | Eduardo Habkost | visit_type_int32(v, &id, name, errp); |
277 | a404b612 | Eduardo Habkost | } |
278 | a404b612 | Eduardo Habkost | |
279 | a404b612 | Eduardo Habkost | static void set_vlan(Object *obj, Visitor *v, void *opaque, |
280 | a404b612 | Eduardo Habkost | const char *name, Error **errp) |
281 | a404b612 | Eduardo Habkost | { |
282 | a404b612 | Eduardo Habkost | DeviceState *dev = DEVICE(obj); |
283 | a404b612 | Eduardo Habkost | Property *prop = opaque; |
284 | 1ceef9f2 | Jason Wang | NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop); |
285 | 1ceef9f2 | Jason Wang | NetClientState **ptr = &peers_ptr->ncs[0];
|
286 | a404b612 | Eduardo Habkost | Error *local_err = NULL;
|
287 | a404b612 | Eduardo Habkost | int32_t id; |
288 | a404b612 | Eduardo Habkost | NetClientState *hubport; |
289 | a404b612 | Eduardo Habkost | |
290 | 7983c8a3 | Andreas Färber | if (dev->realized) {
|
291 | b000dfbd | Peter Maydell | qdev_prop_set_after_realize(dev, name, errp); |
292 | a404b612 | Eduardo Habkost | return;
|
293 | a404b612 | Eduardo Habkost | } |
294 | a404b612 | Eduardo Habkost | |
295 | a404b612 | Eduardo Habkost | visit_type_int32(v, &id, name, &local_err); |
296 | a404b612 | Eduardo Habkost | if (local_err) {
|
297 | a404b612 | Eduardo Habkost | error_propagate(errp, local_err); |
298 | a404b612 | Eduardo Habkost | return;
|
299 | a404b612 | Eduardo Habkost | } |
300 | a404b612 | Eduardo Habkost | if (id == -1) { |
301 | a404b612 | Eduardo Habkost | *ptr = NULL;
|
302 | a404b612 | Eduardo Habkost | return;
|
303 | a404b612 | Eduardo Habkost | } |
304 | a404b612 | Eduardo Habkost | |
305 | a404b612 | Eduardo Habkost | hubport = net_hub_port_find(id); |
306 | a404b612 | Eduardo Habkost | if (!hubport) {
|
307 | a404b612 | Eduardo Habkost | error_set(errp, QERR_INVALID_PARAMETER_VALUE, |
308 | a404b612 | Eduardo Habkost | name, prop->info->name); |
309 | a404b612 | Eduardo Habkost | return;
|
310 | a404b612 | Eduardo Habkost | } |
311 | a404b612 | Eduardo Habkost | *ptr = hubport; |
312 | a404b612 | Eduardo Habkost | } |
313 | a404b612 | Eduardo Habkost | |
314 | a404b612 | Eduardo Habkost | PropertyInfo qdev_prop_vlan = { |
315 | a404b612 | Eduardo Habkost | .name = "vlan",
|
316 | a404b612 | Eduardo Habkost | .print = print_vlan, |
317 | a404b612 | Eduardo Habkost | .get = get_vlan, |
318 | a404b612 | Eduardo Habkost | .set = set_vlan, |
319 | a404b612 | Eduardo Habkost | }; |
320 | a404b612 | Eduardo Habkost | |
321 | a404b612 | Eduardo Habkost | int qdev_prop_set_drive(DeviceState *dev, const char *name, |
322 | a404b612 | Eduardo Habkost | BlockDriverState *value) |
323 | a404b612 | Eduardo Habkost | { |
324 | a404b612 | Eduardo Habkost | Error *errp = NULL;
|
325 | a404b612 | Eduardo Habkost | const char *bdrv_name = value ? bdrv_get_device_name(value) : ""; |
326 | a404b612 | Eduardo Habkost | object_property_set_str(OBJECT(dev), bdrv_name, |
327 | a404b612 | Eduardo Habkost | name, &errp); |
328 | a404b612 | Eduardo Habkost | if (errp) {
|
329 | a404b612 | Eduardo Habkost | qerror_report_err(errp); |
330 | a404b612 | Eduardo Habkost | error_free(errp); |
331 | a404b612 | Eduardo Habkost | return -1; |
332 | a404b612 | Eduardo Habkost | } |
333 | a404b612 | Eduardo Habkost | return 0; |
334 | a404b612 | Eduardo Habkost | } |
335 | a404b612 | Eduardo Habkost | |
336 | a404b612 | Eduardo Habkost | void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, |
337 | a404b612 | Eduardo Habkost | BlockDriverState *value) |
338 | a404b612 | Eduardo Habkost | { |
339 | a404b612 | Eduardo Habkost | if (qdev_prop_set_drive(dev, name, value) < 0) { |
340 | a404b612 | Eduardo Habkost | exit(1);
|
341 | a404b612 | Eduardo Habkost | } |
342 | a404b612 | Eduardo Habkost | } |
343 | a404b612 | Eduardo Habkost | void qdev_prop_set_chr(DeviceState *dev, const char *name, |
344 | a404b612 | Eduardo Habkost | CharDriverState *value) |
345 | a404b612 | Eduardo Habkost | { |
346 | a404b612 | Eduardo Habkost | Error *errp = NULL;
|
347 | a404b612 | Eduardo Habkost | assert(!value || value->label); |
348 | a404b612 | Eduardo Habkost | object_property_set_str(OBJECT(dev), |
349 | a404b612 | Eduardo Habkost | value ? value->label : "", name, &errp);
|
350 | a404b612 | Eduardo Habkost | assert_no_error(errp); |
351 | a404b612 | Eduardo Habkost | } |
352 | a404b612 | Eduardo Habkost | |
353 | a404b612 | Eduardo Habkost | void qdev_prop_set_netdev(DeviceState *dev, const char *name, |
354 | a404b612 | Eduardo Habkost | NetClientState *value) |
355 | a404b612 | Eduardo Habkost | { |
356 | a404b612 | Eduardo Habkost | Error *errp = NULL;
|
357 | a404b612 | Eduardo Habkost | assert(!value || value->name); |
358 | a404b612 | Eduardo Habkost | object_property_set_str(OBJECT(dev), |
359 | a404b612 | Eduardo Habkost | value ? value->name : "", name, &errp);
|
360 | a404b612 | Eduardo Habkost | assert_no_error(errp); |
361 | a404b612 | Eduardo Habkost | } |
362 | a404b612 | Eduardo Habkost | |
363 | a404b612 | Eduardo Habkost | void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
|
364 | a404b612 | Eduardo Habkost | { |
365 | a404b612 | Eduardo Habkost | qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
|
366 | a404b612 | Eduardo Habkost | if (nd->netdev) {
|
367 | a404b612 | Eduardo Habkost | qdev_prop_set_netdev(dev, "netdev", nd->netdev);
|
368 | a404b612 | Eduardo Habkost | } |
369 | a404b612 | Eduardo Habkost | if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
|
370 | a404b612 | Eduardo Habkost | object_property_find(OBJECT(dev), "vectors", NULL)) { |
371 | a404b612 | Eduardo Habkost | qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
|
372 | a404b612 | Eduardo Habkost | } |
373 | a404b612 | Eduardo Habkost | nd->instantiated = 1;
|
374 | a404b612 | Eduardo Habkost | } |
375 | a404b612 | Eduardo Habkost | |
376 | a404b612 | Eduardo Habkost | static int qdev_add_one_global(QemuOpts *opts, void *opaque) |
377 | a404b612 | Eduardo Habkost | { |
378 | a404b612 | Eduardo Habkost | GlobalProperty *g; |
379 | a404b612 | Eduardo Habkost | |
380 | a404b612 | Eduardo Habkost | g = g_malloc0(sizeof(*g));
|
381 | a404b612 | Eduardo Habkost | g->driver = qemu_opt_get(opts, "driver");
|
382 | a404b612 | Eduardo Habkost | g->property = qemu_opt_get(opts, "property");
|
383 | a404b612 | Eduardo Habkost | g->value = qemu_opt_get(opts, "value");
|
384 | a404b612 | Eduardo Habkost | qdev_prop_register_global(g); |
385 | a404b612 | Eduardo Habkost | return 0; |
386 | a404b612 | Eduardo Habkost | } |
387 | a404b612 | Eduardo Habkost | |
388 | a404b612 | Eduardo Habkost | void qemu_add_globals(void) |
389 | a404b612 | Eduardo Habkost | { |
390 | a404b612 | Eduardo Habkost | qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL, 0); |
391 | a404b612 | Eduardo Habkost | } |