qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

sd/pxa2xx_mmci: Don't crash on pxa2xx_mmci_init() error

On error, pxa2xx_mmci_init() reports to stderr and returns NULL.
Callers don't check for errors. Machines akita, borzoi, mainstone,
spitz, terrier, tosa, and z2 crash shortly after, like this:

$ qemu-system-aarch64 -M akita -drive if=sd,readonly=on
qemu-system-aarch64: failed to init SD card: Cannot use read-only drive as SD card
Segmentation fault (core dumped)

Machines connex and verdex reach the check for orphaned drives first:

$ aarch64-softmmu/qemu-system-aarch64 -M connex -drive if=sd,readonly=on -accel qtest
qemu-system-aarch64: failed to init SD card: Cannot use read-only drive as SD card
qemu-system-aarch64: -drive if=sd,readonly=on: machine type does not support if=sd,bus=0,unit=0

Make pxa2xx_mmci_init() fail cleanly right away.

Cc: Andrzej Zaborowski <balrogg@gmail.com>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200622094227.1271650-16-armbru@redhat.com>

+3 -12
+3 -12
hw/sd/pxa2xx_mmci.c
··· 18 18 #include "hw/arm/pxa.h" 19 19 #include "hw/sd/sd.h" 20 20 #include "hw/qdev-properties.h" 21 - #include "qemu/error-report.h" 22 21 #include "qemu/log.h" 23 22 #include "qemu/module.h" 24 23 #include "trace.h" ··· 483 482 DeviceState *dev, *carddev; 484 483 SysBusDevice *sbd; 485 484 PXA2xxMMCIState *s; 486 - Error *err = NULL; 487 485 488 486 dev = qdev_new(TYPE_PXA2XX_MMCI); 489 487 s = PXA2XX_MMCI(dev); ··· 496 494 497 495 /* Create and plug in the sd card */ 498 496 carddev = qdev_new(TYPE_SD_CARD); 499 - qdev_prop_set_drive_err(carddev, "drive", blk, &err); 500 - if (err) { 501 - error_reportf_err(err, "failed to init SD card: "); 502 - return NULL; 503 - } 504 - qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"), &err); 505 - if (err) { 506 - error_reportf_err(err, "failed to init SD card: "); 507 - return NULL; 508 - } 497 + qdev_prop_set_drive_err(carddev, "drive", blk, &error_fatal); 498 + qdev_realize_and_unref(carddev, qdev_get_child_bus(dev, "sd-bus"), 499 + &error_fatal); 509 500 510 501 return s; 511 502 }