qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] What's IOMMUMemoryRegion's super?


From: Markus Armbruster
Subject: [Qemu-devel] What's IOMMUMemoryRegion's super?
Date: Wed, 03 Jul 2019 07:05:56 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux)

The usual QOM boilerplate for defining a sub-{type,class} looks like
this:

    static const TypeInfo sysbus_device_type_info = {
        .name = TYPE_SYS_BUS_DEVICE,
        .parent = TYPE_DEVICE,
        .instance_size = sizeof(SysBusDevice),
        .abstract = true,
        .class_size = sizeof(SysBusDeviceClass),
        .class_init = sysbus_device_class_init,
    };

    typedef struct SysBusDeviceClass {
        /*< private >*/
        DeviceClass parent_class;
        [...]
    } SysBusDeviceClass;

    struct SysBusDevice {
        /*< private >*/
        DeviceState parent_obj;
        [...]
    };

Note the TypeInfo states the parent type (member @parent), and
associated class and instance structs (used members @instance_size and
@class_size) have the parent type's class and member struct as first
member.

This makes type casts to parent types work.  The checked QOM casts add
safety by checking it's actually a parent type.

Now consider TYPE_IOMMU_MEMORY_REGION:

    static const TypeInfo iommu_memory_region_info = {
        .parent             = TYPE_MEMORY_REGION,
        .name               = TYPE_IOMMU_MEMORY_REGION,
        .class_size         = sizeof(IOMMUMemoryRegionClass),
        .instance_size      = sizeof(IOMMUMemoryRegion),
        .instance_init      = iommu_memory_region_initfn,
        .abstract           = true,
    };

    typedef struct IOMMUMemoryRegionClass {
        /* private */
--->    struct DeviceClass parent_class;
        [...]
    };

    struct IOMMUMemoryRegion {
        MemoryRegion parent_obj;
        [...]
    };

The parent is TYPE_MEMORY_REGION, and the instance struct's first member is
TYPE_MEMORY_REGION's instance struct as I expect, but the class struct's
first member is something else entirely.

What's going on here?  Am I confused?

The commit message is of no help whatsoever:

    commit 1221a4746769f70231beab4db8da1c937e60340c
    Author: Alexey Kardashevskiy <address@hidden>
    Date:   Tue Jul 11 13:56:20 2017 +1000

        memory/iommu: introduce IOMMUMemoryRegionClass

        This finishes QOM'fication of IOMMUMemoryRegion by introducing
        a IOMMUMemoryRegionClass. This also provides a fastpath analog for
        IOMMU_MEMORY_REGION_GET_CLASS().

        This makes IOMMUMemoryRegion an abstract class.

        Signed-off-by: Alexey Kardashevskiy <address@hidden>
        Message-Id: <address@hidden>
        Acked-by: Cornelia Huck <address@hidden>
        Signed-off-by: Paolo Bonzini <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]