All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] fdc: fix detection under Linux
@ 2016-01-29 22:35 John Snow
  2016-01-30  0:15 ` Eric Blake
  2016-02-01 21:02 ` Hervé Poussineau
  0 siblings, 2 replies; 3+ messages in thread
From: John Snow @ 2016-01-29 22:35 UTC (permalink / raw)
  To: qemu-block; +Cc: John Snow, pbonzini, hpoussin, qemu-devel

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.

Signed-off-by: John Snow <jsnow@redhat.com>
---
 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) {
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-02-01 21:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-29 22:35 [Qemu-devel] [PATCH] fdc: fix detection under Linux John Snow
2016-01-30  0:15 ` Eric Blake
2016-02-01 21:02 ` Hervé Poussineau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.