[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Fix IDE FDC emulation for no media
From: |
Andreas Färber |
Subject: |
Re: [Qemu-devel] [PATCH] Fix IDE FDC emulation for no media |
Date: |
Tue, 24 Apr 2012 09:48:38 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120328 Thunderbird/11.0.1 |
Am 23.04.2012 18:06, schrieb Pavel Hrdina:
> Hi,
> this is the patch to fix incorrect handling of IDE floppy drive controller
> emulation
> when no media is present. If the guest is booted without a media then the
> drive
> was not being emulated at all but this patch enables the emulation with no
> media present.
>
> There was a bug in FDC emulation without media. Driver was not able to
> recognize that
> there is no media in drive.
>
> This has been tested on both Fedora-16 x86_64 VM and Windows XP VM and the
> behaviour
> is as expected, i.e. as follows:
>
> Linux guest (Fedora 16 x86_64) tries "mount /dev/fd0" and exit with error
> "mount: /dev/fd0 is not a valid block device" which is the same behavior like
> bare metal with real floppy device (you have to load floppy driver at first
> using e.g. "modprobe floppy" command).
>
> For Windows XP guest the Windows floppy driver is trying to seek the virtual
> drive
> when you want to open it but driver successfully detect that there is no
> media in drive
> and then it's asking user to insert floppy media in the drive.
>
> I also tested behavior of this patch if you start guest with "-nodefaults"
> and both
> Windows and Linux guests detect only FDC but no drive.
>
> Pavel
>
> This patch has been written with help of specifications from:
> http://www.ousob.com/ng/hardware/ngd127.php
> http://www.isdaman.com/alsos/hardware/fdc/floppy.htm
> http://wiki.osdev.org/Floppy_Disk_Controller
>
> Signed-off-by: Pavel Hrdina <address@hidden>
> Signed-off-by: Michal Novotny <address@hidden>
> ---
Please see http://wiki.qemu.org/Contribute/SubmitAPatch for hints on
writing a commit message for a patch: Subject should have a prefix, such
as "fdc: Fix emulation for no media" and the body should not contain
personal letter-style contents such as "Hi, this is the patch". Any such
personal comments can go under the --- line where they are not committed
to git history.
Cc'ing floppy author and block maintainer.
Andreas
> hw/fdc.c | 14 ++++++++++----
> hw/pc.c | 3 ++-
> 2 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/hw/fdc.c b/hw/fdc.c
> index a0236b7..6791eff 100644
> --- a/hw/fdc.c
> +++ b/hw/fdc.c
> @@ -179,12 +179,14 @@ static void fd_revalidate(FDrive *drv)
> FDriveRate rate;
>
> FLOPPY_DPRINTF("revalidate\n");
> - if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {
> + if (drv->bs != NULL) {
> ro = bdrv_is_read_only(drv->bs);
> bdrv_get_floppy_geometry_hint(drv->bs, &nb_heads, &max_track,
> &last_sect, drv->drive, &drive, &rate);
> - if (nb_heads != 0 && max_track != 0 && last_sect != 0) {
> - FLOPPY_DPRINTF("User defined disk (%d %d %d)",
> + if (!bdrv_is_inserted(drv->bs)) {
> + FLOPPY_DPRINTF("No media in drive\n");
> + } else if (nb_heads != 0 && max_track != 0 && last_sect != 0) {
> + FLOPPY_DPRINTF("User defined disk (%d %d %d)\n",
> nb_heads - 1, max_track, last_sect);
> } else {
> FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", nb_heads,
> @@ -201,11 +203,12 @@ static void fd_revalidate(FDrive *drv)
> drv->drive = drive;
> drv->media_rate = rate;
> } else {
> - FLOPPY_DPRINTF("No disk in drive\n");
> + FLOPPY_DPRINTF("Drive disabled\n");
> drv->last_sect = 0;
> drv->max_track = 0;
> drv->flags &= ~FDISK_DBL_SIDES;
> }
> +
> }
>
> /********************************************************/
> @@ -937,6 +940,9 @@ static int fdctrl_media_changed(FDrive *drv)
>
> if (!drv->bs)
> return 0;
> + /* This is needed for driver to detect there is no media in drive */
> + if (!bdrv_is_inserted(drv->bs))
> + return 1;
> if (drv->media_changed) {
> drv->media_changed = 0;
> ret = 1;
> diff --git a/hw/pc.c b/hw/pc.c
> index 1f5aacb..29a604b 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -382,7 +382,8 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t
> above_4g_mem_size,
> if (floppy) {
> fdc_get_bs(fd, floppy);
> for (i = 0; i < 2; i++) {
> - if (fd[i] && bdrv_is_inserted(fd[i])) {
> + /* If there is no media in a drive, we still have the drive
> present */
> + if (fd[i]) {
> bdrv_get_floppy_geometry_hint(fd[i], &nb_heads, &max_track,
> &last_sect, FDRIVE_DRV_NONE,
> &fd_type[i], &rate);
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg