From fba50f1c195dae984bb8a180a3330594f1f95173 Mon Sep 17 00:00:00 2001 From: Kenneth J Davis Date: Sun, 9 Jan 2005 11:25:44 +0000 Subject: [PATCH] fix bug 1789 and add some extra debug prints git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/branches/UNSTABLE@1089 6ac86273-5f31-0410-b378-82cca8765d1b --- kernel/dsk.c | 13 +++++++++++-- kernel/initdisk.c | 10 +++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/kernel/dsk.c b/kernel/dsk.c index 2b65b24..e7e03be 100644 --- a/kernel/dsk.c +++ b/kernel/dsk.c @@ -673,6 +673,8 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) struct gblkio FAR *gblp = rp->r_io; bpb *pbpb; + DebugPrintf(("get params entry: spec=%X, type=%X, devattr=%X\n", gblp->gbio_spcfunbit,pddt->ddt_type,descflags)); + gblp->gbio_devtype = pddt->ddt_type; gblp->gbio_devattrib = descflags & 3; /* 360 kb disk in 1.2 MB drive */ @@ -680,18 +682,25 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) gblp->gbio_ncyl = pddt->ddt_ncyl; /* use default dpb or current bpb? */ pbpb = (gblp->gbio_spcfunbit & 1) ? &pddt->ddt_bpb : &pddt->ddt_defbpb; + /* Note: last 6 bytes of standard BPB may not be copied for + 0x60 when rp->r_cat==8 in some versions of DOS eg MSDOS5,see rbil */ #ifdef WITHFAT32 + if (rp->r_cat == 0x08) copy_size -= 6; fmemcpy(&gblp->gbio_bpb, pbpb, copy_size); #else - fmemcpy(&gblp->gbio_bpb, pbpb, sizeof(gblp->gbio_bpb)); + fmemcpy(&gblp->gbio_bpb, pbpb, sizeof(gblp->gbio_bpb)-6); #endif /*gblp->gbio_nsecs = pbpb->bpb_nsector;*/ + DebugPrintf(("get params dev spec=%X, type=%X, attrib=%X, media=%X, ncyl=%X\n", + gblp->gbio_spcfunbit, gblp->gbio_devtype, gblp->gbio_devattrib, gblp->gbio_media, gblp->gbio_ncyl)); break; } case 0x61: /* read track */ { struct gblkrw FAR *rw = rp->r_rw; - int ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl, + int ret; + DebugPrintf(("read track: head=%X, cyl=%X, sect=%X, nsecs=%X\n", rw->gbrw_head, rw->gbrw_cyl,rw->gbrw_sector, rw->gbrw_nsecs)); + /*int*/ ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl, rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer); if (ret) return ret; diff --git a/kernel/initdisk.c b/kernel/initdisk.c index a4430aa..9307ad4 100644 --- a/kernel/initdisk.c +++ b/kernel/initdisk.c @@ -306,6 +306,7 @@ COUNT init_getdriveparm(UBYTE drive, bpb * pbpbarray) return 5; regs.a.b.h = 0x08; regs.d.b.l = drive; + /* Note: RBIL suggests setting ES:DI to 0:0 to guard against BIOS bugs */ init_call_intr(0x13, ®s); type = regs.b.b.l - 1; if (regs.flags & FLG_CARRY) @@ -316,6 +317,8 @@ COUNT init_getdriveparm(UBYTE drive, bpb * pbpbarray) type = 4; /* 5 and 4 are both 2.88 MB */ memcpy(pbpbarray, &floppy_bpbs[type & 7], sizeof(floppy_bpb)); + ((bpb *)pbpbarray)->bpb_hidden = 0; /* very important to init to 0, see bug#1789 */ + ((bpb *)pbpbarray)->bpb_huge = 0; if (type == 3) return 7; /* 1.44 MB */ @@ -597,12 +600,17 @@ void DosDefinePartition(struct DriveParamS *driveParam, pddt->ddt_defbpb.bpb_mdesc = 0xf8; pddt->ddt_defbpb.bpb_nheads = driveParam->chs.Head; pddt->ddt_defbpb.bpb_nsecs = driveParam->chs.Sector; - pddt->ddt_defbpb.bpb_nsize = 0; pddt->ddt_defbpb.bpb_hidden = pEntry->RelSect; if (pEntry->NumSect > 0xffff) + { + pddt->ddt_defbpb.bpb_nsize = 0; pddt->ddt_defbpb.bpb_huge = pEntry->NumSect; + } else + { pddt->ddt_defbpb.bpb_nsize = (UWORD) (pEntry->NumSect); + pddt->ddt_defbpb.bpb_huge = 0; + } /* sectors per cluster, sectors per FAT etc. */ CalculateFATData(pddt, pEntry->NumSect, pEntry->FileSystem);