Hello,
Reading fill_fdpt, I see that when nlc == npc && nlh == nph && nlspt == npspt, SET_IVT(0x41,etc.) is not done. Shouldn't it be anyway?
Samuel
On Mon, Jan 04, 2010 at 12:58:22AM +0100, Samuel Thibault wrote:
Hello,
Reading fill_fdpt, I see that when nlc == npc && nlh == nph && nlspt == npspt, SET_IVT(0x41,etc.) is not done. Shouldn't it be anyway?
Looks like a bug.
Thanks. -Kevin
diff --git a/src/block.c b/src/block.c index c6787e2..01aa84a 100644 --- a/src/block.c +++ b/src/block.c @@ -180,20 +180,19 @@ fill_fdpt(struct drive_s *drive_g, int hdid) fdpt->heads = nlh; fdpt->sectors = nlspt;
- if (nlc == npc && nlh == nph && nlspt == npspt) - // no logical CHS mapping used, just physical CHS - // use Standard Fixed Disk Parameter Table (FDPT) - return; - - // complies with Phoenix style Translated Fixed Disk Parameter - // Table (FDPT) - fdpt->phys_cylinders = npc; - fdpt->phys_heads = nph; - fdpt->phys_sectors = npspt; - fdpt->a0h_signature = 0xa0; - - // Checksum structure. - fdpt->checksum -= checksum(fdpt, sizeof(*fdpt)); + if (nlc != npc || nlh != nph || nlspt != npspt) { + // Logical mapping present - use extended structure. + + // complies with Phoenix style Translated Fixed Disk Parameter + // Table (FDPT) + fdpt->phys_cylinders = npc; + fdpt->phys_heads = nph; + fdpt->phys_sectors = npspt; + fdpt->a0h_signature = 0xa0; + + // Checksum structure. + fdpt->checksum -= checksum(fdpt, sizeof(*fdpt)); + }
if (hdid == 0) SET_IVT(0x41, SEGOFF(get_ebda_seg(), offsetof(