qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] reset strategy?


From: Peter Crosthwaite
Subject: Re: [Qemu-devel] reset strategy?
Date: Sun, 28 Jun 2015 16:15:10 -0700

On Sat, Jun 27, 2015 at 12:52 PM, Liviu Ionescu <address@hidden> wrote:
>
>> On 27 Jun 2015, at 21:03, Peter Crosthwaite <address@hidden> wrote:
>>
>> Try this after object creation (see xlnx-zynqmp init fn):
>>
>>    qdev_set_parent_bus(DEVICE(&s->gic), sysbus_get_default());
>
> ah, sure, I already tried this, if I set the bus, everything works as before.
>
>
> but probably my question was not clear enough.
>
> my latest configuration uses no qdev_* calls at all, none of my objects are 
> connected to sysbus, and apparently everything works without problems.
>
> the reset strategy that I used was to register a reset callback for the MCU:
>
>     CortexMState *cm_state = CORTEXM_MCU_STATE(dev);
>     ....
>     qemu_register_reset(cortexm_mcu_registered_reset_callback, cm_state);
>
>
> static void cortexm_mcu_registered_reset_callback(void *opaque)
> {
>     DeviceState *dev = opaque;
>
>     /* This will actually go to derived class reset. */
>     device_reset(dev);
> }
>
>
> and in the object reset callback to explicitly reset all contained objects:
>
> static void cortexm_mcu_reset_callback(DeviceState *dev)
> {
>     qemu_log_function_name();
>
>     /* Call parent reset(). */
>     cm_device_parent_reset(dev, TYPE_CORTEXM_MCU);
>
>     CortexMState *cm_state = CORTEXM_MCU_STATE(dev);
>
> #if defined(CONFIG_VERBOSE)
>     if (verbosity_level >= VERBOSITY_COMMON) {
>         printf("%s core reset.\n", cm_state->display_model);
>     }
> #endif
>
>     /*
>      * Ensure the image is copied into memory before reset
>      * fetches MSP & PC
>      */
>
>     rom_reset(NULL);
>
>     /*
>      * With the new image available, MSP & PC are correct
>      * and execution will start.
>      */
>
>     cpu_reset(CPU(cm_state->cpu));

This should be managed by the bootloader.

>
>     device_reset(cm_state->nvic);
>
>     if (cm_state->itm) {
>         device_reset(cm_state->itm);
>     }

Are are these two devices really not connected to any bus?

> }
>
>> Note we are trying to phase out object_new in favor of embedding the
>> device structs in the SoC container, which would mean use of
>> object_initialise instead of object_new.
>
> any special reasons in favour of this?
>

I'm not sure TBH, its well discussed on list though.

> in my configuration some of the contained objects are created conditionally, 
> and it seemed more natural to dynamically allocate only the needed ones.
>
> an extreme example is the STM32 objects, which should allocate space for all 
> possible peripherals, for all STM32 families and sub-families, and 
> object_initialise only the needed ones.
>
> but I got your point, where possible I'll use statically allocated objects.
>
>> Ultimately that's a bug, the system wide reset should not depend on
>> qdev.
>
> I did not check the code, but it seems it does not depend on qdev, if there 
> are functions registered with qemu_register_reset(), they are called, 
> regardless if connected to sysbus or not.
>

Yes, but you shouldn't have to register resets from machine level
code. It should just happen via:

vl.c:4412:    qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());

Regards,
Peter

>
> my conclusion is that, at least for my use case, we can get rid completely of 
> qdev calls and sysbus, as long as each object explicitly resets all objects 
> it creates, which is somehow expected.
>
>
> regards,
>
> Liviu
>
>
>
>



reply via email to

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