qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [6416] Floppy: Properly handle Sense Interrupt Status after


From: Blue Swirl
Subject: [Qemu-devel] [6416] Floppy: Properly handle Sense Interrupt Status after FDC Reset
Date: Sat, 24 Jan 2009 12:09:52 +0000

Revision: 6416
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6416
Author:   blueswir1
Date:     2009-01-24 12:09:52 +0000 (Sat, 24 Jan 2009)

Log Message:
-----------
Floppy: Properly handle Sense Interrupt Status after FDC Reset

Original text below.

Attached is a patch that changes how the emulated floppy controller replies to 
Sense Interrupt Status commands immediately after a controller reset. The specs 
state that after a Reset the 82078 goes into polling mode which needs four 
Sense Interrupt Status commands to be issued afterwards to clear the status of 
each drive. Currently we always respond to Sense Interrupt Status with a SEEK 
END instead of POLLING. This causes a problem with the SCO Openserver installer 
which is expects a POLLING state after reset. This patch returns a POLLING 
status for four Sense Interrupt Status requests immediately after a controller 
reset. This approach mirrors the way Bochs handles this situation. With the 
attached patch applied Openserver gets further when trying to load storage 
drivers from the floppy disk (blocked by another issue, patch on its way). I 
have successfully tested the floppy drive on the following OSs after applying 
this patch: Windows 98, Windows XP SP2, Linux x86 (SysRescCD 1.1.3 and Ubuntu 
8.10).

Justin

Changelog:

Properly handle Sense Interrupt Status after FDC Reset

Signed-off-by: Justin Chevrier <address@hidden>

Modified Paths:
--------------
    trunk/hw/fdc.c

Modified: trunk/hw/fdc.c
===================================================================
--- trunk/hw/fdc.c      2009-01-24 12:00:23 UTC (rev 6415)
+++ trunk/hw/fdc.c      2009-01-24 12:09:52 UTC (rev 6416)
@@ -53,8 +53,9 @@
 #define SET_CUR_DRV(fdctrl, drive) ((fdctrl)->cur_drv = (drive))
 
 /* Will always be a fixed parameter for us */
-#define FD_SECTOR_LEN 512
-#define FD_SECTOR_SC  2   /* Sector size code */
+#define FD_SECTOR_LEN          512
+#define FD_SECTOR_SC           2   /* Sector size code */
+#define FD_RESET_SENSEI_COUNT  4   /* Number of sense interrupts on RESET */
 
 /* Floppy disk drive emulation */
 typedef enum fdisk_type_t {
@@ -506,6 +507,7 @@
     int sun4m;
     /* Floppy drives */
     fdrive_t drives[MAX_FD];
+    int reset_sensei;
 };
 
 static uint32_t fdctrl_read (void *opaque, uint32_t reg)
@@ -763,6 +765,7 @@
         qemu_set_irq(fdctrl->irq, 1);
         fdctrl->sra |= FD_SRA_INTPEND;
     }
+    fdctrl->reset_sensei = 0;
     fdctrl->status0 = status0;
     FLOPPY_DPRINTF("Set interrupt status to 0x%02x\n", fdctrl->status0);
 }
@@ -793,6 +796,7 @@
     fdctrl_reset_fifo(fdctrl);
     if (do_irq) {
         fdctrl_raise_irq(fdctrl, FD_SR0_RDYCHG);
+        fdctrl->reset_sensei = FD_RESET_SENSEI_COUNT;
     }
 }
 
@@ -1601,16 +1605,18 @@
 {
     fdrive_t *cur_drv = get_cur_drv(fdctrl);
 
-#if 0
-    fdctrl->fifo[0] =
-        fdctrl->status0 | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
-#else
-    /* XXX: status0 handling is broken for read/write
-       commands, so we do this hack. It should be suppressed
-       ASAP */
-    fdctrl->fifo[0] =
-        FD_SR0_SEEK | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
-#endif
+    if(fdctrl->reset_sensei > 0) {
+        fdctrl->fifo[0] =
+            FD_SR0_RDYCHG + FD_RESET_SENSEI_COUNT - fdctrl->reset_sensei;
+        fdctrl->reset_sensei--;
+    } else {
+        /* XXX: status0 handling is broken for read/write
+           commands, so we do this hack. It should be suppressed
+           ASAP */
+        fdctrl->fifo[0] =
+            FD_SR0_SEEK | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
+    }
+
     fdctrl->fifo[1] = cur_drv->track;
     fdctrl_set_fifo(fdctrl, 2, 0);
     fdctrl_reset_irq(fdctrl);






reply via email to

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