qdev.c 32.8 KB
Newer Older
P
Paul Brook 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 *  Dynamic device configuration and creation.
 *
 *  Copyright (c) 2009 CodeSourcery
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * 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/>.
P
Paul Brook 已提交
18 19 20 21 22 23 24 25 26 27
 */

/* The theory here is that it should be possible to create a machine without
   knowledge of specific devices.  Historically board init routines have
   passed a bunch of arguments to each device, requiring the board know
   exactly which device it is dealing with.  This file provides an abstract
   API for device configuration and initialization.  Devices will generally
   inherit from a particular bus (e.g. PCI or I2C) rather than
   this API directly.  */

P
Peter Maydell 已提交
28
#include "qemu/osdep.h"
29
#include "hw/qdev.h"
30
#include "sysemu/sysemu.h"
31
#include "qapi/error.h"
32
#include "qapi/qmp/qerror.h"
33
#include "qapi/visitor.h"
34
#include "qemu/error-report.h"
35
#include "hw/hotplug.h"
36
#include "hw/boards.h"
37
#include "hw/sysbus.h"
W
Wenchao Xia 已提交
38
#include "qapi-event.h"
P
Paul Brook 已提交
39

40
bool qdev_hotplug = false;
41
static bool qdev_hot_added = false;
J
Juan Quintela 已提交
42
bool qdev_hot_removed = false;
43

A
Anthony Liguori 已提交
44 45
const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
{
A
Anthony Liguori 已提交
46 47
    DeviceClass *dc = DEVICE_GET_CLASS(dev);
    return dc->vmsd;
A
Anthony Liguori 已提交
48 49
}

A
Anthony Liguori 已提交
50
static void bus_remove_child(BusState *bus, DeviceState *child)
51
{
A
Anthony Liguori 已提交
52 53 54 55 56 57 58 59
    BusChild *kid;

    QTAILQ_FOREACH(kid, &bus->children, sibling) {
        if (kid->child == child) {
            char name[32];

            snprintf(name, sizeof(name), "child[%d]", kid->index);
            QTAILQ_REMOVE(&bus->children, kid, sibling);
60 61

            /* This gives back ownership of kid->child back to us.  */
A
Anthony Liguori 已提交
62
            object_property_del(OBJECT(bus), name, NULL);
63
            object_unref(OBJECT(kid->child));
A
Anthony Liguori 已提交
64 65 66 67 68 69 70 71 72 73
            g_free(kid);
            return;
        }
    }
}

static void bus_add_child(BusState *bus, DeviceState *child)
{
    char name[32];
    BusChild *kid = g_malloc0(sizeof(*kid));
74

A
Anthony Liguori 已提交
75 76
    kid->index = bus->max_index++;
    kid->child = child;
77
    object_ref(OBJECT(kid->child));
78

A
Anthony Liguori 已提交
79 80
    QTAILQ_INSERT_HEAD(&bus->children, kid, sibling);

81
    /* This transfers ownership of kid->child to the property.  */
A
Anthony Liguori 已提交
82 83 84
    snprintf(name, sizeof(name), "child[%d]", kid->index);
    object_property_add_link(OBJECT(bus), name,
                             object_get_typename(OBJECT(child)),
85 86 87 88
                             (Object **)&kid->child,
                             NULL, /* read-only property */
                             0, /* return ownership on prop deletion */
                             NULL);
A
Anthony Liguori 已提交
89 90 91 92
}

void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
{
93 94 95 96 97 98 99 100 101 102 103
    bool replugging = dev->parent_bus != NULL;

    if (replugging) {
        /* Keep a reference to the device while it's not plugged into
         * any bus, to avoid it potentially evaporating when it is
         * dereffed in bus_remove_child().
         */
        object_ref(OBJECT(dev));
        bus_remove_child(dev->parent_bus, dev);
        object_unref(OBJECT(dev->parent_bus));
    }
104
    dev->parent_bus = bus;
105
    object_ref(OBJECT(bus));
A
Anthony Liguori 已提交
106
    bus_add_child(bus, dev);
107 108 109
    if (replugging) {
        object_unref(OBJECT(dev));
    }
110 111
}

112 113 114
/* Create a new device.  This only initializes the device state
   structure and allows properties to be set.  The device still needs
   to be realized.  See qdev-core.h.  */
