From: "Hervé Poussineau" <hpoussin@reactos.org>
To: qemu-devel@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>,
"Hervé Poussineau" <hpoussin@reactos.org>
Subject: [Qemu-devel] [PATCH v4 01/11] fdc: take side count into account
Date: Mon, 6 Feb 2012 22:29:02 +0100 [thread overview]
Message-ID: <1328563752-3976-2-git-send-email-hpoussin@reactos.org> (raw)
In-Reply-To: <1328563752-3976-1-git-send-email-hpoussin@reactos.org>
Floppies can be simple or double-sided. However, current code
was only taking the common case into account (ie 2 sides).
This repairs single-sided floppies, which where totally broken
before this patch : for track > 0, wrong sector number was
calculated, and data was read/written at wrong place on
underlying device.
Fortunately, only some 360 kB floppies are single-sided, so
this bug was probably not seen much.
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/fdc.c | 17 +++++++++++------
1 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/hw/fdc.c b/hw/fdc.c
index f575a2c..cd479f0 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -95,16 +95,19 @@ static void fd_init(FDrive *drv)
drv->max_track = 0;
}
+#define NUM_SIDES(drv) ((drv)->flags & FDISK_DBL_SIDES ? 2 : 1)
+
static int fd_sector_calc(uint8_t head, uint8_t track, uint8_t sect,
- uint8_t last_sect)
+ uint8_t last_sect, uint8_t num_sides)
{
- return (((track * 2) + head) * last_sect) + sect - 1;
+ return (((track * num_sides) + head) * last_sect) + sect - 1;
}
/* Returns current position, in sectors, for given drive */
static int fd_sector(FDrive *drv)
{
- return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect);
+ return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect,
+ NUM_SIDES(drv));
}
/* Seek to a new position:
@@ -135,7 +138,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
drv->max_track, drv->last_sect);
return 3;
}
- sector = fd_sector_calc(head, track, sect, drv->last_sect);
+ sector = fd_sector_calc(head, track, sect, drv->last_sect, NUM_SIDES(drv));
ret = 0;
if (sector != fd_sector(drv)) {
#if 0
@@ -1019,7 +1022,8 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, int direction)
ks = fdctrl->fifo[4];
FLOPPY_DPRINTF("Start transfer at %d %d %02x %02x (%d)\n",
GET_CUR_DRV(fdctrl), kh, kt, ks,
- fd_sector_calc(kh, kt, ks, cur_drv->last_sect));
+ fd_sector_calc(kh, kt, ks, cur_drv->last_sect,
+ NUM_SIDES(cur_drv)));
switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
case 2:
/* sect too big */
@@ -1289,7 +1293,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
ks = fdctrl->fifo[8];
FLOPPY_DPRINTF("format sector at %d %d %02x %02x (%d)\n",
GET_CUR_DRV(fdctrl), kh, kt, ks,
- fd_sector_calc(kh, kt, ks, cur_drv->last_sect));
+ fd_sector_calc(kh, kt, ks, cur_drv->last_sect,
+ NUM_SIDES(cur_drv)));
switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
case 2:
/* sect too big */
--
1.7.8.3
next prev parent reply other threads:[~2012-02-06 21:29 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-06 21:29 [Qemu-devel] [PATCH v4 00/11] Misc fixes for floppy emulation Hervé Poussineau
2012-02-06 21:29 ` Hervé Poussineau [this message]
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 02/11] fdc: set busy bit when starting a command Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 03/11] fdc: most control commands do not generate interrupts Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 04/11] fdc: handle read-only floppies (abort early on write commands) Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 05/11] fdc: add CCR (Configuration Control Register) write register Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 06/11] block: add a transfer rate for floppy types Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 07/11] pc: add 1.1 machine type Hervé Poussineau
2012-02-14 15:11 ` Kevin Wolf
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 08/11] fdc: add a 'check media rate' property. Not used yet Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 09/11] fdc: check if media rate is correct before doing any transfer Hervé Poussineau
2012-02-14 15:16 ` Kevin Wolf
2012-02-14 15:28 ` Paolo Bonzini
2012-02-14 15:34 ` Kevin Wolf
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 10/11] fdc: fix seek command, which shouldn't check tracks Hervé Poussineau
2012-02-06 21:29 ` [Qemu-devel] [PATCH v4 11/11] fdc: DIR (Digital Input Register) should return status of current drive Hervé Poussineau
2012-02-14 12:31 ` [Qemu-devel] [PATCH v4 00/11] Misc fixes for floppy emulation Hervé Poussineau
2012-02-14 15:27 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1328563752-3976-2-git-send-email-hpoussin@reactos.org \
--to=hpoussin@reactos.org \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).