qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH][Resend] Floppy: Properly handle Sense Interrupt


From: Justin Chevrier
Subject: Re: [Qemu-devel] [PATCH][Resend] Floppy: Properly handle Sense Interrupt Status after FDC Reset
Date: Mon, 26 Jan 2009 11:19:29 -0800 (PST)

Thanks for the heads up Anthony.

I will attach future patches.

Justin


--- On Mon, 1/26/09, Anthony Liguori <address@hidden> wrote:

> From: Anthony Liguori <address@hidden>
> Subject: Re: [Qemu-devel] [PATCH][Resend] Floppy: Properly handle Sense 
> Interrupt Status after FDC Reset
> To: address@hidden, address@hidden
> Date: Monday, January 26, 2009, 12:05 PM
> Justin Chevrier wrote:
> > 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>
> >   
> 
> The patch is whitespace damaged.
> 
> > Index: hw/fdc.c
> >
> ===================================================================
> > --- hw/fdc.c    (revision 6193)
> > +++ hw/fdc.c    (working copy)
> > @@ -53,8 +53,9 @@
> > #define SET_CUR_DRV(fdctrl, drive)
> ((fdctrl)->cur_drv = (drive))
> >   
> 
> The leading space seems to have gotten stripped.  A tool
> like git-email 
> or attaching if your mailer uses text/plain would ensure
> this doesn't 
> happen.
> 
> Regards,
> 
> Anthony Liguori
> 
> > /* 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]