P
Paul Brook 已提交
115
DeviceState *qdev_create(BusState *bus, const char *name)
116 117 118 119 120
{
    DeviceState *dev;

    dev = qdev_try_create(bus, name);
    if (!dev) {
121
        if (bus) {
122
            error_report("Unknown device '%s' for bus '%s'", name,
123
                         object_get_typename(OBJECT(bus)));
124
        } else {
125
            error_report("Unknown device '%s' for default sysbus", name);
126
        }
L
liguang 已提交
127
        abort();
128 129 130 131 132
    }

    return dev;
}

133
DeviceState *qdev_try_create(BusState *bus, const char *type)
P
Paul Brook 已提交
134
{
135 136
    DeviceState *dev;

137
    if (object_class_by_name(type) == NULL) {
138 139
        return NULL;
    }
140
    dev = DEVICE(object_new(type));
141 142 143 144
    if (!dev) {
        return NULL;
    }

145
    if (!bus) {
146 147 148 149 150 151
        /* Assert that the device really is a SysBusDevice before
         * we put it onto the sysbus. Non-sysbus devices which aren't
         * being put onto a bus should be created with object_new(TYPE_FOO),
         * not qdev_create(NULL, TYPE_FOO).
         */
        g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
152
        bus = sysbus_get_default();
153 154
    }

155
    qdev_set_parent_bus(dev, bus);
156
    object_unref(OBJECT(dev));
157
    return dev;
P
Paul Brook 已提交
158 159
}

P
Paul Durrant 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners
    = QTAILQ_HEAD_INITIALIZER(device_listeners);

enum ListenerDirection { Forward, Reverse };

#define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
    do {                                                          \
        DeviceListener *_listener;                                \
                                                                  \
        switch (_direction) {                                     \
        case Forward:                                             \
            QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
                if (_listener->_callback) {                       \
                    _listener->_callback(_listener, ##_args);     \
                }                                                 \
            }                                                     \
            break;                                                \
        case Reverse:                                             \
            QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
                                   device_listeners, link) {      \
                if (_listener->_callback) {                       \
                    _listener->_callback(_listener, ##_args);     \
                }                                                 \
            }                                                     \
            break;                                                \
        default:                                                  \
            abort();                                              \
        }                                                         \
    } while (0)

static int device_listener_add(DeviceState *dev, void *opaque)
{
    DEVICE_LISTENER_CALL(realize, Forward, dev);

    return 0;
}

void device_listener_register(DeviceListener *listener)
{
    QTAILQ_INSERT_TAIL(&device_listeners, listener, link);

    qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
                       NULL, NULL);
}

void device_listener_unregister(DeviceListener *listener)
{
    QTAILQ_REMOVE(&device_listeners, listener, link);
}

210
static void device_realize(DeviceState *dev, Error **errp)
211 212
{
    DeviceClass *dc = DEVICE_GET_CLASS(dev);
213

214 215 216
    if (dc->init) {
        int rc = dc->init(dev);
        if (rc < 0) {
217
            error_setg(errp, "Device initialization failed.");
218 219
            return;
        }
J
Jan Kiszka 已提交
220
    }
P
Paul Brook 已提交
221 222
}

223 224 225 226 227 228 229 230 231 232 233 234 235
static void device_unrealize(DeviceState *dev, Error **errp)
{
    DeviceClass *dc = DEVICE_GET_CLASS(dev);

    if (dc->exit) {
        int rc = dc->exit(dev);
        if (rc < 0) {
            error_setg(errp, "Device exit failed.");
            return;
        }
    }
}

J
Jan Kiszka 已提交
236 237 238
void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
                                 int required_for_version)
{
239
    assert(!dev->realized);
J
Jan Kiszka 已提交
240 241 242 243
    dev->instance_id_alias = alias_id;
    dev->alias_required_for_version = required_for_version;
}

244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
{
    MachineState *machine;
    MachineClass *mc;
    Object *m_obj = qdev_get_machine();

    if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
        machine = MACHINE(m_obj);
        mc = MACHINE_GET_CLASS(machine);
        if (mc->get_hotplug_handler) {
            return mc->get_hotplug_handler(machine, dev);
        }
    }

    return NULL;
}

261
HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
262
{
263
    HotplugHandler *hotplug_ctrl;
264 265 266

    if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
        hotplug_ctrl = dev->parent_bus->hotplug_handler;
267 268
    } else {
        hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
269 270 271 272
    }
    return hotplug_ctrl;
}

273 274
static int qdev_reset_one(DeviceState *dev, void *opaque)
{
275
    device_reset(dev);
276 277 278 279

    return 0;
}

