Statistics
| Branch: | Revision:

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
}