0c285e0128
The sysbus floppy controllers (devices sysbus-fdc and sun-fdtwo) don't support DMA. The core floppy controller code expects this to be indicated by setting FDCtrl::dma_chann to -1. This used to be done in the device instance_init functions sysbus_fdc_initfn() and sun4m_fdc_initfn(), but in commit1430759ec3
we refactored this code and accidentally lost the setting of dma_chann. For sysbus-fdc this has no ill effects because we were redundantly also setting dma_chann in fdctrl_init_sysbus(), but for sun-fdtwo this means that guests which try to enable DMA on the floppy controller will cause QEMU to crash because FDCtrl::dma is NULL. Set dma_chann to -1 in the common instance init, and remove the redundant code in fdctrl_init_sysbus() that is also setting it. There is a six-year-old FIXME comment in the jazz board code to the effect that in theory it should support doing DMA via a custom DMA controller. If anybody ever chooses to fix that they can do it by adding support for setting both FDCtrl::dma_chann and FDCtrl::dma. (A QOM link property 'dma-controller' on the sysbus device which can be set to an instance of IsaDmaClass is probably the way to go.) Fixes:1430759ec3
("hw/block/fdc: Extract SysBus floppy controllers to fdc-sysbus.c") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/958 Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20220505101842.2757905-1-peter.maydell@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21 lines
524 B
C
21 lines
524 B
C
#ifndef HW_FDC_H
|
|
#define HW_FDC_H
|
|
|
|
#include "exec/hwaddr.h"
|
|
#include "qapi/qapi-types-block.h"
|
|
|
|
/* fdc.c */
|
|
#define MAX_FD 2
|
|
|
|
#define TYPE_ISA_FDC "isa-fdc"
|
|
|
|
void isa_fdc_init_drives(ISADevice *fdc, DriveInfo **fds);
|
|
void fdctrl_init_sysbus(qemu_irq irq, hwaddr mmio_base, DriveInfo **fds);
|
|
void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
|
|
DriveInfo **fds, qemu_irq *fdc_tc);
|
|
|
|
FloppyDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i);
|
|
int cmos_get_fd_drive_type(FloppyDriveType fd0);
|
|
|
|
#endif
|