Commit 999e12bb authored by Anthony Liguori's avatar Anthony Liguori
Browse files

sysbus: apic: ioapic: convert to QEMU Object Model



This converts three devices because apic and ioapic are subclasses of sysbus.
Converting subclasses independently of their base class is prohibitively hard.

Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 40021f08
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -208,13 +208,20 @@ static const VMStateDescription vmstate_a9mp_priv = {
    }
};

static SysBusDeviceInfo a9mp_priv_info = {
    .init = a9mp_priv_init,
    .qdev.name  = "a9mpcore_priv",
    .qdev.size  = sizeof(a9mp_priv_state),
    .qdev.vmsd = &vmstate_a9mp_priv,
    .qdev.reset = a9mp_priv_reset,
    .qdev.props = (Property[]) {
static void a9mp_priv_class_init(ObjectClass *klass, void *data)
{
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);

    k->init = a9mp_priv_init;
}

static DeviceInfo a9mp_priv_info = {
    .name = "a9mpcore_priv",
    .size  = sizeof(a9mp_priv_state),
    .vmsd = &vmstate_a9mp_priv,
    .reset = a9mp_priv_reset,
    .class_init = a9mp_priv_class_init,
    .props = (Property[]) {
        DEFINE_PROP_UINT32("num-cpu", a9mp_priv_state, num_cpu, 1),
        /* The Cortex-A9MP may have anything from 0 to 224 external interrupt
         * IRQ lines (with another 32 internal). We default to 64+32, which
+12 −5
Original line number Diff line number Diff line
@@ -808,11 +808,18 @@ static int typhoon_pcihost_init(SysBusDevice *dev)
    return 0;
}

static SysBusDeviceInfo typhoon_pcihost_info = {
    .init = typhoon_pcihost_init,
    .qdev.name = "typhoon-pcihost",
    .qdev.size = sizeof(TyphoonState),
    .qdev.no_user = 1
static void typhoon_pcihost_class_init(ObjectClass *klass, void *data)
{
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);

    k->init = typhoon_pcihost_init;
}

static DeviceInfo typhoon_pcihost_info = {
    .name = "typhoon-pcihost",
    .size = sizeof(TyphoonState),
    .no_user = 1,
    .class_init = typhoon_pcihost_class_init,
};

static void typhoon_register(void)
+12 −5
Original line number Diff line number Diff line
@@ -453,11 +453,18 @@ static DeviceInfo pbm_pci_host_info = {
    .class_init = pbm_pci_host_class_init,
};

static SysBusDeviceInfo pbm_host_info = {
    .qdev.name = "pbm",
    .qdev.size = sizeof(APBState),
    .qdev.reset = pci_pbm_reset,
    .init = pci_pbm_init_device,
static void pbm_host_class_init(ObjectClass *klass, void *data)
{
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);

    k->init = pci_pbm_init_device;
}

static DeviceInfo pbm_host_info = {
    .name = "pbm",
    .size = sizeof(APBState),
    .reset = pci_pbm_reset,
    .class_init = pbm_host_class_init,
};

static void pbm_pci_bridge_class_init(ObjectClass *klass, void *data)
+14 −7
Original line number Diff line number Diff line
@@ -763,13 +763,20 @@ static void apic_init(APICCommonState *s)
    local_apics[s->idx] = s;
}

static APICCommonInfo apic_info = {
    .busdev.qdev.name = "apic",
    .init = apic_init,
    .set_base = apic_set_base,
    .set_tpr = apic_set_tpr,
    .external_nmi = apic_external_nmi,
    .post_load = apic_post_load,
static void apic_class_init(ObjectClass *klass, void *data)
{
    APICCommonClass *k = APIC_COMMON_CLASS(klass);

    k->init = apic_init;
    k->set_base = apic_set_base;
    k->set_tpr = apic_set_tpr;
    k->external_nmi = apic_external_nmi;
    k->post_load = apic_post_load;
}

static DeviceInfo apic_info = {
    .name = "apic",
    .class_init = apic_class_init,
};

static void apic_register_devices(void)
+56 −32
Original line number Diff line number Diff line
@@ -25,35 +25,40 @@ static int apic_irq_delivered;

void cpu_set_apic_base(DeviceState *d, uint64_t val)
{
    APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
    APICCommonInfo *info;

    trace_cpu_set_apic_base(val);

    if (s) {
        info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
    if (d) {
        APICCommonState *s = APIC_COMMON(d);
        APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
        info->set_base(s, val);
    }
}

uint64_t cpu_get_apic_base(DeviceState *d)
{
    APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);

    trace_cpu_get_apic_base(s ? (uint64_t)s->apicbase : 0);

    return s ? s->apicbase : 0;
    if (d) {
        APICCommonState *s = APIC_COMMON(d);
        trace_cpu_get_apic_base((uint64_t)s->apicbase);
        return s->apicbase;
    } else {
        trace_cpu_get_apic_base(0);
        return 0;
    }
}

void cpu_set_apic_tpr(DeviceState *d, uint8_t val)
{
    APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
    APICCommonInfo *info;
    APICCommonState *s;
    APICCommonClass *info;

    if (s) {
        info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
        info->set_tpr(s, val);
    if (!d) {
        return;
    }

    s = APIC_COMMON(d);
    info = APIC_COMMON_GET_CLASS(s);

    info->set_tpr(s, val);
}

uint8_t cpu_get_apic_tpr(DeviceState *d)
@@ -86,10 +91,9 @@ int apic_get_irq_delivered(void)

void apic_deliver_nmi(DeviceState *d)
{
    APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d);
    APICCommonInfo *info;
    APICCommonState *s = APIC_COMMON(d);
    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);

    info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
    info->external_nmi(s);
}

@@ -223,8 +227,8 @@ static int apic_load_old(QEMUFile *f, void *opaque, int version_id)

static int apic_init_common(SysBusDevice *dev)
{
    APICCommonState *s = FROM_SYSBUS(APICCommonState, dev);
    APICCommonInfo *info;
    APICCommonState *s = APIC_COMMON(dev);
    APICCommonClass *info;
    static int apic_no;

    if (apic_no >= MAX_APICS) {
@@ -232,7 +236,7 @@ static int apic_init_common(SysBusDevice *dev)
    }
    s->idx = apic_no++;

    info = DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
    info = APIC_COMMON_GET_CLASS(s);
    info->init(s);

    sysbus_init_mmio(&s->busdev, &s->io_memory);
@@ -241,9 +245,8 @@ static int apic_init_common(SysBusDevice *dev)

static int apic_dispatch_post_load(void *opaque, int version_id)
{
    APICCommonState *s = opaque;
    APICCommonInfo *info =
        DO_UPCAST(APICCommonInfo, busdev.qdev, qdev_get_info(&s->busdev.qdev));
    APICCommonState *s = APIC_COMMON(opaque);
    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);

    if (info->post_load) {
        info->post_load(s);
@@ -289,14 +292,35 @@ static Property apic_properties_common[] = {
    DEFINE_PROP_END_OF_LIST(),
};

static void apic_common_class_init(ObjectClass *klass, void *data)
{
    SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);

    sc->init = apic_init_common;
}

static TypeInfo apic_common_type = {
    .name = TYPE_APIC_COMMON,
    .parent = TYPE_SYS_BUS_DEVICE,
    .instance_size = sizeof(APICCommonState),
    .class_size = sizeof(APICCommonClass),
    .class_init = apic_common_class_init,
    .abstract = true,
};

void apic_qdev_register(DeviceInfo *info)
{
    info->size = sizeof(APICCommonState),
    info->vmsd = &vmstate_apic_common;
    info->reset = apic_reset_common;
    info->no_user = 1;
    info->props = apic_properties_common;
    sysbus_qdev_register_subclass(info, TYPE_APIC_COMMON);
}

void apic_qdev_register(APICCommonInfo *info)
static void register_devices(void)
{
    info->busdev.init = apic_init_common;
    info->busdev.qdev.size = sizeof(APICCommonState),
    info->busdev.qdev.vmsd = &vmstate_apic_common;
    info->busdev.qdev.reset = apic_reset_common;
    info->busdev.qdev.no_user = 1;
    info->busdev.qdev.props = apic_properties_common;
    sysbus_register_withprop(&info->busdev);
    type_register_static(&apic_common_type);
}

device_init(register_devices);
Loading