qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] wdt_i6300esb: register a reset function


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCH] wdt_i6300esb: register a reset function
Date: Sat, 11 Dec 2010 18:39:03 +0000

Thanks, applied.

On Wed, Dec 8, 2010 at 2:59 PM, Bernhard Kohl <address@hidden> wrote:
> The device shall set its default hardware state after each reset.
> This includes that the timer is stopped which is especially important
> if the guest does a reboot independantly of a watchdog bite. I moved
> the initialization of the state variables completely from the init
> to the reset function which is called right after init during the
> first boot and afterwards during each reboot.
>
> Signed-off-by: Bernhard Kohl <address@hidden>
> ---
>  hw/wdt_i6300esb.c |   39 +++++++++++++++++++++------------------
>  1 files changed, 21 insertions(+), 18 deletions(-)
>
> diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c
> index 46e1df8..2408710 100644
> --- a/hw/wdt_i6300esb.c
> +++ b/hw/wdt_i6300esb.c
> @@ -140,14 +140,26 @@ static void i6300esb_disable_timer(I6300State *d)
>     qemu_del_timer(d->timer);
>  }
>
> -static void i6300esb_reset(I6300State *d)
> +static void i6300esb_reset(DeviceState *dev)
>  {
> -    /* XXX We should probably reset other parts of the state here,
> -     * but we should also reset our state on general machine reset
> -     * too.  For now just disable the timer so it doesn't fire
> -     * again after the reboot.
> -     */
> +    PCIDevice *pdev = DO_UPCAST(PCIDevice, qdev, dev);
> +    I6300State *d = DO_UPCAST(I6300State, dev, pdev);
> +
> +    i6300esb_debug("I6300State = %p\n", d);
> +
>     i6300esb_disable_timer(d);
> +
> +    d->reboot_enabled = 1;
> +    d->clock_scale = CLOCK_SCALE_1KHZ;
> +    d->int_type = INT_TYPE_IRQ;
> +    d->free_run = 0;
> +    d->locked = 0;
> +    d->enabled = 0;
> +    d->timer1_preload = 0xfffff;
> +    d->timer2_preload = 0xfffff;
> +    d->stage = 1;
> +    d->unlock_state = 0;
> +    d->previous_reboot_flag = 0;
>  }
>
>  /* This function is called when the watchdog expires.  Note that
> @@ -181,7 +193,6 @@ static void i6300esb_timer_expired(void *vp)
>         if (d->reboot_enabled) {
>             d->previous_reboot_flag = 1;
>             watchdog_perform_action(); /* This reboots, exits, etc */
> -            i6300esb_reset(d);
>         }
>
>         /* In "free running mode" we start stage 1 again. */
> @@ -394,18 +405,9 @@ static int i6300esb_init(PCIDevice *dev)
>     I6300State *d = DO_UPCAST(I6300State, dev, dev);
>     uint8_t *pci_conf;
>
> -    d->reboot_enabled = 1;
> -    d->clock_scale = CLOCK_SCALE_1KHZ;
> -    d->int_type = INT_TYPE_IRQ;
> -    d->free_run = 0;
> -    d->locked = 0;
> -    d->enabled = 0;
> +    i6300esb_debug("I6300State = %p\n", d);
> +
>     d->timer = qemu_new_timer(vm_clock, i6300esb_timer_expired, d);
> -    d->timer1_preload = 0xfffff;
> -    d->timer2_preload = 0xfffff;
> -    d->stage = 1;
> -    d->unlock_state = 0;
> -    d->previous_reboot_flag = 0;
>
>     pci_conf = d->dev.config;
>     pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
> @@ -427,6 +429,7 @@ static PCIDeviceInfo i6300esb_info = {
>     .qdev.name    = "i6300esb",
>     .qdev.size    = sizeof(I6300State),
>     .qdev.vmsd    = &vmstate_i6300esb,
> +    .qdev.reset   = i6300esb_reset,
>     .config_read  = i6300esb_config_read,
>     .config_write = i6300esb_config_write,
>     .init         = i6300esb_init,
> --
> 1.7.2.3
>
>
>



reply via email to

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