diff mbox series

[PATCH-for-6.2,1/2] hw/scsi/lsi53c895a: Do not abort when DMA requested and no data queued

Message ID 20211123111732.83137-2-philmd@redhat.com
State New
Headers show
Series hw/scsi/lsi53c895a: Fix guest-triggerable assert() in lsi_do_dma() | expand

Commit Message

Philippe Mathieu-Daudé Nov. 23, 2021, 11:17 a.m. UTC
If asked for DMA request and no data is available, simply wait
for data to be queued, do not abort. This fixes:

  $ cat << EOF | \
    qemu-system-i386 -nographic -M q35,accel=qtest -serial none \
      -monitor none -qtest stdio -trace lsi* \
      -drive if=none,id=drive0,file=null-co://,file.read-zeroes=on,format=raw \
      -device lsi53c895a,id=scsi0 -device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0
  lsi_reset Reset
  lsi_reg_write Write reg DSP2 0x2e = 0xff
  lsi_reg_write Write reg DSP3 0x2f = 0xff
  lsi_execute_script SCRIPTS dsp=0xffff0000 opcode 0x184a3900 arg 0x4a8b2d75
  qemu-system-i386: hw/scsi/lsi53c895a.c:624: lsi_do_dma: Assertion `s->current' failed.

  (gdb) bt
  #5  0x00007ffff4e8a3a6 in __GI___assert_fail
      (assertion=0x5555560accbc "s->current", file=0x5555560acc28 "hw/scsi/lsi53c895a.c", line=624, function=0x5555560adb18 "lsi_do_dma") at assert.c:101
  #6  0x0000555555aa33b9 in lsi_do_dma (s=0x555557805ac0, out=1) at hw/scsi/lsi53c895a.c:624
  #7  0x0000555555aa5042 in lsi_execute_script (s=0x555557805ac0) at hw/scsi/lsi53c895a.c:1250
  #8  0x0000555555aa757a in lsi_reg_writeb (s=0x555557805ac0, offset=47, val=255 '\377') at hw/scsi/lsi53c895a.c:1984
  #9  0x0000555555aa875b in lsi_mmio_write (opaque=0x555557805ac0, addr=47, val=255, size=1) at hw/scsi/lsi53c895a.c:2095

Cc: qemu-stable@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Vadim Rozenfeld <vrozenfe@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Reported-by: Jérôme Poulin <jeromepoulin@gmail.com>
Reported-by: Ruhr-University <bugs-syssec@rub.de>
Reported-by: Gaoning Pan <pgn@zju.edu.cn>
Reported-by: Cheolwoo Myung <cwmyung@snu.ac.kr>
Fixes: b96a0da06bd ("lsi: move dma_len+dma_buf into lsi_request")
BugLink: https://bugs.launchpad.net/qemu/+bug/697510
BugLink: https://bugs.launchpad.net/qemu/+bug/1905521
BugLink: https://bugs.launchpad.net/qemu/+bug/1908515
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/84
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/305
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/552
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/scsi/lsi53c895a.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Laurent Vivier Nov. 23, 2021, 11:26 a.m. UTC | #1
On 23/11/2021 12:17, Philippe Mathieu-Daudé wrote:
> If asked for DMA request and no data is available, simply wait
> for data to be queued, do not abort. This fixes:
> 
>    $ cat << EOF | \
>      qemu-system-i386 -nographic -M q35,accel=qtest -serial none \
>        -monitor none -qtest stdio -trace lsi* \
>        -drive if=none,id=drive0,file=null-co://,file.read-zeroes=on,format=raw \
>        -device lsi53c895a,id=scsi0 -device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0
>    lsi_reset Reset
>    lsi_reg_write Write reg DSP2 0x2e = 0xff
>    lsi_reg_write Write reg DSP3 0x2f = 0xff
>    lsi_execute_script SCRIPTS dsp=0xffff0000 opcode 0x184a3900 arg 0x4a8b2d75
>    qemu-system-i386: hw/scsi/lsi53c895a.c:624: lsi_do_dma: Assertion `s->current' failed.
> 
>    (gdb) bt
>    #5  0x00007ffff4e8a3a6 in __GI___assert_fail
>        (assertion=0x5555560accbc "s->current", file=0x5555560acc28 "hw/scsi/lsi53c895a.c", line=624, function=0x5555560adb18 "lsi_do_dma") at assert.c:101
>    #6  0x0000555555aa33b9 in lsi_do_dma (s=0x555557805ac0, out=1) at hw/scsi/lsi53c895a.c:624
>    #7  0x0000555555aa5042 in lsi_execute_script (s=0x555557805ac0) at hw/scsi/lsi53c895a.c:1250
>    #8  0x0000555555aa757a in lsi_reg_writeb (s=0x555557805ac0, offset=47, val=255 '\377') at hw/scsi/lsi53c895a.c:1984
>    #9  0x0000555555aa875b in lsi_mmio_write (opaque=0x555557805ac0, addr=47, val=255, size=1) at hw/scsi/lsi53c895a.c:2095
> 
> Cc: qemu-stable@nongnu.org
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Vadim Rozenfeld <vrozenfe@redhat.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>
> Reported-by: Jérôme Poulin <jeromepoulin@gmail.com>
> Reported-by: Ruhr-University <bugs-syssec@rub.de>
> Reported-by: Gaoning Pan <pgn@zju.edu.cn>
> Reported-by: Cheolwoo Myung <cwmyung@snu.ac.kr>
> Fixes: b96a0da06bd ("lsi: move dma_len+dma_buf into lsi_request")
> BugLink: https://bugs.launchpad.net/qemu/+bug/697510
> BugLink: https://bugs.launchpad.net/qemu/+bug/1905521
> BugLink: https://bugs.launchpad.net/qemu/+bug/1908515
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/84
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/305
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/552
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
>   hw/scsi/lsi53c895a.c | 3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
> index 85e907a7854..4c431adb774 100644
> --- a/hw/scsi/lsi53c895a.c
> +++ b/hw/scsi/lsi53c895a.c
> @@ -621,8 +621,7 @@ static void lsi_do_dma(LSIState *s, int out)
>       dma_addr_t addr;
>       SCSIDevice *dev;
>   
> -    assert(s->current);
> -    if (!s->current->dma_len) {
> +    if (!s->current || !s->current->dma_len) {
>           /* Wait until data is available.  */
>           trace_lsi_do_dma_unavailable();
>           return;
> 

Reviewed-by: Laurent Vivier <lvivier@redhat.com>
diff mbox series

Patch

diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 85e907a7854..4c431adb774 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -621,8 +621,7 @@  static void lsi_do_dma(LSIState *s, int out)
     dma_addr_t addr;
     SCSIDevice *dev;
 
-    assert(s->current);
-    if (!s->current->dma_len) {
+    if (!s->current || !s->current->dma_len) {
         /* Wait until data is available.  */
         trace_lsi_do_dma_unavailable();
         return;