280 281
static int qbus_reset_one(BusState *bus, void *opaque)
{
282 283
    BusClass *bc = BUS_GET_CLASS(bus);
    if (bc->reset) {
P
Paolo Bonzini 已提交
284
        bc->reset(bus);
285 286 287 288
    }
    return 0;
}

289 290
void qdev_reset_all(DeviceState *dev)
{
P
Paolo Bonzini 已提交
291
    qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
292 293
}

294 295 296 297 298
void qdev_reset_all_fn(void *opaque)
{
    qdev_reset_all(DEVICE(opaque));
}

P
Paolo Bonzini 已提交
299 300
void qbus_reset_all(BusState *bus)
{
P
Paolo Bonzini 已提交
301
    qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
P
Paolo Bonzini 已提交
302 303
}

304 305 306
void qbus_reset_all_fn(void *opaque)
{
    BusState *bus = opaque;
P
Paolo Bonzini 已提交
307
    qbus_reset_all(bus);
308 309
}

310
/* can be used as ->unplug() callback for the simple cases */
311 312 313
void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
                                  DeviceState *dev, Error **errp)
{
314 315
    /* just zap it */
    object_unparent(OBJECT(dev));
316
}
317

318 319 320 321 322 323 324 325 326 327 328 329 330
/*
 * Realize @dev.
 * Device properties should be set before calling this function.  IRQs
 * and MMIO regions should be connected/mapped after calling this
 * function.
 * On failure, report an error with error_report() and terminate the
 * program.  This is okay during machine creation.  Don't use for
 * hotplug, because there callers need to recover from failure.
 * Exception: if you know the device's init() callback can't fail,
 * then qdev_init_nofail() can't fail either, and is therefore usable
 * even then.  But relying on the device implementation that way is
 * somewhat unclean, and best avoided.
 */
M
Markus Armbruster 已提交
331 332
void qdev_init_nofail(DeviceState *dev)
{
333
    Error *err = NULL;
334

335 336
    assert(!dev->realized);

337
    object_ref(OBJECT(dev));
338 339
    object_property_set_bool(OBJECT(dev), true, "realized", &err);
    if (err) {
340 341
        error_reportf_err(err, "Initialization of device %s failed: ",
                          object_get_typename(OBJECT(dev)));
342 343
        exit(1);
    }
344
    object_unref(OBJECT(dev));
M
Markus Armbruster 已提交
345 346
}

347 348 349 350 351 352
void qdev_machine_creation_done(void)
{
    /*
     * ok, initial machine setup is done, starting from now we can
     * only create hotpluggable devices
     */
353
    qdev_hotplug = true;
354 355
}

356 357 358 359 360
bool qdev_machine_modified(void)
{
    return qdev_hot_added || qdev_hot_removed;
}

P
Paul Brook 已提交
361
BusState *qdev_get_parent_bus(DeviceState *dev)
P
Paul Brook 已提交
362
{
P
Paul Brook 已提交
363
    return dev->parent_bus;
P
Paul Brook 已提交
364 365
}

P
Peter Crosthwaite 已提交
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
                                               const char *name)
{
    NamedGPIOList *ngl;

    QLIST_FOREACH(ngl, &dev->gpios, node) {
        /* NULL is a valid and matchable name, otherwise do a normal
         * strcmp match.
         */
        if ((!ngl->name && !name) ||
                (name && ngl->name && strcmp(name, ngl->name) == 0)) {
            return ngl;
        }
    }

    ngl = g_malloc0(sizeof(*ngl));
    ngl->name = g_strdup(name);
    QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
    return ngl;
}

void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
                             const char *name, int n)
{
390
    int i;
P
Peter Crosthwaite 已提交
391 392
    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);

393
    assert(gpio_list->num_out == 0 || !name);
P
Peter Crosthwaite 已提交
394 395
    gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
                                     dev, n);
396

397 398 399
    if (!name) {
        name = "unnamed-gpio-in";
    }
400
    for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
401 402
        gchar *propname = g_strdup_printf("%s[%u]", name, i);

403 404
        object_property_add_child(OBJECT(dev), propname,
                                  OBJECT(gpio_list->in[i]), &error_abort);
405
        g_free(propname);
406 407
    }

P
Peter Crosthwaite 已提交
408 409 410
    gpio_list->num_in += n;
}

P
Paul Brook 已提交
411 412
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
{
P
Peter Crosthwaite 已提交
413 414 415 416 417 418
    qdev_init_gpio_in_named(dev, handler, NULL, n);
}

void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
                              const char *name, int n)
{
419
    int i;
P
Peter Crosthwaite 已提交
420 421
    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);

