On Tue, Jan 09, 2024 at 07:49:16PM +0100, Stefan Fritsch wrote:
> @bluhm: Does the attached patch fix the panic? 

Yes.  My test does not crash the patched guest anymore.

bluhm

> The fdt part is completely untested, testers welcome.
> 
> diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c
> index 4f1e9eba9b7..27fb17d6102 100644
> --- a/sys/dev/fdt/virtio_mmio.c
> +++ b/sys/dev/fdt/virtio_mmio.c
> @@ -200,11 +200,19 @@ virtio_mmio_set_status(struct virtio_softc *vsc, int 
> status)
>       struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc;
>       int old = 0;
>  
> -     if (status != 0)
> +     if (status == 0) {
> +             bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
> +                 0);
> +             while (bus_space_read_4(sc->sc_iot, sc->sc_ioh,
> +                 VIRTIO_MMIO_STATUS) != 0) {
> +                     CPU_BUSY_CYCLE();
> +             }
> +     } else  {
>               old = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
> -                                    VIRTIO_MMIO_STATUS);
> -     bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
> -                       status|old);
> +                 VIRTIO_MMIO_STATUS);
> +             bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_STATUS,
> +                 status|old);
> +     }
>  }
>  
>  int
> diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c
> index 398dc960f6d..ef95c834823 100644
> --- a/sys/dev/pci/virtio_pci.c
> +++ b/sys/dev/pci/virtio_pci.c
> @@ -282,15 +282,29 @@ virtio_pci_set_status(struct virtio_softc *vsc, int 
> status)
>       int old = 0;
>  
>       if (sc->sc_sc.sc_version_1) {
> -             if (status != 0)
> +             if (status == 0) {
> +                     CWRITE(sc, device_status, 0);
> +                     while (CREAD(sc, device_status) != 0) {
> +                             CPU_BUSY_CYCLE();
> +                     }
> +             } else {
>                       old = CREAD(sc, device_status);
> -             CWRITE(sc, device_status, status|old);
> +                     CWRITE(sc, device_status, status|old);
> +             }
>       } else {
> -             if (status != 0)
> +             if (status == 0) {
> +                     bus_space_write_1(sc->sc_iot, sc->sc_ioh,
> +                         VIRTIO_CONFIG_DEVICE_STATUS, status|old);
> +                     while (bus_space_read_1(sc->sc_iot, sc->sc_ioh,
> +                         VIRTIO_CONFIG_DEVICE_STATUS) != 0) {
> +                             CPU_BUSY_CYCLE();
> +                     }
> +             } else {
>                       old = bus_space_read_1(sc->sc_iot, sc->sc_ioh,
>                           VIRTIO_CONFIG_DEVICE_STATUS);
> -             bus_space_write_1(sc->sc_iot, sc->sc_ioh,
> -                 VIRTIO_CONFIG_DEVICE_STATUS, status|old);
> +                     bus_space_write_1(sc->sc_iot, sc->sc_ioh,
> +                         VIRTIO_CONFIG_DEVICE_STATUS, status|old);
> +             }
>       }
>  }
>  

Reply via email to