From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:59807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2lFD-0005gd-UO for qemu-devel@nongnu.org; Wed, 29 Feb 2012 10:15:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S2lEo-0003RD-Di for qemu-devel@nongnu.org; Wed, 29 Feb 2012 10:15:07 -0500 Received: from mx1.redhat.com ([209.132.183.28]:27614) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2lEo-0003Ql-5b for qemu-devel@nongnu.org; Wed, 29 Feb 2012 10:14:42 -0500 From: Kevin Wolf Date: Wed, 29 Feb 2012 16:17:42 +0100 Message-Id: <1330528688-21996-2-git-send-email-kwolf@redhat.com> In-Reply-To: <1330528688-21996-1-git-send-email-kwolf@redhat.com> References: <1330528688-21996-1-git-send-email-kwolf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 01/27] fdc: take side count into account List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Herv=C3=A9 Poussineau 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=C3=A9 Poussineau Signed-off-by: Kevin Wolf --- hw/fdc.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/hw/fdc.c b/hw/fdc.c index 38fad58..64e635a 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -95,16 +95,19 @@ static void fd_init(FDrive *drv) drv->max_track =3D 0; } =20 +#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; } =20 /* 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_se= ct); + return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_se= ct, + NUM_SIDES(drv)); } =20 /* 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 =3D fd_sector_calc(head, track, sect, drv->last_sect); + sector =3D fd_sector_calc(head, track, sect, drv->last_sect, NUM_SID= ES(drv)); ret =3D 0; if (sector !=3D fd_sector(drv)) { #if 0 @@ -1019,7 +1022,8 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, i= nt direction) ks =3D 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 =3D 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 */ --=20 1.7.6.5