]> git.proxmox.com Git - qemu.git/blob - hw/qdev.c
qdev: split out common init to instance_init
[qemu.git] / hw / qdev.c
1 /*
2 * Dynamic device configuration and creation.
3 *
4 * Copyright (c) 2009 CodeSourcery
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 */
19
20 /* The theory here is that it should be possible to create a machine without
21 knowledge of specific devices. Historically board init routines have
22 passed a bunch of arguments to each device, requiring the board know
23 exactly which device it is dealing with. This file provides an abstract
24 API for device configuration and initialization. Devices will generally
25 inherit from a particular bus (e.g. PCI or I2C) rather than
26 this API directly. */
27
28 #include "net.h"
29 #include "qdev.h"
30 #include "sysemu.h"
31 #include "monitor.h"
32
33 static int qdev_hotplug = 0;
34 static bool qdev_hot_added = false;
35 static bool qdev_hot_removed = false;
36
37 /* This is a nasty hack to allow passing a NULL bus to qdev_create. */
38 static BusState *main_system_bus;
39 static void main_system_bus_create(void);
40
41 static BusState *qbus_find_recursive(BusState *bus, const char *name,
42 const BusInfo *info);
43 static BusState *qbus_find(const char *path);
44
45 /* Register a new device type. */
46 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
47 {
48 DeviceClass *dc = DEVICE_GET_CLASS(dev);
49 return dc->vmsd;
50 }
51
52 BusInfo *qdev_get_bus_info(DeviceState *dev)
53 {
54 DeviceClass *dc = DEVICE_GET_CLASS(dev);
55 return dc->bus_info;
56 }
57
58 Property *qdev_get_props(DeviceState *dev)
59 {
60 DeviceClass *dc = DEVICE_GET_CLASS(dev);
61 return dc->props;
62 }
63
64 /*
65 * Aliases were a bad idea from the start. Let's keep them
66 * from spreading further.
67 */
68 typedef struct QDevAlias
69 {
70 const char *typename;
71 const char *alias;
72 } QDevAlias;
73
74 static const QDevAlias qdev_alias_table[] = {
75 { "virtio-blk-pci", "virtio-blk" },
76 { "virtio-net-pci", "virtio-net" },
77 { "virtio-serial-pci", "virtio-serial" },
78 { "virtio-balloon-pci", "virtio-balloon" },
79 { "virtio-blk-s390", "virtio-blk" },
80 { "virtio-net-s390", "virtio-net" },
81 { "virtio-serial-s390", "virtio-serial" },
82 { "lsi53c895a", "lsi" },
83 { "ich9-ahci", "ahci" },
84 { }
85 };
86
87 static const char *qdev_class_get_alias(DeviceClass *dc)
88 {
89 const char *typename = object_class_get_name(OBJECT_CLASS(dc));
90 int i;
91
92 for (i = 0; qdev_alias_table[i].typename; i++) {
93 if (strcmp(qdev_alias_table[i].typename, typename) == 0) {
94 return qdev_alias_table[i].alias;
95 }
96 }
97
98 return NULL;
99 }
100
101 static bool qdev_class_has_alias(DeviceClass *dc)
102 {
103 return (qdev_class_get_alias(dc) != NULL);
104 }
105
106 const char *qdev_fw_name(DeviceState *dev)
107 {
108 DeviceClass *dc = DEVICE_GET_CLASS(dev);
109
110 if (dc->fw_name) {
111 return dc->fw_name;
112 } else if (qdev_class_has_alias(dc)) {
113 return qdev_class_get_alias(dc);
114 }
115
116 return object_get_typename(OBJECT(dev));
117 }
118
119 bool qdev_exists(const char *name)
120 {
121 return !!object_class_by_name(name);
122 }
123
124 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
125 Error **errp);
126
127 static DeviceState *qdev_create_from_info(BusState *bus, const char *typename)
128 {
129 DeviceState *dev;
130 Property *prop;
131
132 dev = DEVICE(object_new(typename));
133
134 dev->parent_bus = bus;
135 qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
136
137 if (qdev_hotplug) {
138 assert(bus->allow_hotplug);
139 }
140
141 QTAILQ_INSERT_HEAD(&bus->children, dev, sibling);
142
143 for (prop = qdev_get_bus_info(dev)->props; prop && prop->name; prop++) {
144 qdev_property_add_legacy(dev, prop, NULL);
145 qdev_property_add_static(dev, prop, NULL);
146 }
147
148 qdev_prop_set_globals(dev);
149
150 return dev;
151 }
152
153 /* Create a new device. This only initializes the device state structure
154 and allows properties to be set. qdev_init should be called to
155 initialize the actual device emulation. */
156 DeviceState *qdev_create(BusState *bus, const char *name)
157 {
158 DeviceState *dev;
159
160 dev = qdev_try_create(bus, name);
161 if (!dev) {
162 if (bus) {
163 hw_error("Unknown device '%s' for bus '%s'\n", name,
164 bus->info->name);
165 } else {
166 hw_error("Unknown device '%s' for default sysbus\n", name);
167 }
168 }
169
170 return dev;
171 }
172
173 DeviceState *qdev_try_create(BusState *bus, const char *name)
174 {
175 if (!bus) {
176 bus = sysbus_get_default();
177 }
178
179 return qdev_create_from_info(bus, name);
180 }
181
182 static void qdev_print_devinfo(ObjectClass *klass, void *opaque)
183 {
184 DeviceClass *dc;
185 bool *show_no_user = opaque;
186
187 dc = (DeviceClass *)object_class_dynamic_cast(klass, TYPE_DEVICE);
188
189 if (!dc || (show_no_user && !*show_no_user && dc->no_user)) {
190 return;
191 }
192
193 error_printf("name \"%s\"", object_class_get_name(klass));
194 if (dc->bus_info) {
195 error_printf(", bus %s", dc->bus_info->name);
196 }
197 if (qdev_class_has_alias(dc)) {
198 error_printf(", alias \"%s\"", qdev_class_get_alias(dc));
199 }
200 if (dc->desc) {
201 error_printf(", desc \"%s\"", dc->desc);
202 }
203 if (dc->no_user) {
204 error_printf(", no-user");
205 }
206 error_printf("\n");
207 }
208
209 static int set_property(const char *name, const char *value, void *opaque)
210 {
211 DeviceState *dev = opaque;
212
213 if (strcmp(name, "driver") == 0)
214 return 0;
215 if (strcmp(name, "bus") == 0)
216 return 0;
217
218 if (qdev_prop_parse(dev, name, value) == -1) {
219 return -1;
220 }
221 return 0;
222 }
223
224 static const char *find_typename_by_alias(const char *alias)
225 {
226 int i;
227
228 for (i = 0; qdev_alias_table[i].alias; i++) {
229 if (strcmp(qdev_alias_table[i].alias, alias) == 0) {
230 return qdev_alias_table[i].typename;
231 }
232 }
233
234 return NULL;
235 }
236
237 int qdev_device_help(QemuOpts *opts)
238 {
239 const char *driver;
240 Property *prop;
241 ObjectClass *klass;
242 DeviceClass *info;
243
244 driver = qemu_opt_get(opts, "driver");
245 if (driver && !strcmp(driver, "?")) {
246 bool show_no_user = false;
247 object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, &show_no_user);
248 return 1;
249 }
250
251 if (!driver || !qemu_opt_get(opts, "?")) {
252 return 0;
253 }
254
255 klass = object_class_by_name(driver);
256 if (!klass) {
257 const char *typename = find_typename_by_alias(driver);
258
259 if (typename) {
260 driver = typename;
261 klass = object_class_by_name(driver);
262 }
263 }
264
265 if (!klass) {
266 return 0;
267 }
268 info = DEVICE_CLASS(klass);
269
270 for (prop = info->props; prop && prop->name; prop++) {
271 /*
272 * TODO Properties without a parser are just for dirty hacks.
273 * qdev_prop_ptr is the only such PropertyInfo. It's marked
274 * for removal. This conditional should be removed along with
275 * it.
276 */
277 if (!prop->info->parse) {
278 continue; /* no way to set it, don't show */
279 }
280 error_printf("%s.%s=%s\n", driver, prop->name,
281 prop->info->legacy_name ?: prop->info->name);
282 }
283 for (prop = info->bus_info->props; prop && prop->name; prop++) {
284 if (!prop->info->parse) {
285 continue; /* no way to set it, don't show */
286 }
287 error_printf("%s.%s=%s\n", driver, prop->name,
288 prop->info->legacy_name ?: prop->info->name);
289 }
290 return 1;
291 }
292
293 static DeviceState *qdev_get_peripheral(void)
294 {
295 static DeviceState *dev;
296
297 if (dev == NULL) {
298 dev = qdev_create(NULL, "container");
299 qdev_property_add_child(qdev_get_root(), "peripheral", dev, NULL);
300 qdev_init_nofail(dev);
301 }
302
303 return dev;
304 }
305
306 static DeviceState *qdev_get_peripheral_anon(void)
307 {
308 static DeviceState *dev;
309
310 if (dev == NULL) {
311 dev = qdev_create(NULL, "container");
312 qdev_property_add_child(qdev_get_root(), "peripheral-anon", dev, NULL);
313 qdev_init_nofail(dev);
314 }
315
316 return dev;
317 }
318
319 DeviceState *qdev_device_add(QemuOpts *opts)
320 {
321 ObjectClass *obj;
322 DeviceClass *k;
323 const char *driver, *path, *id;
324 DeviceState *qdev;
325 BusState *bus;
326
327 driver = qemu_opt_get(opts, "driver");
328 if (!driver) {
329 qerror_report(QERR_MISSING_PARAMETER, "driver");
330 return NULL;
331 }
332
333 /* find driver */
334 obj = object_class_by_name(driver);
335 if (!obj) {
336 const char *typename = find_typename_by_alias(driver);
337
338 if (typename) {
339 driver = typename;
340 obj = object_class_by_name(driver);
341 }
342 }
343
344 if (!obj) {
345 qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "device type");
346 return NULL;
347 }
348
349 k = DEVICE_CLASS(obj);
350
351 /* find bus */
352 path = qemu_opt_get(opts, "bus");
353 if (path != NULL) {
354 bus = qbus_find(path);
355 if (!bus) {
356 return NULL;
357 }
358 if (bus->info != k->bus_info) {
359 qerror_report(QERR_BAD_BUS_FOR_DEVICE,
360 driver, bus->info->name);
361 return NULL;
362 }
363 } else {
364 bus = qbus_find_recursive(main_system_bus, NULL, k->bus_info);
365 if (!bus) {
366 qerror_report(QERR_NO_BUS_FOR_DEVICE,
367 driver, k->bus_info->name);
368 return NULL;
369 }
370 }
371 if (qdev_hotplug && !bus->allow_hotplug) {
372 qerror_report(QERR_BUS_NO_HOTPLUG, bus->name);
373 return NULL;
374 }
375
376 /* create device, set properties */
377 qdev = qdev_create_from_info(bus, driver);
378 id = qemu_opts_id(opts);
379 if (id) {
380 qdev->id = id;
381 qdev_property_add_child(qdev_get_peripheral(), qdev->id, qdev, NULL);
382 } else {
383 static int anon_count;
384 gchar *name = g_strdup_printf("device[%d]", anon_count++);
385 qdev_property_add_child(qdev_get_peripheral_anon(), name,
386 qdev, NULL);
387 g_free(name);
388 }
389 if (qemu_opt_foreach(opts, set_property, qdev, 1) != 0) {
390 qdev_free(qdev);
391 return NULL;
392 }
393 if (qdev_init(qdev) < 0) {
394 qerror_report(QERR_DEVICE_INIT_FAILED, driver);
395 return NULL;
396 }
397 qdev->opts = opts;
398 return qdev;
399 }
400
401 /* Initialize a device. Device properties should be set before calling
402 this function. IRQs and MMIO regions should be connected/mapped after
403 calling this function.
404 On failure, destroy the device and return negative value.
405 Return 0 on success. */
406 int qdev_init(DeviceState *dev)
407 {
408 DeviceClass *dc = DEVICE_GET_CLASS(dev);
409 int rc;
410
411 assert(dev->state == DEV_STATE_CREATED);
412
413 rc = dc->init(dev);
414 if (rc < 0) {
415 qdev_free(dev);
416 return rc;
417 }
418 if (qdev_get_vmsd(dev)) {
419 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
420 dev->instance_id_alias,
421 dev->alias_required_for_version);
422 }
423 dev->state = DEV_STATE_INITIALIZED;
424 if (dev->hotplugged) {
425 device_reset(dev);
426 }
427 return 0;
428 }
429
430 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
431 int required_for_version)
432 {
433 assert(dev->state == DEV_STATE_CREATED);
434 dev->instance_id_alias = alias_id;
435 dev->alias_required_for_version = required_for_version;
436 }
437
438 int qdev_unplug(DeviceState *dev)
439 {
440 DeviceClass *dc = DEVICE_GET_CLASS(dev);
441
442 if (!dev->parent_bus->allow_hotplug) {
443 qerror_report(QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
444 return -1;
445 }
446 assert(dc->unplug != NULL);
447
448 qdev_hot_removed = true;
449
450 return dc->unplug(dev);
451 }
452
453 static int qdev_reset_one(DeviceState *dev, void *opaque)
454 {
455 device_reset(dev);
456
457 return 0;
458 }
459
460 BusState *sysbus_get_default(void)
461 {
462 if (!main_system_bus) {
463 main_system_bus_create();
464 }
465 return main_system_bus;
466 }
467
468 static int qbus_reset_one(BusState *bus, void *opaque)
469 {
470 if (bus->info->reset) {
471 return bus->info->reset(bus);
472 }
473 return 0;
474 }
475
476 void qdev_reset_all(DeviceState *dev)
477 {
478 qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL);
479 }
480
481 void qbus_reset_all_fn(void *opaque)
482 {
483 BusState *bus = opaque;
484 qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL);
485 }
486
487 /* can be used as ->unplug() callback for the simple cases */
488 int qdev_simple_unplug_cb(DeviceState *dev)
489 {
490 /* just zap it */
491 qdev_free(dev);
492 return 0;
493 }
494
495
496 /* Like qdev_init(), but terminate program via error_report() instead of
497 returning an error value. This is okay during machine creation.
498 Don't use for hotplug, because there callers need to recover from
499 failure. Exception: if you know the device's init() callback can't
500 fail, then qdev_init_nofail() can't fail either, and is therefore
501 usable even then. But relying on the device implementation that
502 way is somewhat unclean, and best avoided. */
503 void qdev_init_nofail(DeviceState *dev)
504 {
505 if (qdev_init(dev) < 0) {
506 error_report("Initialization of device %s failed",
507 object_get_typename(OBJECT(dev)));
508 exit(1);
509 }
510 }
511
512 static void qdev_property_del_all(DeviceState *dev)
513 {
514 while (!QTAILQ_EMPTY(&dev->properties)) {
515 DeviceProperty *prop = QTAILQ_FIRST(&dev->properties);
516
517 QTAILQ_REMOVE(&dev->properties, prop, node);
518
519 if (prop->release) {
520 prop->release(dev, prop->name, prop->opaque);
521 }
522
523 g_free(prop->name);
524 g_free(prop->type);
525 g_free(prop);
526 }
527 }
528
529 static void qdev_property_del_child(DeviceState *dev, DeviceState *child, Error **errp)
530 {
531 DeviceProperty *prop;
532
533 QTAILQ_FOREACH(prop, &dev->properties, node) {
534 if (strstart(prop->type, "child<", NULL) && prop->opaque == child) {
535 break;
536 }
537 }
538
539 g_assert(prop != NULL);
540
541 QTAILQ_REMOVE(&dev->properties, prop, node);
542
543 if (prop->release) {
544 prop->release(dev, prop->name, prop->opaque);
545 }
546
547 g_free(prop->name);
548 g_free(prop->type);
549 g_free(prop);
550 }
551
552 /* Unlink device from bus and free the structure. */
553 void qdev_free(DeviceState *dev)
554 {
555 BusState *bus;
556 Property *prop;
557 DeviceClass *dc = DEVICE_GET_CLASS(dev);
558
559 qdev_property_del_all(dev);
560
561 if (dev->state == DEV_STATE_INITIALIZED) {
562 while (dev->num_child_bus) {
563 bus = QLIST_FIRST(&dev->child_bus);
564 qbus_free(bus);
565 }
566 if (qdev_get_vmsd(dev)) {
567 vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
568 }
569 if (dc->exit) {
570 dc->exit(dev);
571 }
572 if (dev->opts) {
573 qemu_opts_del(dev->opts);
574 }
575 }
576 QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling);
577 for (prop = qdev_get_props(dev); prop && prop->name; prop++) {
578 if (prop->info->free) {
579 prop->info->free(dev, prop);
580 }
581 }
582 if (dev->parent) {
583 qdev_property_del_child(dev->parent, dev, NULL);
584 }
585 if (dev->ref != 0) {
586 qerror_report(QERR_DEVICE_IN_USE, dev->id?:"");
587 }
588 object_delete(OBJECT(dev));
589 }
590
591 void qdev_machine_creation_done(void)
592 {
593 /*
594 * ok, initial machine setup is done, starting from now we can
595 * only create hotpluggable devices
596 */
597 qdev_hotplug = 1;
598 }
599
600 bool qdev_machine_modified(void)
601 {
602 return qdev_hot_added || qdev_hot_removed;
603 }
604
605 /* Get a character (serial) device interface. */
606 CharDriverState *qdev_init_chardev(DeviceState *dev)
607 {
608 static int next_serial;
609
610 /* FIXME: This function needs to go away: use chardev properties! */
611 return serial_hds[next_serial++];
612 }
613
614 BusState *qdev_get_parent_bus(DeviceState *dev)
615 {
616 return dev->parent_bus;
617 }
618
619 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
620 {
621 assert(dev->num_gpio_in == 0);
622 dev->num_gpio_in = n;
623 dev->gpio_in = qemu_allocate_irqs(handler, dev, n);
624 }
625
626 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
627 {
628 assert(dev->num_gpio_out == 0);
629 dev->num_gpio_out = n;
630 dev->gpio_out = pins;
631 }
632
633 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
634 {
635 assert(n >= 0 && n < dev->num_gpio_in);
636 return dev->gpio_in[n];
637 }
638
639 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
640 {
641 assert(n >= 0 && n < dev->num_gpio_out);
642 dev->gpio_out[n] = pin;
643 }
644
645 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
646 {
647 qdev_prop_set_macaddr(dev, "mac", nd->macaddr.a);
648 if (nd->vlan)
649 qdev_prop_set_vlan(dev, "vlan", nd->vlan);
650 if (nd->netdev)
651 qdev_prop_set_netdev(dev, "netdev", nd->netdev);
652 if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
653 qdev_prop_exists(dev, "vectors")) {
654 qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
655 }
656 nd->instantiated = 1;
657 }
658
659 BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
660 {
661 BusState *bus;
662
663 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
664 if (strcmp(name, bus->name) == 0) {
665 return bus;
666 }
667 }
668 return NULL;
669 }
670
671 int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
672 qbus_walkerfn *busfn, void *opaque)
673 {
674 DeviceState *dev;
675 int err;
676
677 if (busfn) {
678 err = busfn(bus, opaque);
679 if (err) {
680 return err;
681 }
682 }
683
684 QTAILQ_FOREACH(dev, &bus->children, sibling) {
685 err = qdev_walk_children(dev, devfn, busfn, opaque);
686 if (err < 0) {
687 return err;
688 }
689 }
690
691 return 0;
692 }
693
694 int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
695 qbus_walkerfn *busfn, void *opaque)
696 {
697 BusState *bus;
698 int err;
699
700 if (devfn) {
701 err = devfn(dev, opaque);
702 if (err) {
703 return err;
704 }
705 }
706
707 QLIST_FOREACH(bus, &dev->child_bus, sibling) {
708 err = qbus_walk_children(bus, devfn, busfn, opaque);
709 if (err < 0) {
710 return err;
711 }
712 }
713
714 return 0;
715 }
716
717 static BusState *qbus_find_recursive(BusState *bus, const char *name,
718 const BusInfo *info)
719 {
720 DeviceState *dev;
721 BusState *child, *ret;
722 int match = 1;
723
724 if (name && (strcmp(bus->name, name) != 0)) {
725 match = 0;
726 }
727 if (info && (bus->info != info)) {
728 match = 0;
729 }
730 if (match) {
731 return bus;
732 }
733
734 QTAILQ_FOREACH(dev, &bus->children, sibling) {
735 QLIST_FOREACH(child, &dev->child_bus, sibling) {
736 ret = qbus_find_recursive(child, name, info);
737 if (ret) {
738 return ret;
739 }
740 }
741 }
742 return NULL;
743 }
744
745 DeviceState *qdev_find_recursive(BusState *bus, const char *id)
746 {
747 DeviceState *dev, *ret;
748 BusState *child;
749
750 QTAILQ_FOREACH(dev, &bus->children, sibling) {
751 if (dev->id && strcmp(dev->id, id) == 0)
752 return dev;
753 QLIST_FOREACH(child, &dev->child_bus, sibling) {
754 ret = qdev_find_recursive(child, id);
755 if (ret) {
756 return ret;
757 }
758 }
759 }
760 return NULL;
761 }
762
763 static void qbus_list_bus(DeviceState *dev)
764 {
765 BusState *child;
766 const char *sep = " ";
767
768 error_printf("child busses at \"%s\":",
769 dev->id ? dev->id : object_get_typename(OBJECT(dev)));
770 QLIST_FOREACH(child, &dev->child_bus, sibling) {
771 error_printf("%s\"%s\"", sep, child->name);
772 sep = ", ";
773 }
774 error_printf("\n");
775 }
776
777 static void qbus_list_dev(BusState *bus)
778 {
779 DeviceState *dev;
780 const char *sep = " ";
781
782 error_printf("devices at \"%s\":", bus->name);
783 QTAILQ_FOREACH(dev, &bus->children, sibling) {
784 error_printf("%s\"%s\"", sep, object_get_typename(OBJECT(dev)));
785 if (dev->id)
786 error_printf("/\"%s\"", dev->id);
787 sep = ", ";
788 }
789 error_printf("\n");
790 }
791
792 static BusState *qbus_find_bus(DeviceState *dev, char *elem)
793 {
794 BusState *child;
795
796 QLIST_FOREACH(child, &dev->child_bus, sibling) {
797 if (strcmp(child->name, elem) == 0) {
798 return child;
799 }
800 }
801 return NULL;
802 }
803
804 static DeviceState *qbus_find_dev(BusState *bus, char *elem)
805 {
806 DeviceState *dev;
807
808 /*
809 * try to match in order:
810 * (1) instance id, if present
811 * (2) driver name
812 * (3) driver alias, if present
813 */
814 QTAILQ_FOREACH(dev, &bus->children, sibling) {
815 if (dev->id && strcmp(dev->id, elem) == 0) {
816 return dev;
817 }
818 }
819 QTAILQ_FOREACH(dev, &bus->children, sibling) {
820 if (strcmp(object_get_typename(OBJECT(dev)), elem) == 0) {
821 return dev;
822 }
823 }
824 QTAILQ_FOREACH(dev, &bus->children, sibling) {
825 DeviceClass *dc = DEVICE_GET_CLASS(dev);
826
827 if (qdev_class_has_alias(dc) &&
828 strcmp(qdev_class_get_alias(dc), elem) == 0) {
829 return dev;
830 }
831 }
832 return NULL;
833 }
834
835 static BusState *qbus_find(const char *path)
836 {
837 DeviceState *dev;
838 BusState *bus;
839 char elem[128];
840 int pos, len;
841
842 /* find start element */
843 if (path[0] == '/') {
844 bus = main_system_bus;
845 pos = 0;
846 } else {
847 if (sscanf(path, "%127[^/]%n", elem, &len) != 1) {
848 assert(!path[0]);
849 elem[0] = len = 0;
850 }
851 bus = qbus_find_recursive(main_system_bus, elem, NULL);
852 if (!bus) {
853 qerror_report(QERR_BUS_NOT_FOUND, elem);
854 return NULL;
855 }
856 pos = len;
857 }
858
859 for (;;) {
860 assert(path[pos] == '/' || !path[pos]);
861 while (path[pos] == '/') {
862 pos++;
863 }
864 if (path[pos] == '\0') {
865 return bus;
866 }
867
868 /* find device */
869 if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
870 assert(0);
871 elem[0] = len = 0;
872 }
873 pos += len;
874 dev = qbus_find_dev(bus, elem);
875 if (!dev) {
876 qerror_report(QERR_DEVICE_NOT_FOUND, elem);
877 if (!monitor_cur_is_qmp()) {
878 qbus_list_dev(bus);
879 }
880 return NULL;
881 }
882
883 assert(path[pos] == '/' || !path[pos]);
884 while (path[pos] == '/') {
885 pos++;
886 }
887 if (path[pos] == '\0') {
888 /* last specified element is a device. If it has exactly
889 * one child bus accept it nevertheless */
890 switch (dev->num_child_bus) {
891 case 0:
892 qerror_report(QERR_DEVICE_NO_BUS, elem);
893 return NULL;
894 case 1:
895 return QLIST_FIRST(&dev->child_bus);
896 default:
897 qerror_report(QERR_DEVICE_MULTIPLE_BUSSES, elem);
898 if (!monitor_cur_is_qmp()) {
899 qbus_list_bus(dev);
900 }
901 return NULL;
902 }
903 }
904
905 /* find bus */
906 if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
907 assert(0);
908 elem[0] = len = 0;
909 }
910 pos += len;
911 bus = qbus_find_bus(dev, elem);
912 if (!bus) {
913 qerror_report(QERR_BUS_NOT_FOUND, elem);
914 if (!monitor_cur_is_qmp()) {
915 qbus_list_bus(dev);
916 }
917 return NULL;
918 }
919 }
920 }
921
922 void qbus_create_inplace(BusState *bus, BusInfo *info,
923 DeviceState *parent, const char *name)
924 {
925 char *buf;
926 int i,len;
927
928 bus->info = info;
929 bus->parent = parent;
930
931 if (name) {
932 /* use supplied name */
933 bus->name = g_strdup(name);
934 } else if (parent && parent->id) {
935 /* parent device has id -> use it for bus name */
936 len = strlen(parent->id) + 16;
937 buf = g_malloc(len);
938 snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
939 bus->name = buf;
940 } else {
941 /* no id -> use lowercase bus type for bus name */
942 len = strlen(info->name) + 16;
943 buf = g_malloc(len);
944 len = snprintf(buf, len, "%s.%d", info->name,
945 parent ? parent->num_child_bus : 0);
946 for (i = 0; i < len; i++)
947 buf[i] = qemu_tolower(buf[i]);
948 bus->name = buf;
949 }
950
951 QTAILQ_INIT(&bus->children);
952 if (parent) {
953 QLIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
954 parent->num_child_bus++;
955 } else if (bus != main_system_bus) {
956 /* TODO: once all bus devices are qdevified,
957 only reset handler for main_system_bus should be registered here. */
958 qemu_register_reset(qbus_reset_all_fn, bus);
959 }
960 }
961
962 BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
963 {
964 BusState *bus;
965
966 bus = g_malloc0(info->size);
967 bus->qdev_allocated = 1;
968 qbus_create_inplace(bus, info, parent, name);
969 return bus;
970 }
971
972 static void main_system_bus_create(void)
973 {
974 /* assign main_system_bus before qbus_create_inplace()
975 * in order to make "if (bus != main_system_bus)" work */
976 main_system_bus = g_malloc0(system_bus_info.size);
977 main_system_bus->qdev_allocated = 1;
978 qbus_create_inplace(main_system_bus, &system_bus_info, NULL,
979 "main-system-bus");
980 }
981
982 void qbus_free(BusState *bus)
983 {
984 DeviceState *dev;
985
986 while ((dev = QTAILQ_FIRST(&bus->children)) != NULL) {
987 qdev_free(dev);
988 }
989 if (bus->parent) {
990 QLIST_REMOVE(bus, sibling);
991 bus->parent->num_child_bus--;
992 } else {
993 assert(bus != main_system_bus); /* main_system_bus is never freed */
994 qemu_unregister_reset(qbus_reset_all_fn, bus);
995 }
996 g_free((void*)bus->name);
997 if (bus->qdev_allocated) {
998 g_free(bus);
999 }
1000 }
1001
1002 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
1003 static void qbus_print(Monitor *mon, BusState *bus, int indent);
1004
1005 static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
1006 const char *prefix, int indent)
1007 {
1008 char buf[64];
1009
1010 if (!props)
1011 return;
1012 while (props->name) {
1013 /*
1014 * TODO Properties without a print method are just for dirty
1015 * hacks. qdev_prop_ptr is the only such PropertyInfo. It's
1016 * marked for removal. The test props->info->print should be
1017 * removed along with it.
1018 */
1019 if (props->info->print) {
1020 props->info->print(dev, props, buf, sizeof(buf));
1021 qdev_printf("%s-prop: %s = %s\n", prefix, props->name, buf);
1022 }
1023 props++;
1024 }
1025 }
1026
1027 static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
1028 {
1029 BusState *child;
1030 qdev_printf("dev: %s, id \"%s\"\n", object_get_typename(OBJECT(dev)),
1031 dev->id ? dev->id : "");
1032 indent += 2;
1033 if (dev->num_gpio_in) {
1034 qdev_printf("gpio-in %d\n", dev->num_gpio_in);
1035 }
1036 if (dev->num_gpio_out) {
1037 qdev_printf("gpio-out %d\n", dev->num_gpio_out);
1038 }
1039 qdev_print_props(mon, dev, qdev_get_props(dev), "dev", indent);
1040 qdev_print_props(mon, dev, dev->parent_bus->info->props, "bus", indent);
1041 if (dev->parent_bus->info->print_dev)
1042 dev->parent_bus->info->print_dev(mon, dev, indent);
1043 QLIST_FOREACH(child, &dev->child_bus, sibling) {
1044 qbus_print(mon, child, indent);
1045 }
1046 }
1047
1048 static void qbus_print(Monitor *mon, BusState *bus, int indent)
1049 {
1050 struct DeviceState *dev;
1051
1052 qdev_printf("bus: %s\n", bus->name);
1053 indent += 2;
1054 qdev_printf("type %s\n", bus->info->name);
1055 QTAILQ_FOREACH(dev, &bus->children, sibling) {
1056 qdev_print(mon, dev, indent);
1057 }
1058 }
1059 #undef qdev_printf
1060
1061 void do_info_qtree(Monitor *mon)
1062 {
1063 if (main_system_bus)
1064 qbus_print(mon, main_system_bus, 0);
1065 }
1066
1067 void do_info_qdm(Monitor *mon)
1068 {
1069 object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, NULL);
1070 }
1071
1072 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
1073 {
1074 QemuOpts *opts;
1075
1076 opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict);
1077 if (!opts) {
1078 return -1;
1079 }
1080 if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
1081 qemu_opts_del(opts);
1082 return 0;
1083 }
1084 if (!qdev_device_add(opts)) {
1085 qemu_opts_del(opts);
1086 return -1;
1087 }
1088 return 0;
1089 }
1090
1091 int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
1092 {
1093 const char *id = qdict_get_str(qdict, "id");
1094 DeviceState *dev;
1095
1096 dev = qdev_find_recursive(main_system_bus, id);
1097 if (NULL == dev) {
1098 qerror_report(QERR_DEVICE_NOT_FOUND, id);
1099 return -1;
1100 }
1101 return qdev_unplug(dev);
1102 }
1103
1104 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
1105 {
1106 int l = 0;
1107
1108 if (dev && dev->parent_bus) {
1109 char *d;
1110 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
1111 if (dev->parent_bus->info->get_fw_dev_path) {
1112 d = dev->parent_bus->info->get_fw_dev_path(dev);
1113 l += snprintf(p + l, size - l, "%s", d);
1114 g_free(d);
1115 } else {
1116 l += snprintf(p + l, size - l, "%s", object_get_typename(OBJECT(dev)));
1117 }
1118 }
1119 l += snprintf(p + l , size - l, "/");
1120
1121 return l;
1122 }
1123
1124 char* qdev_get_fw_dev_path(DeviceState *dev)
1125 {
1126 char path[128];
1127 int l;
1128
1129 l = qdev_get_fw_dev_path_helper(dev, path, 128);
1130
1131 path[l-1] = '\0';
1132
1133 return strdup(path);
1134 }
1135
1136 char *qdev_get_type(DeviceState *dev, Error **errp)
1137 {
1138 return g_strdup(object_get_typename(OBJECT(dev)));
1139 }
1140
1141 void qdev_ref(DeviceState *dev)
1142 {
1143 dev->ref++;
1144 }
1145
1146 void qdev_unref(DeviceState *dev)
1147 {
1148 g_assert(dev->ref > 0);
1149 dev->ref--;
1150 }
1151
1152 void qdev_property_add(DeviceState *dev, const char *name, const char *type,
1153 DevicePropertyAccessor *get, DevicePropertyAccessor *set,
1154 DevicePropertyRelease *release,
1155 void *opaque, Error **errp)
1156 {
1157 DeviceProperty *prop = g_malloc0(sizeof(*prop));
1158
1159 prop->name = g_strdup(name);
1160 prop->type = g_strdup(type);
1161
1162 prop->get = get;
1163 prop->set = set;
1164 prop->release = release;
1165 prop->opaque = opaque;
1166
1167 QTAILQ_INSERT_TAIL(&dev->properties, prop, node);
1168 }
1169
1170 static DeviceProperty *qdev_property_find(DeviceState *dev, const char *name)
1171 {
1172 DeviceProperty *prop;
1173
1174 QTAILQ_FOREACH(prop, &dev->properties, node) {
1175 if (strcmp(prop->name, name) == 0) {
1176 return prop;
1177 }
1178 }
1179
1180 return NULL;
1181 }
1182
1183 void qdev_property_get(DeviceState *dev, Visitor *v, const char *name,
1184 Error **errp)
1185 {
1186 DeviceProperty *prop = qdev_property_find(dev, name);
1187
1188 if (prop == NULL) {
1189 error_set(errp, QERR_PROPERTY_NOT_FOUND, dev->id?:"", name);
1190 return;
1191 }
1192
1193 if (!prop->get) {
1194 error_set(errp, QERR_PERMISSION_DENIED);
1195 } else {
1196 prop->get(dev, v, prop->opaque, name, errp);
1197 }
1198 }
1199
1200 void qdev_property_set(DeviceState *dev, Visitor *v, const char *name,
1201 Error **errp)
1202 {
1203 DeviceProperty *prop = qdev_property_find(dev, name);
1204
1205 if (prop == NULL) {
1206 error_set(errp, QERR_PROPERTY_NOT_FOUND, dev->id?:"", name);
1207 return;
1208 }
1209
1210 if (!prop->set) {
1211 error_set(errp, QERR_PERMISSION_DENIED);
1212 } else {
1213 prop->set(dev, v, prop->opaque, name, errp);
1214 }
1215 }
1216
1217 const char *qdev_property_get_type(DeviceState *dev, const char *name, Error **errp)
1218 {
1219 DeviceProperty *prop = qdev_property_find(dev, name);
1220
1221 if (prop == NULL) {
1222 error_set(errp, QERR_PROPERTY_NOT_FOUND, dev->id?:"", name);
1223 return NULL;
1224 }
1225
1226 return prop->type;
1227 }
1228
1229 /**
1230 * Legacy property handling
1231 */
1232
1233 static void qdev_get_legacy_property(DeviceState *dev, Visitor *v, void *opaque,
1234 const char *name, Error **errp)
1235 {
1236 Property *prop = opaque;
1237
1238 char buffer[1024];
1239 char *ptr = buffer;
1240
1241 prop->info->print(dev, prop, buffer, sizeof(buffer));
1242 visit_type_str(v, &ptr, name, errp);
1243 }
1244
1245 static void qdev_set_legacy_property(DeviceState *dev, Visitor *v, void *opaque,
1246 const char *name, Error **errp)
1247 {
1248 Property *prop = opaque;
1249 Error *local_err = NULL;
1250 char *ptr = NULL;
1251 int ret;
1252
1253 if (dev->state != DEV_STATE_CREATED) {
1254 error_set(errp, QERR_PERMISSION_DENIED);
1255 return;
1256 }
1257
1258 visit_type_str(v, &ptr, name, &local_err);
1259 if (local_err) {
1260 error_propagate(errp, local_err);
1261 return;
1262 }
1263
1264 ret = prop->info->parse(dev, prop, ptr);
1265 error_set_from_qdev_prop_error(errp, ret, dev, prop, ptr);
1266 g_free(ptr);
1267 }
1268
1269 /**
1270 * @qdev_add_legacy_property - adds a legacy property
1271 *
1272 * Do not use this is new code! Properties added through this interface will
1273 * be given names and types in the "legacy" namespace.
1274 *
1275 * Legacy properties are always processed as strings. The format of the string
1276 * depends on the property type.
1277 */
1278 void qdev_property_add_legacy(DeviceState *dev, Property *prop,
1279 Error **errp)
1280 {
1281 gchar *name, *type;
1282
1283 name = g_strdup_printf("legacy-%s", prop->name);
1284 type = g_strdup_printf("legacy<%s>",
1285 prop->info->legacy_name ?: prop->info->name);
1286
1287 qdev_property_add(dev, name, type,
1288 prop->info->print ? qdev_get_legacy_property : NULL,
1289 prop->info->parse ? qdev_set_legacy_property : NULL,
1290 NULL,
1291 prop, errp);
1292
1293 g_free(type);
1294 g_free(name);
1295 }
1296
1297 /**
1298 * @qdev_property_add_static - add a @Property to a device.
1299 *
1300 * Static properties access data in a struct. The actual type of the
1301 * property and the field depends on the property type.
1302 */
1303 void qdev_property_add_static(DeviceState *dev, Property *prop,
1304 Error **errp)
1305 {
1306 qdev_property_add(dev, prop->name, prop->info->name,
1307 prop->info->get, prop->info->set,
1308 NULL,
1309 prop, errp);
1310 }
1311
1312 DeviceState *qdev_get_root(void)
1313 {
1314 static DeviceState *qdev_root;
1315
1316 if (!qdev_root) {
1317 qdev_root = qdev_create(NULL, "container");
1318 qdev_init_nofail(qdev_root);
1319 }
1320
1321 return qdev_root;
1322 }
1323
1324 static void qdev_get_child_property(DeviceState *dev, Visitor *v, void *opaque,
1325 const char *name, Error **errp)
1326 {
1327 DeviceState *child = opaque;
1328 gchar *path;
1329
1330 path = qdev_get_canonical_path(child);
1331 visit_type_str(v, &path, name, errp);
1332 g_free(path);
1333 }
1334
1335 static void qdev_release_child_property(DeviceState *dev, const char *name,
1336 void *opaque)
1337 {
1338 DeviceState *child = opaque;
1339
1340 qdev_unref(child);
1341 }
1342
1343 void qdev_property_add_child(DeviceState *dev, const char *name,
1344 DeviceState *child, Error **errp)
1345 {
1346 gchar *type;
1347
1348 type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
1349
1350 qdev_property_add(dev, name, type, qdev_get_child_property,
1351 NULL, qdev_release_child_property,
1352 child, errp);
1353
1354 qdev_ref(child);
1355 g_assert(child->parent == NULL);
1356 child->parent = dev;
1357
1358 g_free(type);
1359 }
1360
1361 static void qdev_get_link_property(DeviceState *dev, Visitor *v, void *opaque,
1362 const char *name, Error **errp)
1363 {
1364 DeviceState **child = opaque;
1365 gchar *path;
1366
1367 if (*child) {
1368 path = qdev_get_canonical_path(*child);
1369 visit_type_str(v, &path, name, errp);
1370 g_free(path);
1371 } else {
1372 path = (gchar *)"";
1373 visit_type_str(v, &path, name, errp);
1374 }
1375 }
1376
1377 static void qdev_set_link_property(DeviceState *dev, Visitor *v, void *opaque,
1378 const char *name, Error **errp)
1379 {
1380 DeviceState **child = opaque;
1381 bool ambiguous = false;
1382 const char *type;
1383 char *path;
1384
1385 type = qdev_property_get_type(dev, name, NULL);
1386
1387 visit_type_str(v, &path, name, errp);
1388
1389 if (*child) {
1390 qdev_unref(*child);
1391 }
1392
1393 if (strcmp(path, "") != 0) {
1394 DeviceState *target;
1395
1396 target = qdev_resolve_path(path, &ambiguous);
1397 if (target) {
1398 gchar *target_type;
1399
1400 target_type = g_strdup_printf("link<%s>", object_get_typename(OBJECT(target)));
1401 if (strcmp(target_type, type) == 0) {
1402 *child = target;
1403 qdev_ref(target);
1404 } else {
1405 error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, type);
1406 }
1407
1408 g_free(target_type);
1409 } else {
1410 error_set(errp, QERR_DEVICE_NOT_FOUND, path);
1411 }
1412 } else {
1413 *child = NULL;
1414 }
1415
1416 g_free(path);
1417 }
1418
1419 void qdev_property_add_link(DeviceState *dev, const char *name,
1420 const char *type, DeviceState **child,
1421 Error **errp)
1422 {
1423 gchar *full_type;
1424
1425 full_type = g_strdup_printf("link<%s>", type);
1426
1427 qdev_property_add(dev, name, full_type,
1428 qdev_get_link_property,
1429 qdev_set_link_property,
1430 NULL, child, errp);
1431
1432 g_free(full_type);
1433 }
1434
1435 gchar *qdev_get_canonical_path(DeviceState *dev)
1436 {
1437 DeviceState *root = qdev_get_root();
1438 char *newpath = NULL, *path = NULL;
1439
1440 while (dev != root) {
1441 DeviceProperty *prop = NULL;
1442
1443 g_assert(dev->parent != NULL);
1444
1445 QTAILQ_FOREACH(prop, &dev->parent->properties, node) {
1446 if (!strstart(prop->type, "child<", NULL)) {
1447 continue;
1448 }
1449
1450 if (prop->opaque == dev) {
1451 if (path) {
1452 newpath = g_strdup_printf("%s/%s", prop->name, path);
1453 g_free(path);
1454 path = newpath;
1455 } else {
1456 path = g_strdup(prop->name);
1457 }
1458 break;
1459 }
1460 }
1461
1462 g_assert(prop != NULL);
1463
1464 dev = dev->parent;
1465 }
1466
1467 newpath = g_strdup_printf("/%s", path);
1468 g_free(path);
1469
1470 return newpath;
1471 }
1472
1473 static DeviceState *qdev_resolve_abs_path(DeviceState *parent,
1474 gchar **parts,
1475 int index)
1476 {
1477 DeviceProperty *prop;
1478 DeviceState *child;
1479
1480 if (parts[index] == NULL) {
1481 return parent;
1482 }
1483
1484 if (strcmp(parts[index], "") == 0) {
1485 return qdev_resolve_abs_path(parent, parts, index + 1);
1486 }
1487
1488 prop = qdev_property_find(parent, parts[index]);
1489 if (prop == NULL) {
1490 return NULL;
1491 }
1492
1493 child = NULL;
1494 if (strstart(prop->type, "link<", NULL)) {
1495 DeviceState **pchild = prop->opaque;
1496 if (*pchild) {
1497 child = *pchild;
1498 }
1499 } else if (strstart(prop->type, "child<", NULL)) {
1500 child = prop->opaque;
1501 }
1502
1503 if (!child) {
1504 return NULL;
1505 }
1506
1507 return qdev_resolve_abs_path(child, parts, index + 1);
1508 }
1509
1510 static DeviceState *qdev_resolve_partial_path(DeviceState *parent,
1511 gchar **parts,
1512 bool *ambiguous)
1513 {
1514 DeviceState *dev;
1515 DeviceProperty *prop;
1516
1517 dev = qdev_resolve_abs_path(parent, parts, 0);
1518
1519 QTAILQ_FOREACH(prop, &parent->properties, node) {
1520 DeviceState *found;
1521
1522 if (!strstart(prop->type, "child<", NULL)) {
1523 continue;
1524 }
1525
1526 found = qdev_resolve_partial_path(prop->opaque, parts, ambiguous);
1527 if (found) {
1528 if (dev) {
1529 if (ambiguous) {
1530 *ambiguous = true;
1531 }
1532 return NULL;
1533 }
1534 dev = found;
1535 }
1536
1537 if (ambiguous && *ambiguous) {
1538 return NULL;
1539 }
1540 }
1541
1542 return dev;
1543 }
1544
1545 DeviceState *qdev_resolve_path(const char *path, bool *ambiguous)
1546 {
1547 bool partial_path = true;
1548 DeviceState *dev;
1549 gchar **parts;
1550
1551 parts = g_strsplit(path, "/", 0);
1552 if (parts == NULL || parts[0] == NULL) {
1553 g_strfreev(parts);
1554 return qdev_get_root();
1555 }
1556
1557 if (strcmp(parts[0], "") == 0) {
1558 partial_path = false;
1559 }
1560
1561 if (partial_path) {
1562 if (ambiguous) {
1563 *ambiguous = false;
1564 }
1565 dev = qdev_resolve_partial_path(qdev_get_root(), parts, ambiguous);
1566 } else {
1567 dev = qdev_resolve_abs_path(qdev_get_root(), parts, 1);
1568 }
1569
1570 g_strfreev(parts);
1571
1572 return dev;
1573 }
1574
1575 typedef struct StringProperty
1576 {
1577 char *(*get)(DeviceState *, Error **);
1578 void (*set)(DeviceState *, const char *, Error **);
1579 } StringProperty;
1580
1581 static void qdev_property_get_str(DeviceState *dev, Visitor *v, void *opaque,
1582 const char *name, Error **errp)
1583 {
1584 StringProperty *prop = opaque;
1585 char *value;
1586
1587 value = prop->get(dev, errp);
1588 if (value) {
1589 visit_type_str(v, &value, name, errp);
1590 g_free(value);
1591 }
1592 }
1593
1594 static void qdev_property_set_str(DeviceState *dev, Visitor *v, void *opaque,
1595 const char *name, Error **errp)
1596 {
1597 StringProperty *prop = opaque;
1598 char *value;
1599 Error *local_err = NULL;
1600
1601 visit_type_str(v, &value, name, &local_err);
1602 if (local_err) {
1603 error_propagate(errp, local_err);
1604 return;
1605 }
1606
1607 prop->set(dev, value, errp);
1608 g_free(value);
1609 }
1610
1611 static void qdev_property_release_str(DeviceState *dev, const char *name,
1612 void *opaque)
1613 {
1614 StringProperty *prop = opaque;
1615 g_free(prop);
1616 }
1617
1618 void qdev_property_add_str(DeviceState *dev, const char *name,
1619 char *(*get)(DeviceState *, Error **),
1620 void (*set)(DeviceState *, const char *, Error **),
1621 Error **errp)
1622 {
1623 StringProperty *prop = g_malloc0(sizeof(*prop));
1624
1625 prop->get = get;
1626 prop->set = set;
1627
1628 qdev_property_add(dev, name, "string",
1629 get ? qdev_property_get_str : NULL,
1630 set ? qdev_property_set_str : NULL,
1631 qdev_property_release_str,
1632 prop, errp);
1633 }
1634
1635 void qdev_machine_init(void)
1636 {
1637 qdev_get_peripheral_anon();
1638 qdev_get_peripheral();
1639 }
1640
1641 static void device_initfn(Object *obj)
1642 {
1643 DeviceState *dev = DEVICE(obj);
1644 Property *prop;
1645
1646 if (qdev_hotplug) {
1647 dev->hotplugged = 1;
1648 qdev_hot_added = true;
1649 }
1650
1651 dev->instance_id_alias = -1;
1652 QTAILQ_INIT(&dev->properties);
1653 dev->state = DEV_STATE_CREATED;
1654
1655 qdev_prop_set_defaults(dev, qdev_get_props(dev));
1656 for (prop = qdev_get_props(dev); prop && prop->name; prop++) {
1657 qdev_property_add_legacy(dev, prop, NULL);
1658 qdev_property_add_static(dev, prop, NULL);
1659 }
1660
1661 qdev_property_add_str(dev, "type", qdev_get_type, NULL, NULL);
1662 }
1663
1664 void device_reset(DeviceState *dev)
1665 {
1666 DeviceClass *klass = DEVICE_GET_CLASS(dev);
1667
1668 if (klass->reset) {
1669 klass->reset(dev);
1670 }
1671 }
1672
1673 static TypeInfo device_type_info = {
1674 .name = TYPE_DEVICE,
1675 .parent = TYPE_OBJECT,
1676 .instance_size = sizeof(DeviceState),
1677 .instance_init = device_initfn,
1678 .abstract = true,
1679 .class_size = sizeof(DeviceClass),
1680 };
1681
1682 static void init_qdev(void)
1683 {
1684 type_register_static(&device_type_info);
1685 }
1686
1687 device_init(init_qdev);