diff mbox

fdc: fix detection under Linux

Message ID 1454106932-17236-1-git-send-email-jsnow@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

John Snow Jan. 29, 2016, 10:35 p.m. UTC
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(+)

Comments

Eric Blake Jan. 30, 2016, 12:15 a.m. UTC | #1
On 01/29/2016 03:35 PM, John Snow wrote:
> 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(+)

Reviewed-by: Eric Blake <eblake@redhat.com>
Hervé Poussineau Feb. 1, 2016, 9:02 p.m. UTC | #2
Le 29/01/2016 23:35, John Snow a écrit :
> 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(+)

Tested-by: Hervé Poussineau <hpoussin@reactos.org>
diff mbox

Patch

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) {