422
    assert(gpio_list->num_in == 0 || !name);
423

424 425 426 427
    if (!name) {
        name = "unnamed-gpio-out";
    }
    memset(pins, 0, sizeof(*pins) * n);
428
    for (i = 0; i < n; ++i) {
429 430 431
        gchar *propname = g_strdup_printf("%s[%u]", name,
                                          gpio_list->num_out + i);

432 433 434 435 436
        object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
                                 (Object **)&pins[i],
                                 object_property_allow_set_link,
                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
                                 &error_abort);
437
        g_free(propname);
438
    }
439
    gpio_list->num_out += n;
P
Paul Brook 已提交
440 441 442 443
}

void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
{
P
Peter Crosthwaite 已提交
444 445 446 447 448 449 450 451 452
    qdev_init_gpio_out_named(dev, pins, NULL, n);
}

qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
{
    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);

    assert(n >= 0 && n < gpio_list->num_in);
    return gpio_list->in[n];
P
Paul Brook 已提交
453 454 455 456
}

qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
{
P
Peter Crosthwaite 已提交
457 458 459 460 461 462
    return qdev_get_gpio_in_named(dev, NULL, n);
}

void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
                                 qemu_irq pin)
{
463 464 465 466 467 468 469 470
    char *propname = g_strdup_printf("%s[%d]",
                                     name ? name : "unnamed-gpio-out", n);
    if (pin) {
        /* We need a name for object_property_set_link to work.  If the
         * object has a parent, object_property_add_child will come back
         * with an error without doing anything.  If it has none, it will
         * never fail.  So we can just call it with a NULL Error pointer.
         */
471 472 473
        object_property_add_child(container_get(qdev_get_machine(),
                                                "/unattached"),
                                  "non-qdev-gpio[*]", OBJECT(pin), NULL);
474 475 476
    }
    object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
    g_free(propname);
P
Paul Brook 已提交
477 478
}

479 480 481 482 483 484 485 486 487 488 489
qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
{
    char *propname = g_strdup_printf("%s[%d]",
                                     name ? name : "unnamed-gpio-out", n);

    qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
                                                      NULL);

    return ret;
}

V
Veres Lajos 已提交
490
/* disconnect a GPIO output, returning the disconnected input (if any) */
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505

static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
                                               const char *name, int n)
{
    char *propname = g_strdup_printf("%s[%d]",
                                     name ? name : "unnamed-gpio-out", n);

    qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
                                                      NULL);
    if (ret) {
        object_property_set_link(OBJECT(dev), NULL, propname, NULL);
    }
    g_free(propname);
    return ret;
}
P
Peter Crosthwaite 已提交
506

507 508 509 510 511 512
qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
                                 const char *name, int n)
{
    qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
    qdev_connect_gpio_out_named(dev, name, n, icpt);
    return disconnected;
P
Paul Brook 已提交
513 514 515 516
}

void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
{
P
Peter Crosthwaite 已提交
517
    qdev_connect_gpio_out_named(dev, NULL, n, pin);
P
Paul Brook 已提交
518 519
}

520 521 522 523 524 525 526 527 528 529 530 531 532
void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
                     const char *name)
{
    int i;
    NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);

    for (i = 0; i < ngl->num_in; i++) {
        const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
        char *propname = g_strdup_printf("%s[%d]", nm, i);

        object_property_add_alias(OBJECT(container), propname,
                                  OBJECT(dev), propname,
                                  &error_abort);
533
        g_free(propname);
534 535 536 537 538 539 540 541
    }
    for (i = 0; i < ngl->num_out; i++) {
        const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
        char *propname = g_strdup_printf("%s[%d]", nm, i);

        object_property_add_alias(OBJECT(container), propname,
                                  OBJECT(dev), propname,
                                  &error_abort);
542
        g_free(propname);
543 544 545 546 547
    }
    QLIST_REMOVE(ngl, node);
    QLIST_INSERT_HEAD(&container->gpios, ngl, node);
}

P
Paul Brook 已提交
548
BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
P
Paul Brook 已提交
549
{
P
Paul Brook 已提交
550
    BusState *bus;
551 552 553 554 555 556
    Object *child = object_resolve_path_component(OBJECT(dev), name);

    bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
    if (bus) {
        return bus;
    }
P
Paul Brook 已提交
557

B
Blue Swirl 已提交
558
    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
P
Paul Brook 已提交
559
        if (strcmp(name, bus->name) == 0) {
P
Paul Brook 已提交
560
            return bus;
P
Paul Brook 已提交
561 562 563 564 565
        }
    }
    return NULL;
}

