From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32828) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aORqd-0005Sz-JR for qemu-devel@nongnu.org; Wed, 27 Jan 2016 10:17:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aORqY-0005dk-QO for qemu-devel@nongnu.org; Wed, 27 Jan 2016 10:17:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:56775) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aORqY-0005dg-IC for qemu-devel@nongnu.org; Wed, 27 Jan 2016 10:17:26 -0500 References: <1453750885-16066-1-git-send-email-jsnow@redhat.com> <1453750885-16066-8-git-send-email-jsnow@redhat.com> <56A8BA4E.3080106@redhat.com> From: John Snow Message-ID: <56A8DF85.7090604@redhat.com> Date: Wed, 27 Jan 2016 10:17:25 -0500 MIME-Version: 1.0 In-Reply-To: <56A8BA4E.3080106@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PULL 07/13] fdc: add pick_drive List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org On 01/27/2016 07:38 AM, Paolo Bonzini wrote: >=20 >=20 > On 25/01/2016 20:41, John Snow wrote: >> Split apart pick_geometry by creating a pick_drive routine that will o= nly >> ever called during device bring-up instead of relying on pick_geometry= to >> be used in both cases. >> >> With this change, the drive field is changed to be 'write once'. It is >> not altered after the initialization routines exit. >> >> media_validated does not need to be migrated. The target VM >> will just revalidate the media on post_load anyway. >> >> Reviewed-by: Eric Blake >> Signed-off-by: John Snow >> Message-id: 1453495865-9649-7-git-send-email-jsnow@redhat.com >=20 > Sorry, this breaks the RHEL6.5 Linux installer CD. It just hangs at > floppy detection and finally panics. >=20 > Paolo >=20 Crap, alright. I'll get right to it. That's what I get for poking a hibernating bear. >> --- >> hw/block/fdc.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++---= ------- >> 1 file changed, 46 insertions(+), 10 deletions(-) >> >> diff --git a/hw/block/fdc.c b/hw/block/fdc.c >> index a8f0cf2..f8e070e 100644 >> --- a/hw/block/fdc.c >> +++ b/hw/block/fdc.c >> @@ -151,6 +151,7 @@ typedef struct FDrive { >> uint8_t media_rate; /* Data rate of medium */ >> =20 >> bool media_inserted; /* Is there a medium in the tray */ >> + bool media_validated; /* Have we validated the media? */ >> } FDrive; >> =20 >> static void fd_init(FDrive *drv) >> @@ -162,6 +163,8 @@ static void fd_init(FDrive *drv) >> drv->disk =3D FLOPPY_DRIVE_TYPE_NONE; >> drv->last_sect =3D 0; >> drv->max_track =3D 0; >> + drv->ro =3D true; >> + drv->media_changed =3D 1; >> } >> =20 >> #define NUM_SIDES(drv) ((drv)->flags & FDISK_DBL_SIDES ? 2 : 1) >> @@ -244,13 +247,24 @@ static void fd_recalibrate(FDrive *drv) >> fd_seek(drv, 0, 0, 1, 1); >> } >> =20 >> -static void pick_geometry(FDrive *drv) >> +/** >> + * Determine geometry based on inserted diskette. >> + * Will not operate on an empty drive. >> + * >> + * @return: 0 on success, -1 if the drive is empty. >> + */ >> +static int pick_geometry(FDrive *drv) >> { >> BlockBackend *blk =3D drv->blk; >> const FDFormat *parse; >> uint64_t nb_sectors, size; >> int i, first_match, match; >> =20 >> + /* We can only pick a geometry if we have a diskette. */ >> + if (!drv->media_inserted) { >> + return -1; >> + } >> + >> blk_get_geometry(blk, &nb_sectors); >> match =3D -1; >> first_match =3D -1; >> @@ -290,31 +304,51 @@ static void pick_geometry(FDrive *drv) >> } >> drv->max_track =3D parse->max_track; >> drv->last_sect =3D parse->last_sect; >> - drv->drive =3D parse->drive; >> - drv->disk =3D drv->media_inserted ? parse->drive : FLOPPY_DRIVE_T= YPE_NONE; >> + drv->disk =3D parse->drive; >> drv->media_rate =3D parse->rate; >> + return 0; >> +} >> + >> +static void pick_drive_type(FDrive *drv) >> +{ >> + if (pick_geometry(drv) =3D=3D 0) { >> + drv->drive =3D drv->disk; >> + } else { >> + /* Legacy behavior: default to 1.44MB floppy */ >> + drv->drive =3D FLOPPY_DRIVE_TYPE_144; >> + } >> } >> =20 >> /* Revalidate a disk drive after a disk change */ >> static void fd_revalidate(FDrive *drv) >> { >> + int rc; >> + >> FLOPPY_DPRINTF("revalidate\n"); >> if (drv->blk !=3D NULL) { >> drv->ro =3D blk_is_read_only(drv->blk); >> - pick_geometry(drv); >> if (!drv->media_inserted) { >> FLOPPY_DPRINTF("No disk in drive\n"); >> - } else { >> - FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", >> - (drv->flags & FDISK_DBL_SIDES) ? 2 : 1, >> - drv->max_track, drv->last_sect, >> - drv->ro ? "ro" : "rw"); >> + drv->disk =3D FLOPPY_DRIVE_TYPE_NONE; >> + } else if (!drv->media_validated) { >> + rc =3D pick_geometry(drv); >> + if (rc) { >> + FLOPPY_DPRINTF("Could not validate floppy drive media= "); >> + } else { >> + drv->media_validated =3D true; >> + FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", >> + (drv->flags & FDISK_DBL_SIDES) ? 2 : 1= , >> + drv->max_track, drv->last_sect, >> + drv->ro ? "ro" : "rw"); >> + } >> } >> } else { >> FLOPPY_DPRINTF("No drive connected\n"); >> drv->last_sect =3D 0; >> drv->max_track =3D 0; >> drv->flags &=3D ~FDISK_DBL_SIDES; >> + drv->drive =3D FLOPPY_DRIVE_TYPE_NONE; >> + drv->disk =3D FLOPPY_DRIVE_TYPE_NONE; >> } >> } >> =20 >> @@ -2185,6 +2219,7 @@ static void fdctrl_change_cb(void *opaque, bool = load) >> drive->media_inserted =3D load && drive->blk && blk_is_inserted(d= rive->blk); >> =20 >> drive->media_changed =3D 1; >> + drive->media_validated =3D false; >> fd_revalidate(drive); >> } >> =20 >> @@ -2221,11 +2256,12 @@ static void fdctrl_connect_drives(FDCtrl *fdct= rl, Error **errp) >> } >> =20 >> fd_init(drive); >> - fdctrl_change_cb(drive, 0); >> if (drive->blk) { >> blk_set_dev_ops(drive->blk, &fdctrl_block_ops, drive); >> drive->media_inserted =3D blk_is_inserted(drive->blk); >> + pick_drive_type(drive); >> } >> + fd_revalidate(drive); >> } >> } >> =20 >> >=20 --=20 =97js