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