566 567 568 569
int qdev_walk_children(DeviceState *dev,
                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
                       void *opaque)
570 571 572 573
{
    BusState *bus;
    int err;

574 575
    if (pre_devfn) {
        err = pre_devfn(dev, opaque);
576 577 578 579 580 581
        if (err) {
            return err;
        }
    }

    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
582 583
        err = qbus_walk_children(bus, pre_devfn, pre_busfn,
                                 post_devfn, post_busfn, opaque);
584 585 586 587 588
        if (err < 0) {
            return err;
        }
    }

589 590 591 592 593 594 595
    if (post_devfn) {
        err = post_devfn(dev, opaque);
        if (err) {
            return err;
        }
    }

596 597 598
    return 0;
}

599
DeviceState *qdev_find_recursive(BusState *bus, const char *id)
600
{
A
Anthony Liguori 已提交
601 602
    BusChild *kid;
    DeviceState *ret;
603 604
    BusState *child;

A
Anthony Liguori 已提交
605 606 607 608
    QTAILQ_FOREACH(kid, &bus->children, sibling) {
        DeviceState *dev = kid->child;

        if (dev->id && strcmp(dev->id, id) == 0) {
609
            return dev;
A
Anthony Liguori 已提交
610 611
        }

612 613 614 615 616 617 618 619 620 621
        QLIST_FOREACH(child, &dev->child_bus, sibling) {
            ret = qdev_find_recursive(child, id);
            if (ret) {
                return ret;
            }
        }
    }
    return NULL;
}

622
char *qdev_get_dev_path(DeviceState *dev)
623
{
624
    BusClass *bc;
625 626 627 628 629

    if (!dev || !dev->parent_bus) {
        return NULL;
    }

630 631 632
    bc = BUS_GET_CLASS(dev->parent_bus);
    if (bc->get_dev_path) {
        return bc->get_dev_path(dev);
633 634 635
    }

    return NULL;
636
}
637 638 639 640 641

/**
 * Legacy property handling
 */

642 643 644
static void qdev_get_legacy_property(Object *obj, Visitor *v,
                                     const char *name, void *opaque,
                                     Error **errp)
645
{
646
    DeviceState *dev = DEVICE(obj);
647 648
    Property *prop = opaque;

649 650
    char buffer[1024];
    char *ptr = buffer;
651

652
    prop->info->print(dev, prop, buffer, sizeof(buffer));
653
    visit_type_str(v, name, &ptr, errp);
654 655 656
}

/**
C
Cao jin 已提交
657 658 659 660 661 662 663
 * qdev_property_add_legacy:
 * @dev: Device to add the property to.
 * @prop: The qdev property definition.
 * @errp: location to store error information.
 *
 * Add a legacy QOM property to @dev for qdev property @prop.
 * On error, store error in @errp.
664
 *
C
Cao jin 已提交
665 666 667
 * Legacy properties are string versions of QOM properties.  The format of
 * the string depends on the property type.  Legacy properties are only
 * needed for "info qtree".
668
 *
C
Cao jin 已提交
669 670
 * Do not use this is new code!  QOM Properties added through this interface
 * will be given names in the "legacy" namespace.
671
 */
672 673
static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
                                     Error **errp)
674
{
675
    gchar *name;
676

677
    /* Register pointer properties as legacy properties */
678
    if (!prop->info->print && prop->info->get) {
679 680
        return;
    }
681

F
Fam Zheng 已提交
682 683 684 685
    if (prop->info->create) {
        return;
    }

686
    name = g_strdup_printf("legacy-%s", prop->name);
687
    object_property_add(OBJECT(dev), name, "str",
688
                        prop->info->print ? qdev_get_legacy_property : prop->info->get,
689
                        NULL,
690 691
                        NULL,
                        prop, errp);
692

693 694 695 696
    g_free(name);
}

/**
C
Cao jin 已提交
697 698 699 700
 * qdev_property_add_static:
 * @dev: Device to add the property to.
 * @prop: The qdev property definition.
 * @errp: location to store error information.
701
 *
C
Cao jin 已提交
702 703 704
 * Add a static QOM property to @dev for qdev property @prop.
 * On error, store error in @errp.  Static properties access data in a struct.
 * The type of the QOM property is derived from prop->info.
705 706 707 708
 */
