qemu-devel
[Top][All Lists]
Advanced

[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,
>>  };
>>  
>>  
>>



reply via email to

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