[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH] fdc: fix detection under Linux

From: John Snow
Subject: [Qemu-block] [PATCH] fdc: fix detection under Linux
Date: Fri, 29 Jan 2016 17:35:32 -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

Document the hack accordingly.

Signed-off-by: John Snow <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 e3b0e1e..36dd23b 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -180,6 +180,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 */
@@ -393,6 +408,7 @@ static void fd_revalidate(FDrive *drv)
         if (!drv->media_inserted) {
             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) {

reply via email to

[Prev in Thread] Current Thread [Next in Thread]