void qdev_property_add_static(DeviceState *dev, Property *prop,
                              Error **errp)
{
709 710 711
    Error *local_err = NULL;
    Object *obj = OBJECT(dev);

F
Fam Zheng 已提交
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
    if (prop->info->create) {
        prop->info->create(obj, prop, &local_err);
    } else {
        /*
         * TODO qdev_prop_ptr does not have getters or setters.  It must
         * go now that it can be replaced with links.  The test should be
         * removed along with it: all static properties are read/write.
         */
        if (!prop->info->get && !prop->info->set) {
            return;
        }
        object_property_add(obj, prop->name, prop->info->name,
                            prop->info->get, prop->info->set,
                            prop->info->release,
                            prop, &local_err);
727 728
    }

729 730 731 732
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }
733 734 735 736 737

    object_property_set_description(obj, prop->name,
                                    prop->info->description,
                                    &error_abort);

738
    if (prop->set_default) {
739
        prop->info->set_default_value(obj, prop);
740
    }
A
Anthony Liguori 已提交
741
}
742

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
/* @qdev_alias_all_properties - Add alias properties to the source object for
 * all qdev properties on the target DeviceState.
 */
void qdev_alias_all_properties(DeviceState *target, Object *source)
{
    ObjectClass *class;
    Property *prop;

    class = object_get_class(OBJECT(target));
    do {
        DeviceClass *dc = DEVICE_CLASS(class);

        for (prop = dc->props; prop && prop->name; prop++) {
            object_property_add_alias(source, prop->name,
                                      OBJECT(target), prop->name,
                                      &error_abort);
        }
        class = object_class_get_parent(class);
    } while (class != object_class_by_name(TYPE_DEVICE));
}

764
static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
765 766
{
    GSList **list = opaque;
767 768 769 770 771 772
    DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
                                                          TYPE_DEVICE);

    if (dev == NULL) {
        return 0;
    }
773 774 775 776 777 778 779 780

    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
        *list = g_slist_append(*list, dev);
    }

    return 0;
}

781 782 783 784 785 786 787 788 789
GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
{
    GSList *list = NULL;

    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);

    return list;
}

790
static bool device_get_realized(Object *obj, Error **errp)
791 792 793 794 795
{
    DeviceState *dev = DEVICE(obj);
    return dev->realized;
}

796 797 798 799 800 801 802 803 804 805 806 807 808 809
static bool check_only_migratable(Object *obj, Error **err)
{
    DeviceClass *dc = DEVICE_GET_CLASS(obj);

    if (!vmstate_check_only_migratable(dc->vmsd)) {
        error_setg(err, "Device %s is not migratable, but "
                   "--only-migratable was specified",
                   object_get_typename(obj));
        return false;
    }

    return true;
}

810
static void device_set_realized(Object *obj, bool value, Error **errp)
811 812 813
{
    DeviceState *dev = DEVICE(obj);
    DeviceClass *dc = DEVICE_GET_CLASS(dev);
814
    HotplugHandler *hotplug_ctrl;
815
    BusState *bus;
816
    Error *local_err = NULL;
817 818
    bool unattached_parent = false;
    static int unattached_count;
819

820
    if (dev->hotplugged && !dc->hotpluggable) {
821
        error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
822 823 824
        return;
    }

825
    if (value && !dev->realized) {
826
        if (!check_only_migratable(obj, &local_err)) {
827 828 829
            goto fail;
        }

830
        if (!obj->parent) {
831 832 833 834
            gchar *name = g_strdup_printf("device[%d]", unattached_count++);

            object_property_add_child(container_get(qdev_get_machine(),
                                                    "/unattached"),
835
                                      name, obj, &error_abort);
836
            unattached_parent = true;
837 838 839
            g_free(name);
        }

840 841 842 843 844 845 846 847
        hotplug_ctrl = qdev_get_hotplug_handler(dev);
        if (hotplug_ctrl) {
            hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
            if (local_err != NULL) {
                goto fail;
            }
        }

848 849 850 851
        if (dc->realize) {
            dc->realize(dev, &local_err);
        }

852 853 854 855
        if (local_err != NULL) {
            goto fail;
        }

P
Paul Durrant 已提交
856 857
        DEVICE_LISTENER_CALL(realize, Forward, dev);

858 859
        if (hotplug_ctrl) {
            hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
860 861
        }

862 863 864 865
        if (local_err != NULL) {
            goto post_realize_fail;
        }

866 867 868 869 870 871 872
        /*
         * always free/re-initialize here since the value cannot be cleaned up
         * in device_unrealize due to its usage later on in the unplug path
         */
        g_free(dev->canonical_path);
        dev->canonical_path = object_get_canonical_path(OBJECT(dev));

873
        if (qdev_get_vmsd(dev)) {
874 875 876 877 878 879
            if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
                                               dev->instance_id_alias,
                                               dev->alias_required_for_version,
                                               &local_err) < 0) {
                goto post_realize_fail;
            }
880
        }
