qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v4 09/11] fdc: check if media rate is correct be


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH v4 09/11] fdc: check if media rate is correct before doing any transfer
Date: Tue, 14 Feb 2012 16:16:44 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20120131 Thunderbird/10.0

Am 06.02.2012 22:29, schrieb Hervé Poussineau:
> The programmed rate has to be the same as the required rate for the
> floppy format ; if that's not the case, the transfer should abort.
> This check can be disabled by using the 'check_media_rate' property.
> 
> Save media rate value only if media rate check is enabled.
> 
> Signed-off-by: Hervé Poussineau <address@hidden>
> ---
>  hw/fdc.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 50 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/fdc.c b/hw/fdc.c
> index af007ae..d2a22fa 100644
> --- a/hw/fdc.c
> +++ b/hw/fdc.c
> @@ -62,12 +62,15 @@
>  #define FD_SECTOR_SC           2   /* Sector size code */
>  #define FD_RESET_SENSEI_COUNT  4   /* Number of sense interrupts on RESET */
>  
> +typedef struct FDCtrl FDCtrl;
> +
>  /* Floppy disk drive emulation */
>  typedef enum FDiskFlags {
>      FDISK_DBL_SIDES  = 0x01,
>  } FDiskFlags;
>  
>  typedef struct FDrive {
> +    FDCtrl *fdctrl;
>      BlockDriverState *bs;
>      /* Drive status */
>      FDriveType drive;
> @@ -83,6 +86,7 @@ typedef struct FDrive {
>      uint16_t bps;             /* Bytes per sector       */
>      uint8_t ro;               /* Is read-only           */
>      uint8_t media_changed;    /* Is media changed       */
> +    uint8_t media_rate;       /* Data rate of medium    */
>  } FDrive;
>  
>  static void fd_init(FDrive *drv)
> @@ -195,6 +199,7 @@ static void fd_revalidate(FDrive *drv)
>          drv->last_sect = last_sect;
>          drv->ro = ro;
>          drv->drive = drive;
> +        drv->media_rate = rate;
>      } else {
>          FLOPPY_DPRINTF("No disk in drive\n");
>          drv->last_sect = 0;
> @@ -206,8 +211,6 @@ static void fd_revalidate(FDrive *drv)
>  /********************************************************/
>  /* Intel 82078 floppy disk controller emulation          */
>  
> -typedef struct FDCtrl FDCtrl;
> -
>  static void fdctrl_reset(FDCtrl *fdctrl, int do_irq);
>  static void fdctrl_reset_fifo(FDCtrl *fdctrl);
>  static int fdctrl_transfer_handler (void *opaque, int nchan,
> @@ -303,6 +306,7 @@ enum {
>  };
>  
>  enum {
> +    FD_SR1_MA       = 0x01, /* Missing address mark */
>      FD_SR1_NW       = 0x02, /* Not writable */
>      FD_SR1_EC       = 0x80, /* End of cylinder */
>  };
> @@ -549,6 +553,24 @@ static const VMStateDescription 
> vmstate_fdrive_media_changed = {
>      }
>  };
>  
> +static bool fdrive_media_rate_needed(void *opaque)
> +{
> +    FDrive *drive = opaque;
> +
> +    return drive->fdctrl->check_media_rate;
> +}
> +
> +static const VMStateDescription vmstate_fdrive_media_rate = {
> +    .name = "fdrive/media_rate",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .minimum_version_id_old = 1,
> +    .fields      = (VMStateField[]) {
> +        VMSTATE_UINT8(media_rate, FDrive),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};

Juan, Paolo, this is a subsection in a struct array. Does this work
meanwhile or is it still broken?

Kevin



reply via email to

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