cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qdev.c (34107B)


      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.1 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 "qemu/osdep.h"
     29#include "qapi/error.h"
     30#include "qapi/qapi-events-qdev.h"
     31#include "qapi/qmp/qerror.h"
     32#include "qapi/visitor.h"
     33#include "qemu/error-report.h"
     34#include "qemu/option.h"
     35#include "hw/hotplug.h"
     36#include "hw/irq.h"
     37#include "hw/qdev-properties.h"
     38#include "hw/boards.h"
     39#include "hw/sysbus.h"
     40#include "hw/qdev-clock.h"
     41#include "migration/vmstate.h"
     42#include "trace.h"
     43
     44static bool qdev_hot_added = false;
     45bool qdev_hot_removed = false;
     46
     47const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
     48{
     49    DeviceClass *dc = DEVICE_GET_CLASS(dev);
     50    return dc->vmsd;
     51}
     52
     53static void bus_free_bus_child(BusChild *kid)
     54{
     55    object_unref(OBJECT(kid->child));
     56    g_free(kid);
     57}
     58
     59static void bus_remove_child(BusState *bus, DeviceState *child)
     60{
     61    BusChild *kid;
     62
     63    QTAILQ_FOREACH(kid, &bus->children, sibling) {
     64        if (kid->child == child) {
     65            char name[32];
     66
     67            snprintf(name, sizeof(name), "child[%d]", kid->index);
     68            QTAILQ_REMOVE_RCU(&bus->children, kid, sibling);
     69
     70            bus->num_children--;
     71
     72            /* This gives back ownership of kid->child back to us.  */
     73            object_property_del(OBJECT(bus), name);
     74
     75            /* free the bus kid, when it is safe to do so*/
     76            call_rcu(kid, bus_free_bus_child, rcu);
     77            break;
     78        }
     79    }
     80}
     81
     82static void bus_add_child(BusState *bus, DeviceState *child)
     83{
     84    char name[32];
     85    BusChild *kid = g_malloc0(sizeof(*kid));
     86
     87    bus->num_children++;
     88    kid->index = bus->max_index++;
     89    kid->child = child;
     90    object_ref(OBJECT(kid->child));
     91
     92    QTAILQ_INSERT_HEAD_RCU(&bus->children, kid, sibling);
     93
     94    /* This transfers ownership of kid->child to the property.  */
     95    snprintf(name, sizeof(name), "child[%d]", kid->index);
     96    object_property_add_link(OBJECT(bus), name,
     97                             object_get_typename(OBJECT(child)),
     98                             (Object **)&kid->child,
     99                             NULL, /* read-only property */
    100                             0);
    101}
    102
    103static bool bus_check_address(BusState *bus, DeviceState *child, Error **errp)
    104{
    105    BusClass *bc = BUS_GET_CLASS(bus);
    106    return !bc->check_address || bc->check_address(bus, child, errp);
    107}
    108
    109bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp)
    110{
    111    BusState *old_parent_bus = dev->parent_bus;
    112    DeviceClass *dc = DEVICE_GET_CLASS(dev);
    113
    114    assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type));
    115
    116    if (!bus_check_address(bus, dev, errp)) {
    117        return false;
    118    }
    119
    120    if (old_parent_bus) {
    121        trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)),
    122            old_parent_bus, object_get_typename(OBJECT(old_parent_bus)),
    123            OBJECT(bus), object_get_typename(OBJECT(bus)));
    124        /*
    125         * Keep a reference to the device while it's not plugged into
    126         * any bus, to avoid it potentially evaporating when it is
    127         * dereffed in bus_remove_child().
    128         * Also keep the ref of the parent bus until the end, so that
    129         * we can safely call resettable_change_parent() below.
    130         */
    131        object_ref(OBJECT(dev));
    132        bus_remove_child(dev->parent_bus, dev);
    133    }
    134    dev->parent_bus = bus;
    135    object_ref(OBJECT(bus));
    136    bus_add_child(bus, dev);
    137    if (dev->realized) {
    138        resettable_change_parent(OBJECT(dev), OBJECT(bus),
    139                                 OBJECT(old_parent_bus));
    140    }
    141    if (old_parent_bus) {
    142        object_unref(OBJECT(old_parent_bus));
    143        object_unref(OBJECT(dev));
    144    }
    145    return true;
    146}
    147
    148DeviceState *qdev_new(const char *name)
    149{
    150    if (!object_class_by_name(name)) {
    151        module_load_qom_one(name);
    152    }
    153    return DEVICE(object_new(name));
    154}
    155
    156DeviceState *qdev_try_new(const char *name)
    157{
    158    if (!module_object_class_by_name(name)) {
    159        return NULL;
    160    }
    161    return DEVICE(object_new(name));
    162}
    163
    164static QTAILQ_HEAD(, DeviceListener) device_listeners
    165    = QTAILQ_HEAD_INITIALIZER(device_listeners);
    166
    167enum ListenerDirection { Forward, Reverse };
    168
    169#define DEVICE_LISTENER_CALL(_callback, _direction, _args...)     \
    170    do {                                                          \
    171        DeviceListener *_listener;                                \
    172                                                                  \
    173        switch (_direction) {                                     \
    174        case Forward:                                             \
    175            QTAILQ_FOREACH(_listener, &device_listeners, link) {  \
    176                if (_listener->_callback) {                       \
    177                    _listener->_callback(_listener, ##_args);     \
    178                }                                                 \
    179            }                                                     \
    180            break;                                                \
    181        case Reverse:                                             \
    182            QTAILQ_FOREACH_REVERSE(_listener, &device_listeners,  \
    183                                   link) {                        \
    184                if (_listener->_callback) {                       \
    185                    _listener->_callback(_listener, ##_args);     \
    186                }                                                 \
    187            }                                                     \
    188            break;                                                \
    189        default:                                                  \
    190            abort();                                              \
    191        }                                                         \
    192    } while (0)
    193
    194static int device_listener_add(DeviceState *dev, void *opaque)
    195{
    196    DEVICE_LISTENER_CALL(realize, Forward, dev);
    197
    198    return 0;
    199}
    200
    201void device_listener_register(DeviceListener *listener)
    202{
    203    QTAILQ_INSERT_TAIL(&device_listeners, listener, link);
    204
    205    qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add,
    206                       NULL, NULL);
    207}
    208
    209void device_listener_unregister(DeviceListener *listener)
    210{
    211    QTAILQ_REMOVE(&device_listeners, listener, link);
    212}
    213
    214bool qdev_should_hide_device(QemuOpts *opts)
    215{
    216    DeviceListener *listener;
    217
    218    QTAILQ_FOREACH(listener, &device_listeners, link) {
    219        if (listener->hide_device) {
    220            if (listener->hide_device(listener, opts)) {
    221                return true;
    222            }
    223        }
    224    }
    225
    226    return false;
    227}
    228
    229void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
    230                                 int required_for_version)
    231{
    232    assert(!dev->realized);
    233    dev->instance_id_alias = alias_id;
    234    dev->alias_required_for_version = required_for_version;
    235}
    236
    237HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
    238{
    239    MachineState *machine;
    240    MachineClass *mc;
    241    Object *m_obj = qdev_get_machine();
    242
    243    if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
    244        machine = MACHINE(m_obj);
    245        mc = MACHINE_GET_CLASS(machine);
    246        if (mc->get_hotplug_handler) {
    247            return mc->get_hotplug_handler(machine, dev);
    248        }
    249    }
    250
    251    return NULL;
    252}
    253
    254bool qdev_hotplug_allowed(DeviceState *dev, Error **errp)
    255{
    256    MachineState *machine;
    257    MachineClass *mc;
    258    Object *m_obj = qdev_get_machine();
    259
    260    if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
    261        machine = MACHINE(m_obj);
    262        mc = MACHINE_GET_CLASS(machine);
    263        if (mc->hotplug_allowed) {
    264            return mc->hotplug_allowed(machine, dev, errp);
    265        }
    266    }
    267
    268    return true;
    269}
    270
    271HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev)
    272{
    273    if (dev->parent_bus) {
    274        return dev->parent_bus->hotplug_handler;
    275    }
    276    return NULL;
    277}
    278
    279HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
    280{
    281    HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev);
    282
    283    if (hotplug_ctrl == NULL && dev->parent_bus) {
    284        hotplug_ctrl = qdev_get_bus_hotplug_handler(dev);
    285    }
    286    return hotplug_ctrl;
    287}
    288
    289static int qdev_prereset(DeviceState *dev, void *opaque)
    290{
    291    trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev)));
    292    return 0;
    293}
    294
    295static int qbus_prereset(BusState *bus, void *opaque)
    296{
    297    trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus)));
    298    return 0;
    299}
    300
    301static int qdev_reset_one(DeviceState *dev, void *opaque)
    302{
    303    device_legacy_reset(dev);
    304
    305    return 0;
    306}
    307
    308static int qbus_reset_one(BusState *bus, void *opaque)
    309{
    310    BusClass *bc = BUS_GET_CLASS(bus);
    311    trace_qbus_reset(bus, object_get_typename(OBJECT(bus)));
    312    if (bc->reset) {
    313        bc->reset(bus);
    314    }
    315    return 0;
    316}
    317
    318void qdev_reset_all(DeviceState *dev)
    319{
    320    trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev)));
    321    qdev_walk_children(dev, qdev_prereset, qbus_prereset,
    322                       qdev_reset_one, qbus_reset_one, NULL);
    323}
    324
    325void qdev_reset_all_fn(void *opaque)
    326{
    327    qdev_reset_all(DEVICE(opaque));
    328}
    329
    330void qbus_reset_all(BusState *bus)
    331{
    332    trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus)));
    333    qbus_walk_children(bus, qdev_prereset, qbus_prereset,
    334                       qdev_reset_one, qbus_reset_one, NULL);
    335}
    336
    337void qbus_reset_all_fn(void *opaque)
    338{
    339    BusState *bus = opaque;
    340    qbus_reset_all(bus);
    341}
    342
    343void device_cold_reset(DeviceState *dev)
    344{
    345    resettable_reset(OBJECT(dev), RESET_TYPE_COLD);
    346}
    347
    348bool device_is_in_reset(DeviceState *dev)
    349{
    350    return resettable_is_in_reset(OBJECT(dev));
    351}
    352
    353static ResettableState *device_get_reset_state(Object *obj)
    354{
    355    DeviceState *dev = DEVICE(obj);
    356    return &dev->reset;
    357}
    358
    359static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb,
    360                                       void *opaque, ResetType type)
    361{
    362    DeviceState *dev = DEVICE(obj);
    363    BusState *bus;
    364
    365    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    366        cb(OBJECT(bus), opaque, type);
    367    }
    368}
    369
    370/* can be used as ->unplug() callback for the simple cases */
    371void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
    372                                  DeviceState *dev, Error **errp)
    373{
    374    qdev_unrealize(dev);
    375}
    376
    377bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
    378{
    379    assert(!dev->realized && !dev->parent_bus);
    380
    381    if (bus) {
    382        if (!qdev_set_parent_bus(dev, bus, errp)) {
    383            return false;
    384        }
    385    } else {
    386        assert(!DEVICE_GET_CLASS(dev)->bus_type);
    387    }
    388
    389    return object_property_set_bool(OBJECT(dev), "realized", true, errp);
    390}
    391
    392bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
    393{
    394    bool ret;
    395
    396    ret = qdev_realize(dev, bus, errp);
    397    object_unref(OBJECT(dev));
    398    return ret;
    399}
    400
    401void qdev_unrealize(DeviceState *dev)
    402{
    403    object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
    404}
    405
    406static int qdev_assert_realized_properly_cb(Object *obj, void *opaque)
    407{
    408    DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE));
    409    DeviceClass *dc;
    410
    411    if (dev) {
    412        dc = DEVICE_GET_CLASS(dev);
    413        assert(dev->realized);
    414        assert(dev->parent_bus || !dc->bus_type);
    415    }
    416    return 0;
    417}
    418
    419void qdev_assert_realized_properly(void)
    420{
    421    object_child_foreach_recursive(object_get_root(),
    422                                   qdev_assert_realized_properly_cb, NULL);
    423}
    424
    425bool qdev_machine_modified(void)
    426{
    427    return qdev_hot_added || qdev_hot_removed;
    428}
    429
    430BusState *qdev_get_parent_bus(DeviceState *dev)
    431{
    432    return dev->parent_bus;
    433}
    434
    435static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev,
    436                                               const char *name)
    437{
    438    NamedGPIOList *ngl;
    439
    440    QLIST_FOREACH(ngl, &dev->gpios, node) {
    441        /* NULL is a valid and matchable name. */
    442        if (g_strcmp0(name, ngl->name) == 0) {
    443            return ngl;
    444        }
    445    }
    446
    447    ngl = g_malloc0(sizeof(*ngl));
    448    ngl->name = g_strdup(name);
    449    QLIST_INSERT_HEAD(&dev->gpios, ngl, node);
    450    return ngl;
    451}
    452
    453void qdev_init_gpio_in_named_with_opaque(DeviceState *dev,
    454                                         qemu_irq_handler handler,
    455                                         void *opaque,
    456                                         const char *name, int n)
    457{
    458    int i;
    459    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
    460
    461    assert(gpio_list->num_out == 0 || !name);
    462    gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
    463                                     opaque, n);
    464
    465    if (!name) {
    466        name = "unnamed-gpio-in";
    467    }
    468    for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
    469        gchar *propname = g_strdup_printf("%s[%u]", name, i);
    470
    471        object_property_add_child(OBJECT(dev), propname,
    472                                  OBJECT(gpio_list->in[i]));
    473        g_free(propname);
    474    }
    475
    476    gpio_list->num_in += n;
    477}
    478
    479void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
    480{
    481    qdev_init_gpio_in_named(dev, handler, NULL, n);
    482}
    483
    484void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
    485                              const char *name, int n)
    486{
    487    int i;
    488    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
    489
    490    assert(gpio_list->num_in == 0 || !name);
    491
    492    if (!name) {
    493        name = "unnamed-gpio-out";
    494    }
    495    memset(pins, 0, sizeof(*pins) * n);
    496    for (i = 0; i < n; ++i) {
    497        gchar *propname = g_strdup_printf("%s[%u]", name,
    498                                          gpio_list->num_out + i);
    499
    500        object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
    501                                 (Object **)&pins[i],
    502                                 object_property_allow_set_link,
    503                                 OBJ_PROP_LINK_STRONG);
    504        g_free(propname);
    505    }
    506    gpio_list->num_out += n;
    507}
    508
    509void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
    510{
    511    qdev_init_gpio_out_named(dev, pins, NULL, n);
    512}
    513
    514qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n)
    515{
    516    NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
    517
    518    assert(n >= 0 && n < gpio_list->num_in);
    519    return gpio_list->in[n];
    520}
    521
    522qemu_irq qdev_get_gpio_in(DeviceState *dev, int n)
    523{
    524    return qdev_get_gpio_in_named(dev, NULL, n);
    525}
    526
    527void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
    528                                 qemu_irq pin)
    529{
    530    char *propname = g_strdup_printf("%s[%d]",
    531                                     name ? name : "unnamed-gpio-out", n);
    532    if (pin && !OBJECT(pin)->parent) {
    533        /* We need a name for object_property_set_link to work */
    534        object_property_add_child(container_get(qdev_get_machine(),
    535                                                "/unattached"),
    536                                  "non-qdev-gpio[*]", OBJECT(pin));
    537    }
    538    object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
    539    g_free(propname);
    540}
    541
    542qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
    543{
    544    g_autofree char *propname = g_strdup_printf("%s[%d]",
    545                                     name ? name : "unnamed-gpio-out", n);
    546
    547    qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
    548                                                      NULL);
    549
    550    return ret;
    551}
    552
    553/* disconnect a GPIO output, returning the disconnected input (if any) */
    554
    555static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
    556                                               const char *name, int n)
    557{
    558    char *propname = g_strdup_printf("%s[%d]",
    559                                     name ? name : "unnamed-gpio-out", n);
    560
    561    qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
    562                                                      NULL);
    563    if (ret) {
    564        object_property_set_link(OBJECT(dev), propname, NULL, NULL);
    565    }
    566    g_free(propname);
    567    return ret;
    568}
    569
    570qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt,
    571                                 const char *name, int n)
    572{
    573    qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
    574    qdev_connect_gpio_out_named(dev, name, n, icpt);
    575    return disconnected;
    576}
    577
    578void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin)
    579{
    580    qdev_connect_gpio_out_named(dev, NULL, n, pin);
    581}
    582
    583void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
    584                     const char *name)
    585{
    586    int i;
    587    NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name);
    588
    589    for (i = 0; i < ngl->num_in; i++) {
    590        const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in";
    591        char *propname = g_strdup_printf("%s[%d]", nm, i);
    592
    593        object_property_add_alias(OBJECT(container), propname,
    594                                  OBJECT(dev), propname);
    595        g_free(propname);
    596    }
    597    for (i = 0; i < ngl->num_out; i++) {
    598        const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out";
    599        char *propname = g_strdup_printf("%s[%d]", nm, i);
    600
    601        object_property_add_alias(OBJECT(container), propname,
    602                                  OBJECT(dev), propname);
    603        g_free(propname);
    604    }
    605    QLIST_REMOVE(ngl, node);
    606    QLIST_INSERT_HEAD(&container->gpios, ngl, node);
    607}
    608
    609BusState *qdev_get_child_bus(DeviceState *dev, const char *name)
    610{
    611    BusState *bus;
    612    Object *child = object_resolve_path_component(OBJECT(dev), name);
    613
    614    bus = (BusState *)object_dynamic_cast(child, TYPE_BUS);
    615    if (bus) {
    616        return bus;
    617    }
    618
    619    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    620        if (strcmp(name, bus->name) == 0) {
    621            return bus;
    622        }
    623    }
    624    return NULL;
    625}
    626
    627int qdev_walk_children(DeviceState *dev,
    628                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
    629                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
    630                       void *opaque)
    631{
    632    BusState *bus;
    633    int err;
    634
    635    if (pre_devfn) {
    636        err = pre_devfn(dev, opaque);
    637        if (err) {
    638            return err;
    639        }
    640    }
    641
    642    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    643        err = qbus_walk_children(bus, pre_devfn, pre_busfn,
    644                                 post_devfn, post_busfn, opaque);
    645        if (err < 0) {
    646            return err;
    647        }
    648    }
    649
    650    if (post_devfn) {
    651        err = post_devfn(dev, opaque);
    652        if (err) {
    653            return err;
    654        }
    655    }
    656
    657    return 0;
    658}
    659
    660DeviceState *qdev_find_recursive(BusState *bus, const char *id)
    661{
    662    BusChild *kid;
    663    DeviceState *ret;
    664    BusState *child;
    665
    666    WITH_RCU_READ_LOCK_GUARD() {
    667        QTAILQ_FOREACH_RCU(kid, &bus->children, sibling) {
    668            DeviceState *dev = kid->child;
    669
    670            if (dev->id && strcmp(dev->id, id) == 0) {
    671                return dev;
    672            }
    673
    674            QLIST_FOREACH(child, &dev->child_bus, sibling) {
    675                ret = qdev_find_recursive(child, id);
    676                if (ret) {
    677                    return ret;
    678                }
    679            }
    680        }
    681    }
    682    return NULL;
    683}
    684
    685char *qdev_get_dev_path(DeviceState *dev)
    686{
    687    BusClass *bc;
    688
    689    if (!dev || !dev->parent_bus) {
    690        return NULL;
    691    }
    692
    693    bc = BUS_GET_CLASS(dev->parent_bus);
    694    if (bc->get_dev_path) {
    695        return bc->get_dev_path(dev);
    696    }
    697
    698    return NULL;
    699}
    700
    701static bool device_get_realized(Object *obj, Error **errp)
    702{
    703    DeviceState *dev = DEVICE(obj);
    704    return dev->realized;
    705}
    706
    707static bool check_only_migratable(Object *obj, Error **errp)
    708{
    709    DeviceClass *dc = DEVICE_GET_CLASS(obj);
    710
    711    if (!vmstate_check_only_migratable(dc->vmsd)) {
    712        error_setg(errp, "Device %s is not migratable, but "
    713                   "--only-migratable was specified",
    714                   object_get_typename(obj));
    715        return false;
    716    }
    717
    718    return true;
    719}
    720
    721static void device_set_realized(Object *obj, bool value, Error **errp)
    722{
    723    DeviceState *dev = DEVICE(obj);
    724    DeviceClass *dc = DEVICE_GET_CLASS(dev);
    725    HotplugHandler *hotplug_ctrl;
    726    BusState *bus;
    727    NamedClockList *ncl;
    728    Error *local_err = NULL;
    729    bool unattached_parent = false;
    730    static int unattached_count;
    731
    732    if (dev->hotplugged && !dc->hotpluggable) {
    733        error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
    734        return;
    735    }
    736
    737    if (value && !dev->realized) {
    738        if (!check_only_migratable(obj, errp)) {
    739            goto fail;
    740        }
    741
    742        if (!obj->parent) {
    743            gchar *name = g_strdup_printf("device[%d]", unattached_count++);
    744
    745            object_property_add_child(container_get(qdev_get_machine(),
    746                                                    "/unattached"),
    747                                      name, obj);
    748            unattached_parent = true;
    749            g_free(name);
    750        }
    751
    752        hotplug_ctrl = qdev_get_hotplug_handler(dev);
    753        if (hotplug_ctrl) {
    754            hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
    755            if (local_err != NULL) {
    756                goto fail;
    757            }
    758        }
    759
    760        if (dc->realize) {
    761            dc->realize(dev, &local_err);
    762            if (local_err != NULL) {
    763                goto fail;
    764            }
    765        }
    766
    767        DEVICE_LISTENER_CALL(realize, Forward, dev);
    768
    769        /*
    770         * always free/re-initialize here since the value cannot be cleaned up
    771         * in device_unrealize due to its usage later on in the unplug path
    772         */
    773        g_free(dev->canonical_path);
    774        dev->canonical_path = object_get_canonical_path(OBJECT(dev));
    775        QLIST_FOREACH(ncl, &dev->clocks, node) {
    776            if (ncl->alias) {
    777                continue;
    778            } else {
    779                clock_setup_canonical_path(ncl->clock);
    780            }
    781        }
    782
    783        if (qdev_get_vmsd(dev)) {
    784            if (vmstate_register_with_alias_id(VMSTATE_IF(dev),
    785                                               VMSTATE_INSTANCE_ID_ANY,
    786                                               qdev_get_vmsd(dev), dev,
    787                                               dev->instance_id_alias,
    788                                               dev->alias_required_for_version,
    789                                               &local_err) < 0) {
    790                goto post_realize_fail;
    791            }
    792        }
    793
    794        /*
    795         * Clear the reset state, in case the object was previously unrealized
    796         * with a dirty state.
    797         */
    798        resettable_state_clear(&dev->reset);
    799
    800        QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    801            if (!qbus_realize(bus, errp)) {
    802                goto child_realize_fail;
    803            }
    804        }
    805        if (dev->hotplugged) {
    806            /*
    807             * Reset the device, as well as its subtree which, at this point,
    808             * should be realized too.
    809             */
    810            resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD);
    811            resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus),
    812                                     NULL);
    813            resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD);
    814        }
    815        dev->pending_deleted_event = false;
    816
    817        if (hotplug_ctrl) {
    818            hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
    819            if (local_err != NULL) {
    820                goto child_realize_fail;
    821            }
    822       }
    823
    824       qatomic_store_release(&dev->realized, value);
    825
    826    } else if (!value && dev->realized) {
    827
    828        /*
    829         * Change the value so that any concurrent users are aware
    830         * that the device is going to be unrealized
    831         *
    832         * TODO: change .realized property to enum that states
    833         * each phase of the device realization/unrealization
    834         */
    835
    836        qatomic_set(&dev->realized, value);
    837        /*
    838         * Ensure that concurrent users see this update prior to
    839         * any other changes done by unrealize.
    840         */
    841        smp_wmb();
    842
    843        QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    844            qbus_unrealize(bus);
    845        }
    846        if (qdev_get_vmsd(dev)) {
    847            vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
    848        }
    849        if (dc->unrealize) {
    850            dc->unrealize(dev);
    851        }
    852        dev->pending_deleted_event = true;
    853        DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
    854    }
    855
    856    assert(local_err == NULL);
    857    return;
    858
    859child_realize_fail:
    860    QLIST_FOREACH(bus, &dev->child_bus, sibling) {
    861        qbus_unrealize(bus);
    862    }
    863
    864    if (qdev_get_vmsd(dev)) {
    865        vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev);
    866    }
    867
    868post_realize_fail:
    869    g_free(dev->canonical_path);
    870    dev->canonical_path = NULL;
    871    if (dc->unrealize) {
    872        dc->unrealize(dev);
    873    }
    874
    875fail:
    876    error_propagate(errp, local_err);
    877    if (unattached_parent) {
    878        /*
    879         * Beware, this doesn't just revert
    880         * object_property_add_child(), it also runs bus_remove()!
    881         */
    882        object_unparent(OBJECT(dev));
    883        unattached_count--;
    884    }
    885}
    886
    887static bool device_get_hotpluggable(Object *obj, Error **errp)
    888{
    889    DeviceClass *dc = DEVICE_GET_CLASS(obj);
    890    DeviceState *dev = DEVICE(obj);
    891
    892    return dc->hotpluggable && (dev->parent_bus == NULL ||
    893                                qbus_is_hotpluggable(dev->parent_bus));
    894}
    895
    896static bool device_get_hotplugged(Object *obj, Error **errp)
    897{
    898    DeviceState *dev = DEVICE(obj);
    899
    900    return dev->hotplugged;
    901}
    902
    903static void device_initfn(Object *obj)
    904{
    905    DeviceState *dev = DEVICE(obj);
    906
    907    if (phase_check(PHASE_MACHINE_READY)) {
    908        dev->hotplugged = 1;
    909        qdev_hot_added = true;
    910    }
    911
    912    dev->instance_id_alias = -1;
    913    dev->realized = false;
    914    dev->allow_unplug_during_migration = false;
    915
    916    QLIST_INIT(&dev->gpios);
    917    QLIST_INIT(&dev->clocks);
    918}
    919
    920static void device_post_init(Object *obj)
    921{
    922    /*
    923     * Note: ordered so that the user's global properties take
    924     * precedence.
    925     */
    926    object_apply_compat_props(obj);
    927    qdev_prop_set_globals(DEVICE(obj));
    928}
    929
    930/* Unlink device from bus and free the structure.  */
    931static void device_finalize(Object *obj)
    932{
    933    NamedGPIOList *ngl, *next;
    934
    935    DeviceState *dev = DEVICE(obj);
    936
    937    QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
    938        QLIST_REMOVE(ngl, node);
    939        qemu_free_irqs(ngl->in, ngl->num_in);
    940        g_free(ngl->name);
    941        g_free(ngl);
    942        /* ngl->out irqs are owned by the other end and should not be freed
    943         * here
    944         */
    945    }
    946
    947    qdev_finalize_clocklist(dev);
    948
    949    /* Only send event if the device had been completely realized */
    950    if (dev->pending_deleted_event) {
    951        g_assert(dev->canonical_path);
    952
    953        qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path);
    954        g_free(dev->canonical_path);
    955        dev->canonical_path = NULL;
    956    }
    957
    958    qemu_opts_del(dev->opts);
    959}
    960
    961static void device_class_base_init(ObjectClass *class, void *data)
    962{
    963    DeviceClass *klass = DEVICE_CLASS(class);
    964
    965    /* We explicitly look up properties in the superclasses,
    966     * so do not propagate them to the subclasses.
    967     */
    968    klass->props_ = NULL;
    969}
    970
    971static void device_unparent(Object *obj)
    972{
    973    DeviceState *dev = DEVICE(obj);
    974    BusState *bus;
    975
    976    if (dev->realized) {
    977        qdev_unrealize(dev);
    978    }
    979    while (dev->num_child_bus) {
    980        bus = QLIST_FIRST(&dev->child_bus);
    981        object_unparent(OBJECT(bus));
    982    }
    983    if (dev->parent_bus) {
    984        bus_remove_child(dev->parent_bus, dev);
    985        object_unref(OBJECT(dev->parent_bus));
    986        dev->parent_bus = NULL;
    987    }
    988}
    989
    990static char *
    991device_vmstate_if_get_id(VMStateIf *obj)
    992{
    993    DeviceState *dev = DEVICE(obj);
    994
    995    return qdev_get_dev_path(dev);
    996}
    997
    998/**
    999 * device_phases_reset:
   1000 * Transition reset method for devices to allow moving
   1001 * smoothly from legacy reset method to multi-phases
   1002 */
   1003static void device_phases_reset(DeviceState *dev)
   1004{
   1005    ResettableClass *rc = RESETTABLE_GET_CLASS(dev);
   1006
   1007    if (rc->phases.enter) {
   1008        rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD);
   1009    }
   1010    if (rc->phases.hold) {
   1011        rc->phases.hold(OBJECT(dev));
   1012    }
   1013    if (rc->phases.exit) {
   1014        rc->phases.exit(OBJECT(dev));
   1015    }
   1016}
   1017
   1018static void device_transitional_reset(Object *obj)
   1019{
   1020    DeviceClass *dc = DEVICE_GET_CLASS(obj);
   1021
   1022    /*
   1023     * This will call either @device_phases_reset (for multi-phases transitioned
   1024     * devices) or a device's specific method for not-yet transitioned devices.
   1025     * In both case, it does not reset children.
   1026     */
   1027    if (dc->reset) {
   1028        dc->reset(DEVICE(obj));
   1029    }
   1030}
   1031
   1032/**
   1033 * device_get_transitional_reset:
   1034 * check if the device's class is ready for multi-phase
   1035 */
   1036static ResettableTrFunction device_get_transitional_reset(Object *obj)
   1037{
   1038    DeviceClass *dc = DEVICE_GET_CLASS(obj);
   1039    if (dc->reset != device_phases_reset) {
   1040        /*
   1041         * dc->reset has been overridden by a subclass,
   1042         * the device is not ready for multi phase yet.
   1043         */
   1044        return device_transitional_reset;
   1045    }
   1046    return NULL;
   1047}
   1048
   1049static void device_class_init(ObjectClass *class, void *data)
   1050{
   1051    DeviceClass *dc = DEVICE_CLASS(class);
   1052    VMStateIfClass *vc = VMSTATE_IF_CLASS(class);
   1053    ResettableClass *rc = RESETTABLE_CLASS(class);
   1054
   1055    class->unparent = device_unparent;
   1056
   1057    /* by default all devices were considered as hotpluggable,
   1058     * so with intent to check it in generic qdev_unplug() /
   1059     * device_set_realized() functions make every device
   1060     * hotpluggable. Devices that shouldn't be hotpluggable,
   1061     * should override it in their class_init()
   1062     */
   1063    dc->hotpluggable = true;
   1064    dc->user_creatable = true;
   1065    vc->get_id = device_vmstate_if_get_id;
   1066    rc->get_state = device_get_reset_state;
   1067    rc->child_foreach = device_reset_child_foreach;
   1068
   1069    /*
   1070     * @device_phases_reset is put as the default reset method below, allowing
   1071     * to do the multi-phase transition from base classes to leaf classes. It
   1072     * allows a legacy-reset Device class to extend a multi-phases-reset
   1073     * Device class for the following reason:
   1074     * + If a base class B has been moved to multi-phase, then it does not
   1075     *   override this default reset method and may have defined phase methods.
   1076     * + A child class C (extending class B) which uses
   1077     *   device_class_set_parent_reset() (or similar means) to override the
   1078     *   reset method will still work as expected. @device_phases_reset function
   1079     *   will be registered as the parent reset method and effectively call
   1080     *   parent reset phases.
   1081     */
   1082    dc->reset = device_phases_reset;
   1083    rc->get_transitional_function = device_get_transitional_reset;
   1084
   1085    object_class_property_add_bool(class, "realized",
   1086                                   device_get_realized, device_set_realized);
   1087    object_class_property_add_bool(class, "hotpluggable",
   1088                                   device_get_hotpluggable, NULL);
   1089    object_class_property_add_bool(class, "hotplugged",
   1090                                   device_get_hotplugged, NULL);
   1091    object_class_property_add_link(class, "parent_bus", TYPE_BUS,
   1092                                   offsetof(DeviceState, parent_bus), NULL, 0);
   1093}
   1094
   1095void device_class_set_parent_reset(DeviceClass *dc,
   1096                                   DeviceReset dev_reset,
   1097                                   DeviceReset *parent_reset)
   1098{
   1099    *parent_reset = dc->reset;
   1100    dc->reset = dev_reset;
   1101}
   1102
   1103void device_class_set_parent_realize(DeviceClass *dc,
   1104                                     DeviceRealize dev_realize,
   1105                                     DeviceRealize *parent_realize)
   1106{
   1107    *parent_realize = dc->realize;
   1108    dc->realize = dev_realize;
   1109}
   1110
   1111void device_class_set_parent_unrealize(DeviceClass *dc,
   1112                                       DeviceUnrealize dev_unrealize,
   1113                                       DeviceUnrealize *parent_unrealize)
   1114{
   1115    *parent_unrealize = dc->unrealize;
   1116    dc->unrealize = dev_unrealize;
   1117}
   1118
   1119void device_legacy_reset(DeviceState *dev)
   1120{
   1121    DeviceClass *klass = DEVICE_GET_CLASS(dev);
   1122
   1123    trace_qdev_reset(dev, object_get_typename(OBJECT(dev)));
   1124    if (klass->reset) {
   1125        klass->reset(dev);
   1126    }
   1127}
   1128
   1129Object *qdev_get_machine(void)
   1130{
   1131    static Object *dev;
   1132
   1133    if (dev == NULL) {
   1134        dev = container_get(object_get_root(), "/machine");
   1135    }
   1136
   1137    return dev;
   1138}
   1139
   1140static MachineInitPhase machine_phase;
   1141
   1142bool phase_check(MachineInitPhase phase)
   1143{
   1144    return machine_phase >= phase;
   1145}
   1146
   1147void phase_advance(MachineInitPhase phase)
   1148{
   1149    assert(machine_phase == phase - 1);
   1150    machine_phase = phase;
   1151}
   1152
   1153static const TypeInfo device_type_info = {
   1154    .name = TYPE_DEVICE,
   1155    .parent = TYPE_OBJECT,
   1156    .instance_size = sizeof(DeviceState),
   1157    .instance_init = device_initfn,
   1158    .instance_post_init = device_post_init,
   1159    .instance_finalize = device_finalize,
   1160    .class_base_init = device_class_base_init,
   1161    .class_init = device_class_init,
   1162    .abstract = true,
   1163    .class_size = sizeof(DeviceClass),
   1164    .interfaces = (InterfaceInfo[]) {
   1165        { TYPE_VMSTATE_IF },
   1166        { TYPE_RESETTABLE_INTERFACE },
   1167        { }
   1168    }
   1169};
   1170
   1171static void qdev_register_types(void)
   1172{
   1173    type_register_static(&device_type_info);
   1174}
   1175
   1176type_init(qdev_register_types)