881 882 883

        QLIST_FOREACH(bus, &dev->child_bus, sibling) {
            object_property_set_bool(OBJECT(bus), true, "realized",
884
                                         &local_err);
885 886
            if (local_err != NULL) {
                goto child_realize_fail;
887 888
            }
        }
889
        if (dev->hotplugged) {
890 891
            device_reset(dev);
        }
892
        dev->pending_deleted_event = false;
893
    } else if (!value && dev->realized) {
894
        Error **local_errp = NULL;
895
        QLIST_FOREACH(bus, &dev->child_bus, sibling) {
896
            local_errp = local_err ? NULL : &local_err;
897
            object_property_set_bool(OBJECT(bus), false, "realized",
898
                                     local_errp);
899
        }
900
        if (qdev_get_vmsd(dev)) {
901 902
            vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
        }
903 904 905
        if (dc->unrealize) {
            local_errp = local_err ? NULL : &local_err;
            dc->unrealize(dev, local_errp);
906
        }
907
        dev->pending_deleted_event = true;
P
Paul Durrant 已提交
908
        DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
909
    }
910

911 912
    if (local_err != NULL) {
        goto fail;
913 914
    }

915
    dev->realized = value;
916 917 918 919 920 921 922 923 924 925 926 927 928
    return;

child_realize_fail:
    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
        object_property_set_bool(OBJECT(bus), false, "realized",
                                 NULL);
    }

    if (qdev_get_vmsd(dev)) {
        vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
    }

post_realize_fail:
929 930
    g_free(dev->canonical_path);
    dev->canonical_path = NULL;
931 932 933 934 935 936
    if (dc->unrealize) {
        dc->unrealize(dev, NULL);
    }

fail:
    error_propagate(errp, local_err);
937 938 939 940
    if (unattached_parent) {
        object_unparent(OBJECT(dev));
        unattached_count--;
    }
941 942
}

943
static bool device_get_hotpluggable(Object *obj, Error **errp)
944 945 946 947
{
    DeviceClass *dc = DEVICE_GET_CLASS(obj);
    DeviceState *dev = DEVICE(obj);

948
    return dc->hotpluggable && (dev->parent_bus == NULL ||
949
                                qbus_is_hotpluggable(dev->parent_bus));
950 951
}

952 953 954 955 956 957 958
static bool device_get_hotplugged(Object *obj, Error **err)
{
    DeviceState *dev = DEVICE(obj);

    return dev->hotplugged;
}

959 960 961
static void device_initfn(Object *obj)
{
    DeviceState *dev = DEVICE(obj);
962
    ObjectClass *class;
963 964 965 966 967 968 969 970
    Property *prop;

    if (qdev_hotplug) {
        dev->hotplugged = 1;
        qdev_hot_added = true;
    }

    dev->instance_id_alias = -1;
971
    dev->realized = false;
972

973 974
    object_property_add_bool(obj, "realized",
                             device_get_realized, device_set_realized, NULL);
975 976
    object_property_add_bool(obj, "hotpluggable",
                             device_get_hotpluggable, NULL, NULL);
977
    object_property_add_bool(obj, "hotplugged",
978
                             device_get_hotplugged, NULL,
979
                             &error_abort);
980

981 982 983
    class = object_get_class(OBJECT(dev));
    do {
        for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
984 985
            qdev_property_add_legacy(dev, prop, &error_abort);
            qdev_property_add_static(dev, prop, &error_abort);
986 987 988
        }
        class = object_class_get_parent(class);
    } while (class != object_class_by_name(TYPE_DEVICE));
989

990
    object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
991
                             (Object **)&dev->parent_bus, NULL, 0,
992
                             &error_abort);
P
Peter Crosthwaite 已提交
993
    QLIST_INIT(&dev->gpios);
994 995
}

996 997
static void device_post_init(Object *obj)
{
998
    qdev_prop_set_globals(DEVICE(obj));
999 1000
}

