[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 01/20] fdc: fix detection under Linux
From: |
John Snow |
Subject: |
[Qemu-devel] [PULL 01/20] fdc: fix detection under Linux |
Date: |
Wed, 3 Feb 2016 15:32:16 -0500 |
Accidentally, I removed a "feature" where empty drives had geometry
values applied to them, which allows seek on empty drives to work
"by accident," as QEMU actually tries to disallow that.
Seeks on empty drives should work, though, but the easiest thing is to
restore the misfeature where empty drives have non-zero geometries
applied.
Document the hack accordingly.
[Maintainer edit]
This fix corrects a regression introduced in d5d47efc, where
pick_geometry was modified such that it would not operate on empty
drives, and as a result if there is no diskette inserted, QEMU
no longer populates it with geometry bounds. As a result, seek fails
when QEMU denies to move the current track, but reports success anyway.
This can confuse the guest, leading to kernel panics in the guest.
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Message-id: address@hidden
---
hw/block/fdc.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 818e8a4..9ef899d 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -179,6 +179,21 @@ typedef struct FDrive {
static FloppyDriveType get_fallback_drive_type(FDrive *drv);
+/* Hack: FD_SEEK is expected to work on empty drives. However, QEMU
+ * currently goes through some pains to keep seeks within the bounds
+ * established by last_sect and max_track. Correcting this is difficult,
+ * as refactoring FDC code tends to expose nasty bugs in the Linux kernel.
+ *
+ * For now: allow empty drives to have large bounds so we can seek around,
+ * with the understanding that when a diskette is inserted, the bounds will
+ * properly tighten to match the geometry of that inserted medium.
+ */
+static void fd_empty_seek_hack(FDrive *drv)
+{
+ drv->last_sect = 0xFF;
+ drv->max_track = 0xFF;
+}
+
static void fd_init(FDrive *drv)
{
/* Drive */
@@ -394,6 +409,7 @@ static void fd_revalidate(FDrive *drv)
if (!blk_is_inserted(drv->blk)) {
FLOPPY_DPRINTF("No disk in drive\n");
drv->disk = FLOPPY_DRIVE_TYPE_NONE;
+ fd_empty_seek_hack(drv);
} else if (!drv->media_validated) {
rc = pick_geometry(drv);
if (rc) {
--
2.4.3
- [Qemu-devel] [PULL 00/20] FDC patches, John Snow, 2016/02/03
- [Qemu-devel] [PULL 01/20] fdc: fix detection under Linux,
John Snow <=
- [Qemu-devel] [PULL 08/20] i8257: add missing const, John Snow, 2016/02/03
- [Qemu-devel] [PULL 03/20] i8257: pass ISA bus to DMA_init() function, John Snow, 2016/02/03
- [Qemu-devel] [PULL 10/20] i8257: move state definition to new independent header, John Snow, 2016/02/03
- [Qemu-devel] [PULL 12/20] i8257: implement the IsaDma interface, John Snow, 2016/02/03
- [Qemu-devel] [PULL 06/20] i8257: rename functions to start with i8257_ prefix, John Snow, 2016/02/03
- [Qemu-devel] [PULL 09/20] i8257: QOM'ify, John Snow, 2016/02/03
- [Qemu-devel] [PULL 05/20] i8257: rename struct dma_regs to I8257Regs, John Snow, 2016/02/03
- [Qemu-devel] [PULL 13/20] magnum: disable floppy DMA for now, John Snow, 2016/02/03
- [Qemu-devel] [PULL 02/20] i82374: device only existed as ISA device, so simplify device, John Snow, 2016/02/03
- [Qemu-devel] [PULL 04/20] i8257: rename struct dma_cont to I8257State, John Snow, 2016/02/03