|
From: | Pavel Hrdina |
Subject: | Re: [Qemu-devel] [PATCH] Fix IDE FDC emulation for no media |
Date: | Tue, 24 Apr 2012 11:57:29 +0200 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1 |
On 04/24/2012 09:48 AM, Andreas Färber wrote:
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
Thanks for correction, I'll send v2 patch with right commit message. Pavel
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);
[Prev in Thread] | Current Thread | [Next in Thread] |