1001 1002 1003
/* Unlink device from bus and free the structure.  */
static void device_finalize(Object *obj)
{
P
Peter Crosthwaite 已提交
1004 1005
    NamedGPIOList *ngl, *next;

1006
    DeviceState *dev = DEVICE(obj);
P
Peter Crosthwaite 已提交
1007 1008 1009

    QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
        QLIST_REMOVE(ngl, node);
1010
        qemu_free_irqs(ngl->in, ngl->num_in);
P
Peter Crosthwaite 已提交
1011 1012 1013 1014 1015 1016
        g_free(ngl->name);
        g_free(ngl);
        /* ngl->out irqs are owned by the other end and should not be freed
         * here
         */
    }
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028

    /* Only send event if the device had been completely realized */
    if (dev->pending_deleted_event) {
        g_assert(dev->canonical_path);

        qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path,
                                       &error_abort);
        g_free(dev->canonical_path);
        dev->canonical_path = NULL;
    }

    qemu_opts_del(dev->opts);
1029 1030
}

1031 1032 1033 1034 1035 1036 1037 1038
static void device_class_base_init(ObjectClass *class, void *data)
{
    DeviceClass *klass = DEVICE_CLASS(class);

    /* We explicitly look up properties in the superclasses,
     * so do not propagate them to the subclasses.
     */
    klass->props = NULL;
1039 1040
}

1041
static void device_unparent(Object *obj)
1042 1043
{
    DeviceState *dev = DEVICE(obj);
1044
    BusState *bus;
1045

1046 1047 1048
    if (dev->realized) {
        object_property_set_bool(obj, false, "realized", NULL);
    }
1049 1050
    while (dev->num_child_bus) {
        bus = QLIST_FIRST(&dev->child_bus);
1051
        object_unparent(OBJECT(bus));
1052 1053
    }
    if (dev->parent_bus) {
1054
        bus_remove_child(dev->parent_bus, dev);
1055 1056
        object_unref(OBJECT(dev->parent_bus));
        dev->parent_bus = NULL;
1057
    }
1058 1059 1060 1061
}

static void device_class_init(ObjectClass *class, void *data)
{
1062 1063
    DeviceClass *dc = DEVICE_CLASS(class);

1064
    class->unparent = device_unparent;
1065
    dc->realize = device_realize;
1066
    dc->unrealize = device_unrealize;
1067 1068 1069 1070 1071 1072 1073 1074

    /* by default all devices were considered as hotpluggable,
     * so with intent to check it in generic qdev_unplug() /
     * device_set_realized() functions make every device
     * hotpluggable. Devices that shouldn't be hotpluggable,
     * should override it in their class_init()
     */
    dc->hotpluggable = true;
1075
    dc->user_creatable = true;
1076 1077
}

1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
void device_class_set_parent_reset(DeviceClass *dc,
                                   DeviceReset dev_reset,
                                   DeviceReset *parent_reset)
{
    *parent_reset = dc->reset;
    dc->reset = dev_reset;
}

void device_class_set_parent_realize(DeviceClass *dc,
                                     DeviceRealize dev_realize,
                                     DeviceRealize *parent_realize)
{
    *parent_realize = dc->realize;
    dc->realize = dev_realize;
}

void device_class_set_parent_unrealize(DeviceClass *dc,
                                       DeviceUnrealize dev_unrealize,
                                       DeviceUnrealize *parent_unrealize)
{
    *parent_unrealize = dc->unrealize;
    dc->unrealize = dev_unrealize;
}

1102 1103 1104 1105 1106 1107 1108 1109 1110
void device_reset(DeviceState *dev)
{
    DeviceClass *klass = DEVICE_GET_CLASS(dev);

    if (klass->reset) {
        klass->reset(dev);
    }
}

1111 1112 1113 1114 1115
Object *qdev_get_machine(void)
{
    static Object *dev;

    if (dev == NULL) {
1116
        dev = container_get(object_get_root(), "/machine");
1117 1118 1119 1120 1121
    }

    return dev;
}

1122
static const TypeInfo device_type_info = {
1123 1124 1125
    .name = TYPE_DEVICE,
    .parent = TYPE_OBJECT,
    .instance_size = sizeof(DeviceState),
1126
    .instance_init = device_initfn,
1127
    .instance_post_init = device_post_init,
1128
    .instance_finalize = device_finalize,
1129
    .class_base_init = device_class_base_init,
1130
    .class_init = device_class_init,
1131 1132 1133 1134
    .abstract = true,
    .class_size = sizeof(DeviceClass),
};

A
Andreas Färber 已提交
1135
static void qdev_register_types(void)
1136 1137 1138 1139
{
    type_register_static(&device_type_info);
}

A
Andreas Färber 已提交
1140
type_init(qdev_register_types)