On 20 August 2013 16:21, Andreas Färber <afaer...@suse.de> wrote:
> From: Andreas Färber <andreas.faer...@web.de>
>
> This covers both emulated and KVM GIC.

> @@ -35,40 +36,48 @@ typedef struct A15MPPrivState {
>      uint32_t num_cpu;
>      uint32_t num_irq;
>      MemoryRegion container;
> -    DeviceState *gic;
> +
> +    GICState gic;
>  } A15MPPrivState;

>  static void a15mp_priv_initfn(Object *obj)
>  {
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
>      A15MPPrivState *s = A15MPCORE_PRIV(obj);
> +    DeviceState *gicdev;
> +    const char *gictype = "arm_gic";
> +
> +    if (kvm_irqchip_in_kernel()) {
> +        gictype = "kvm-arm-gic";
> +    }
>
>      memory_region_init(&s->container, obj, "a15mp-priv-container", 0x8000);
>      sysbus_init_mmio(sbd, &s->container);
> +
> +    object_initialize(&s->gic, gictype);
> +    gicdev = DEVICE(&s->gic);
> +    qdev_set_parent_bus(gicdev, sysbus_get_default());
> +    qdev_prop_set_uint32(gicdev, "revision", 2);

So this is basically assuming that kvm-arm-gic and arm-gic
both have an instance struct of exactly the same size,
even though they're different classes (they happen to be
so at the moment, because neither adds extra state beyond
that needed by common base class). Is that really a good
idea? (If it ever becomes not true we get silent memory
corruption here...)

-- PMM

Reply via email to