Re: [Qemu-devel] floppy disk

2007-12-17 Thread Benjamin David Lunt


- Original Message - 
From: "J. Mayer" <[EMAIL PROTECTED]>

To: 
Sent: Monday, December 17, 2007 7:40 AM
Subject: Re: [Qemu-devel] floppy disk




On Mon, 2007-12-17 at 03:28 +, Thiemo Seufer wrote:

Benjamin David Lunt wrote:
> Hi everyone,
>
> I only recently have started to use QEmu due to a request
> on the alt.os.development usenet group.  My OS was not working
> on QEmu due to it would not recognize the (emulated) floppy.
>
> After a lot of testing, QEmu does not return the correct
> values for a Sense Interrupt command and the Status 0 byte.
>
> After looking over fdc.cc, someone has placed a hack write
> where it should return these values.
>
> I am just wondering if this hack is temporary or if it will
> be committed as code.

That's the current state of the code in CVS.


This hack is terribly bugged and is likely to break all commands
status...


> For a more detailed description, QEmu returns the value
> 0x20 while Bochs, VMware, and real hardware return the
> values 0xC0, 0xC1, 0xC2, and 0xC3, for each drive 1 - 4
> respectively.


The polling mode is not implemented (and is even emulated in real
hardware) and only exists for 8" drives compatibility, according to
Intel specification, then has no meaning when using other drives
formats. Any reasonable OS would then disable this feature with a
CONFIGURE command as it's pointless on any modern machine (all PCs, for
example).


I only use it after reset to see if there are four interrupts waiting.
If so, I go ahead with the floppy controller detection.  Else, I assume
no controller attached to this port.  As soon as I receive the four
interrupts, I send the configure command to disable polling.

I don't think QEmu needs total polling support.  Just the four interrupts
at the first.  I will look at your patch to see if this is what you
have added.


But it can be easily added, implementing the missing internal "emulated
drive status change" register, as described in the 82078 datasheet.


> I am asking for more information on this subject.

The interrupt status handling in QEMU's FDC emulation looks bogus
to me, patches to fix it are welcome. :-)


After taking a look to the specs and the code, it seems to me that the
greatest bug here is the hack added in the SENSE_INTERRUPT_STATUS
command answer. The 'SE' bit in status register 0 is set properly in
case of 'implied seek' without the hack. And, as far as I can see, not
all hardware do update this bit after read and write commands (Intel
82078 does, NS and SMC superIOs do not, according to their datasheet),
so it should not hurt any OS not having it set after any READ or WRITE
command.
So, the hack is really more buggy than the previous code:
- the SE bit (0x20) should be set only when there have been a implied
seek for READ & WRITE command. This case is hopefully not the common
case, as OSes always try to do sequential reads/writes for performances
reasons, and is properly handled, at least in DMA transfer case. There's
a case to be checked in case of PIO transfers: the bit seems always set,
even if no implied seek was done, which is buggy.
- the SE bit is never set by some hardware on any READ & WRITE commands,
then any code that would rely on this bit to be set on those commands
won't run on real hardware and is broken.
- it breaks all other commands status cases

One case that seems obviously not correct is that the
SENSE_INTERRUPT_STATUS should be treated as an invalid command when
there is no interrupt condition set.

The following patch implements the polling mode and the invalid
SENSE_INTERRUPT_STATUS case.



Thanks.  I will have a look at it.  I will have to see if I can get
the current CVS to compile on my WinXP box using MS VC.

Thanks again,
Ben





Re: [Qemu-devel] floppy disk

2007-12-17 Thread J. Mayer

On Mon, 2007-12-17 at 03:28 +, Thiemo Seufer wrote:
> Benjamin David Lunt wrote:
> > Hi everyone,
> >
> > I only recently have started to use QEmu due to a request
> > on the alt.os.development usenet group.  My OS was not working
> > on QEmu due to it would not recognize the (emulated) floppy.
> >
> > After a lot of testing, QEmu does not return the correct
> > values for a Sense Interrupt command and the Status 0 byte.
> >
> > After looking over fdc.cc, someone has placed a hack write
> > where it should return these values.
> >
> > I am just wondering if this hack is temporary or if it will
> > be committed as code.
> 
> That's the current state of the code in CVS.

This hack is terribly bugged and is likely to break all commands
status...

> > For a more detailed description, QEmu returns the value
> > 0x20 while Bochs, VMware, and real hardware return the
> > values 0xC0, 0xC1, 0xC2, and 0xC3, for each drive 1 - 4
> > respectively.

The polling mode is not implemented (and is even emulated in real
hardware) and only exists for 8" drives compatibility, according to
Intel specification, then has no meaning when using other drives
formats. Any reasonable OS would then disable this feature with a
CONFIGURE command as it's pointless on any modern machine (all PCs, for
example).
But it can be easily added, implementing the missing internal "emulated
drive status change" register, as described in the 82078 datasheet.

> > I am asking for more information on this subject.
> 
> The interrupt status handling in QEMU's FDC emulation looks bogus
> to me, patches to fix it are welcome. :-)

