qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] lsi_soft_reset: Assertion `!s->current' failed with Win


From: Paolo Bonzini
Subject: Re: [Qemu-devel] lsi_soft_reset: Assertion `!s->current' failed with Windows XP setup
Date: Tue, 30 Apr 2013 15:44:37 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130311 Thunderbird/17.0.4

Il 30/04/2013 14:59, Claudio Bley ha scritto:
> At Mon, 29 Apr 2013 17:54:37 +0200,
> Paolo Bonzini wrote:
>>
>> Il 12/04/2013 16:02, Claudio Bley ha scritto:
>>> Hi.
>>>
>>> I'm using the latest qemu release 1.4.0 and libvirt 1.0.4.
>>>
>>> The host system is a Ubuntu 12.04 LTS system, Intel Xeon processor,
>>> 4GB RAM.
>>>
>>> When trying to install Windows XP I constantly receive this error
>>> (usually right before the graphical Setup is started). Once, I've seen
>>> this error too:
>>>
>>> hw/lsi53c895a.c:351: lsi_soft_reset: Assertion `((&s->queue)->tqh_first == 
>>> ((void *)0))' failed.
>>>
>>> I found the thread here
>>> http://lists.gnu.org/archive/html/qemu-devel/2012-11/msg00518.html but
>>> it didn't led me nowhere. 
>>>
>>> I recompiled with DEBUG_SCSI and DEBUG_LSI enabled. Here's the command
>>> libvirt put together and the last few lines of output. I can provide
>>> the complete log if you need it.
>>
>> Hi, sorry---I just read this now.
>>
>> Can you please try the patches at
>> http://cache.gmane.org//gmane/comp/emulators/qemu/208057-001.bin?
> 
> I gave it a shot and this fixed the bug for me.

Thanks very much.  It is late for 1.5 now, but these will be in 1.5.1
and 1.6.

Paolo

> I've applied the patches to git tag v1.4.1 with minor modifications:
> 
> - skipped patch 1 and 2 since they already had been applied upstream
>   in the meantime, AFAICS
> 
> - s/vists/visits/ in subject line of patch 3
> 
> - updated patch 3 and 4 in order to adjust for moved-around files and
>   some code changes since 1.3.0
> 
> Thanks!
> 
> Here are the updated patches:
> 
> ------- >8 ---------------------------------------------
> From e33168365eae0d6610762ebafd22f26a7a6168e1 Mon Sep 17 00:00:00 2001
> From: Paolo Bonzini <address@hidden>
> Date: Mon, 17 Dec 2012 10:37:02 +0100
> Subject: [PATCH 1/2] qdev: allow both pre- and post-order visits in qdev
>  walking functions
> 
> 
> Resetting should be done in post-order, not pre-order.  However,
> qdev_walk_children and qbus_walk_children do not allow this.  Fix
> it by adding two extra arguments to the functions.
> 
> ---
>  hw/qdev-core.h |   13 +++++++++----
>  hw/qdev.c      |   45 +++++++++++++++++++++++++++++++++------------
>  2 files changed, 42 insertions(+), 16 deletions(-)
> 
> diff --git a/hw/qdev-core.h b/hw/qdev-core.h
> index 2486f36..a0d05ca 100644
> --- a/hw/qdev-core.h
> +++ b/hw/qdev-core.h
> @@ -237,10 +237,15 @@ BusState *qbus_create(const char *typename, DeviceState 
> *parent, const char *nam
>  /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion,
>   *         < 0 if either devfn or busfn terminate walk somewhere in cursion,
>   *           0 otherwise. */
> -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
> -                       qbus_walkerfn *busfn, void *opaque);
> -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
> -                       qbus_walkerfn *busfn, void *opaque);
> +int qbus_walk_children(BusState *bus,
> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
> +                       void *opaque);
> +int qdev_walk_children(DeviceState *dev,
> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
> +                       void *opaque);
> +
>  void qdev_reset_all(DeviceState *dev);
>  
>  /**
> diff --git a/hw/qdev.c b/hw/qdev.c
> index 689cd54..772cfe0 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -224,12 +224,12 @@ static int qbus_reset_one(BusState *bus, void *opaque)
>  
>  void qdev_reset_all(DeviceState *dev)
>  {
> -    qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL);
> +    qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL, NULL, 
> NULL);
>  }
>  
>  void qbus_reset_all(BusState *bus)
>  {
> -    qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL);
> +    qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL, NULL, 
> NULL);
>  }
>  
>  void qbus_reset_all_fn(void *opaque)
> @@ -327,49 +327,70 @@ BusState *qdev_get_child_bus(DeviceState *dev, const 
> char *name)
>      return NULL;
>  }
>  
> -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
> -                       qbus_walkerfn *busfn, void *opaque)
> +int qbus_walk_children(BusState *bus,
> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
> +                       void *opaque)
>  {
>      BusChild *kid;
>      int err;
>  
> -    if (busfn) {
> -        err = busfn(bus, opaque);
> +    if (pre_busfn) {
> +        err = pre_busfn(bus, opaque);
>          if (err) {
>              return err;
>          }
>      }
>  
>      QTAILQ_FOREACH(kid, &bus->children, sibling) {
> -        err = qdev_walk_children(kid->child, devfn, busfn, opaque);
> +        err = qdev_walk_children(kid->child,
> +                                 pre_devfn, pre_busfn,
> +                                 post_devfn, post_busfn, opaque);
>          if (err < 0) {
>              return err;
>          }
>      }
>  
> +    if (post_busfn) {
> +        err = post_busfn(bus, opaque);
> +        if (err) {
> +            return err;
> +        }
> +    }
> +
>      return 0;
>  }
>  
> -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
> -                       qbus_walkerfn *busfn, void *opaque)
> +int qdev_walk_children(DeviceState *dev,
> +                       qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn,
> +                       qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn,
> +                       void *opaque)
>  {
>      BusState *bus;
>      int err;
>  
> -    if (devfn) {
> -        err = devfn(dev, opaque);
> +    if (pre_devfn) {
> +        err = pre_devfn(dev, opaque);
>          if (err) {
>              return err;
>          }
>      }
>  
>      QLIST_FOREACH(bus, &dev->child_bus, sibling) {
> -        err = qbus_walk_children(bus, devfn, busfn, opaque);
> +        err = qbus_walk_children(bus, pre_devfn, pre_busfn,
> +                                 post_devfn, post_busfn, opaque);
>          if (err < 0) {
>              return err;
>          }
>      }
>  
> +    if (post_devfn) {
> +        err = post_devfn(dev, opaque);
> +        if (err) {
> +            return err;
> +        }
> +    }
> +
>      return 0;
>  }
>  
> 




reply via email to

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