armsse: Define ARMSSEClass correctly
TYPE_ARM_SSE is a TYPE_SYS_BUS_DEVICE subclass, but ARMSSEClass::parent_class is declared as DeviceClass. It never caused any problems by pure luck: We were not setting class_size for TYPE_ARM_SSE, so class_size of TYPE_SYS_BUS_DEVICE was being used (sizeof(SysBusDeviceClass)). This made the system allocate enough memory for TYPE_ARM_SSE devices even though ARMSSEClass was too small for a sysbus device. Additionally, the ARMSSEClass::info field ended up at the same offset as SysBusDeviceClass::explicit_ofw_unit_address. This would make sysbus_get_fw_dev_path() crash for the device. Luckily, sysbus_get_fw_dev_path() never gets called for TYPE_ARM_SSE devices, because qdev_get_fw_dev_path() is only used by the boot device code, and TYPE_ARM_SSE devices don't appear at the fw_boot_order list. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Message-id: 20200826181006.4097163-1-ehabkost@redhat.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
55d35c8819
commit
512c65e62e
@ -1160,6 +1160,7 @@ static const TypeInfo armsse_info = {
|
||||
.name = TYPE_ARMSSE,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(ARMSSE),
|
||||
.class_size = sizeof(ARMSSEClass),
|
||||
.instance_init = armsse_init,
|
||||
.abstract = true,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
|
@ -220,7 +220,7 @@ typedef struct ARMSSE {
|
||||
typedef struct ARMSSEInfo ARMSSEInfo;
|
||||
|
||||
typedef struct ARMSSEClass {
|
||||
DeviceClass parent_class;
|
||||
SysBusDeviceClass parent_class;
|
||||
const ARMSSEInfo *info;
|
||||
} ARMSSEClass;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user