After taking a look to the specs and the code, it seems to me that the
greatest bug here is the hack added in the SENSE_INTERRUPT_STATUS
command answer. The 'SE' bit in status register 0 is set properly in
case of 'implied seek' without the hack. And, as far as I can see, not
all hardware do update this bit after read and write commands (Intel
82078 does, NS and SMC superIOs do not, according to their datasheet),
so it should not hurt any OS not having it set after any READ or WRITE
command.
So, the hack is really more buggy than the previous code:
- the SE bit (0x20) should be set only when there have been a implied
seek for READ & WRITE command. This case is hopefully not the common
case, as OSes always try to do sequential reads/writes for performances
reasons, and is properly handled, at least in DMA transfer case. There's
a case to be checked in case of PIO transfers: the bit seems always set,
even if no implied seek was done, which is buggy.
- the SE bit is never set by some hardware on any READ & WRITE commands,
then any code that would rely on this bit to be set on those commands
won't run on real hardware and is broken.
- it breaks all other commands status cases

One case that seems obviously not correct is that the
SENSE_INTERRUPT_STATUS should be treated as an invalid command when
there is no interrupt condition set.

The following patch implements the polling mode and the invalid
SENSE_INTERRUPT_STATUS case.

-- 
J. Mayer <[EMAIL PROTECTED]>
Never organized
Index: hw/fdc.c
===
RCS file: /sources/qemu/qemu/hw/fdc.c,v
retrieving revision 1.33
diff -u -d -d -p -r1.33 fdc.c
--- hw/fdc.c	17 Nov 2007 17:14:41 -	1.33
+++ hw/fdc.c	17 Dec 2007 14:17:10 -
@@ -399,6 +399,8 @@ struct fdctrl_t {
 uint8_t lock;
 /* Power down config (also with status regB access mode */
 uint8_t pwrd;
+/* Drive status change emulation */
+uint8_t drstch;
 /* Sun4m quirks? */
 int sun4m;
 /* Floppy drives */
@@ -674,7 +676,7 @@ static void fdctrl_raise_irq (fdctrl_t *
 fdctrl->int_status = status;
 return;
 }
-if (~(fdctrl->state & FD_CTRL_INTR)) {
+if (!(fdctrl->state & FD_CTRL_INTR)) {
 qemu_set_irq(fdctrl->irq, 1);
 fdctrl->state |= FD_CTRL_INTR;
 }
@@ -698,6 +700,8 @@ static void fdctrl_reset (fdctrl_t *fdct
 fdctrl->data_dir = FD_DIR_WRITE;
 for (i = 0; i < MAX_FD; i++)
 fd_reset(&fdctrl->drives[i]);
+/* Initialize the emulated drive status change register */
+fdctrl->drstch = 0xF;
 fdctrl_reset_fifo(fdctrl);
 if (do_irq)
 fdctrl_raise_irq(fdctrl, 0xc0);
@@ -1410,17 +1414,36 @@ static void fdctrl_write_data (fdctrl_t 
 /* SENSE_INTERRUPT_STATUS */
 FLOPPY_DPRINTF("SENSE_INTERRUPT_STATUS command (%02x)\n",
fdctrl->int_status);
-/* No parameters cmd: returns status if no interrupt */
+/* No parameters cmd: returns interrupt status */
+if (!(fdctrl->config & 0x10) && fdctrl->drstch != 0x00) {
+/* If emulated polling mode is active... */
+int i;
+for (i = 0; i < 4; i++) {
+if (fdctrl->drstch & (1 << i)) {
+/* Emulate 8" drive 'i' status change */
+fdct

Re: [Qemu-devel] floppy disk

2007-12-16 Thread Benjamin David Lunt


- Original Message - 
From: "Thiemo Seufer" <[EMAIL PROTECTED]>

To: "Benjamin David Lunt" <[EMAIL PROTECTED]>
Cc: 
Sent: Sunday, December 16, 2007 8:28 PM
Subject: Re: [Qemu-devel] floppy disk



Benjamin David Lunt wrote:

Hi everyone,

I only recently have started to use QEmu due to a request
on the alt.os.development usenet group.  My OS was not working
on QEmu due to it would not recognize the (emulated) floppy.

After a lot of testing, QEmu does not return the correct
values for a Sense Interrupt command and the Status 0 byte.

After looking over fdc.cc, someone has placed a hack write
where it should return these values.

I am just wondering if this hack is temporary or if it will
be committed as code.


That's the current state of the code in CVS.


For a more detailed description, QEmu returns the value
0x20 while Bochs, VMware, and real hardware return the
values 0xC0, 0xC1, 0xC2, and 0xC3, for each drive 1 - 4
respectively.

I am asking for more information on this subject.


The interrupt status handling in QEMU's FDC emulation looks bogus
to me, patches to fix it are welcome. :-)


Hi Thiemo,

(smile)  I may have a chance to do so in the near future.
If I do, I will post it here or find the correct way to post
a patch.

Thanks,
Ben







Re: [Qemu-devel] floppy disk

2007-12-16 Thread Thiemo Seufer
Benjamin David Lunt wrote:
> Hi everyone,
>
> I only recently have started to use QEmu due to a request
> on the alt.os.development usenet group.  My OS was not working
> on QEmu due to it would not recognize the (emulated) floppy.
>
> After a lot of testing, QEmu does not return the correct
> values for a Sense Interrupt command and the Status 0 byte.
>
> After looking over fdc.cc, someone has placed a hack write
> where it should return these values.
>
> I am just wondering if this hack is temporary or if it will
> be committed as code.

That's the current state of the code in CVS.

> For a more detailed description, QEmu returns the value
> 0x20 while Bochs, VMware, and real hardware return the
> values 0xC0, 0xC1, 0xC2, and 0xC3, for each drive 1 - 4
> respectively.
>
> I am asking for more information on this subject.

The interrupt status handling in QEMU's FDC emulation looks bogus
to me, patches to fix it are welcome. :-)


Thiemo