[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 03/10] fdc: respect default drive type
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [RFC 03/10] fdc: respect default drive type |
Date: |
Fri, 03 Jul 2015 15:34:39 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
John Snow <address@hidden> writes:
> Respect the default drive type as proffered via the CLI.
>
> This patch overloads the "drive out" parameter of pick_geometry
> to be used as a "default hint" which is offered by fd_revalidate.
>
> Signed-off-by: John Snow <address@hidden>
> ---
> hw/block/fdc.c | 27 +++++++++++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index 1023a01..87fd770 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -128,7 +128,13 @@ static void pick_geometry(BlockBackend *blk, int
> *nb_heads,
> /* Pick a default drive type if there's no media inserted AND we have
> * not yet announced our drive type to the CMOS. */
> if (!blk_is_inserted(blk) && drive_in == FDRIVE_DRV_NONE) {
> - parse = &fd_formats[0];
> + for (i = 0; ; i++) {
> + parse = &fd_formats[i];
> + if ((parse->drive == FDRIVE_DRV_NONE) ||
> + (parse->drive == *drive)) {
> + break;
> + }
> + }
> goto out;
> }
>
Before the patch: if we have no medium, and drv->drive (a.k.a. drive_in)
is still FDRIVE_DRV_NONE, pick format #0 (standard 3.5" 1.44MiB).
Afterwards: pick first one matching the value of
get_default_drive_type(), i.e. the value of the new property.
So the property is really a default type, which applies only when we
start without a medium in the drive.
Is that what we want?
When I specifically ask for a 5.25" 1.2MiB drive, I'd be rather
surprised when it silently morphs into a 3.5" 2.88MiB drive just because
I've forced a funny medium in before startup.
The obvious way to do drive types is selecting one with a property,
defaulting to the most common type, i.e. standard 3.5" 1.44Mib.
To preserve backward compatibility, we need a way to say "pick one for
the medium, else pick standard, and we need to make it the default. At
least for old machine types.
Opinions?
> @@ -295,11 +301,13 @@ static void fd_recalibrate(FDrive *drv)
> fd_seek(drv, 0, 0, 1, 1);
> }
>
> +static FDriveType get_default_drive_type(FDrive *drv);
> +
> /* Revalidate a disk drive after a disk change */
> static void fd_revalidate(FDrive *drv)
> {
> int nb_heads, max_track, last_sect, ro;
> - FDriveType drive;
> + FDriveType drive = get_default_drive_type(drv);
> FDriveRate rate;
>
> FLOPPY_DPRINTF("revalidate\n");
> @@ -609,6 +617,21 @@ typedef struct FDCtrlISABus {
> int32_t bootindexB;
> } FDCtrlISABus;
>
> +static FDriveType get_default_drive_type(FDrive *drv)
> +{
> + FDCtrl *fdctrl = drv->fdctrl;
> +
> + if (0 < MAX_FD && (&fdctrl->drives[0] == drv)) {
> + return fdctrl->defaultA;
> + }
> +
> + if (1 < MAX_FD && (&fdctrl->drives[1] == drv)) {
> + return fdctrl->defaultB;
> + }
> +
> + return FDRIVE_DEFAULT;
> +}
> +
> static uint32_t fdctrl_read (void *opaque, uint32_t reg)
> {
> FDCtrl *fdctrl = opaque;
Why do you need to guard with MAX_FD? If MAX_FD < 2, surely the
properties don't exist, and fdctrl->drives[i] still has its initial
value FDRIVE_DEFAULT, doesn't it?
- Re: [Qemu-devel] [RFC 03/10] fdc: respect default drive type,
Markus Armbruster <=