[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] hw/sparc64/sun4u: Fix introspection by converti
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [PATCH] hw/sparc64/sun4u: Fix introspection by converting prom instance_init to realize |
Date: |
Thu, 5 Apr 2018 13:27:16 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 |
On 04/05/2018 01:22 PM, Philippe Mathieu-Daudé wrote:
> On 04/05/2018 06:32 AM, Thomas Huth wrote:
>> The instance_init function of devices should always succeed to be able
>> to introspect the device. However, the instance_init function of the
>> "openprom" device can currently fail, for example like this:
>>
>> $ echo "{'execute':'qmp_capabilities'}"\
>> "{'execute':'device-list-properties',"\
>> " 'arguments':{'typename':'openprom'}}" \
>> | sparc64-softmmu/qemu-system-sparc64 -M sun4v,accel=qtest -qmp stdio
>> {"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
>> "package": "build-all"}, "capabilities": []}}
>> {"return": {}}
>> RAMBlock "sun4u.prom" already registered, abort!
>> Aborted (core dumped)
>>
>> This should not happen. Fix this problem by moving the affected code from
>> instance_init into a realize function instead.
>>
>> Signed-off-by: Thomas Huth <address@hidden>
>> ---
>> hw/sparc64/sun4u.c | 18 ++++++++++++------
>> 1 file changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
>> index 2044a52..d62f5a2 100644
>> --- a/hw/sparc64/sun4u.c
>> +++ b/hw/sparc64/sun4u.c
>> @@ -425,13 +425,19 @@ static void prom_init(hwaddr addr, const char
>> *bios_name)
>> }
>> }
>>
>> -static void prom_init1(Object *obj)
>> +static void prom_realize(DeviceState *ds, Error **errp)
>> {
>> - PROMState *s = OPENPROM(obj);
>> - SysBusDevice *dev = SYS_BUS_DEVICE(obj);
>> + PROMState *s = OPENPROM(ds);
>> + SysBusDevice *dev = SYS_BUS_DEVICE(ds);
>> + Error *local_err = NULL;
>> +
>> + memory_region_init_ram_nomigrate(&s->prom, OBJECT(ds), "sun4u.prom",
>> + PROM_SIZE_MAX, &local_err);
>
> This looks the memory_region_init_ram() pattern...
>
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> + }
>>
>> - memory_region_init_ram_nomigrate(&s->prom, obj, "sun4u.prom",
>> PROM_SIZE_MAX,
>> - &error_fatal);
>> vmstate_register_ram_global(&s->prom);
>
> ... ^
>
> Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
>
>> memory_region_set_readonly(&s->prom, true);
Maybe memory_region_init_rom_nomigrate() even?
>> sysbus_init_mmio(dev, &s->prom);
>> @@ -446,6 +452,7 @@ static void prom_class_init(ObjectClass *klass, void
>> *data)
>> DeviceClass *dc = DEVICE_CLASS(klass);
>>
>> dc->props = prom_properties;
>> + dc->realize = prom_realize;
>> }
>>
>> static const TypeInfo prom_info = {
>> @@ -453,7 +460,6 @@ static const TypeInfo prom_info = {
>> .parent = TYPE_SYS_BUS_DEVICE,
>> .instance_size = sizeof(PROMState),
>> .class_init = prom_class_init,
>> - .instance_init = prom_init1,
>> };
>>
>>
>>