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 <a...@ozlabs.ru> 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 <a...@ozlabs.ru> Message-Id: <20170711035620.4232-3-...@ozlabs.ru> Acked-by: Cornelia Huck <coh...@redhat.com> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>