[syslinux:master] memdisk: add a sector_shift field to the MDI; fix memdiskfind
syslinux-bot for H. Peter Anvin
hpa at linux.intel.com
Tue Jun 22 10:57:10 PDT 2010
Commit-ID: d966918e7304ff405fae20916cf137d737c92dea
Gitweb: http://syslinux.zytor.com/commit/d966918e7304ff405fae20916cf137d737c92dea
Author: H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Tue, 22 Jun 2010 10:55:03 -0700
Committer: H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Tue, 22 Jun 2010 10:55:03 -0700
memdisk: add a sector_shift field to the MDI; fix memdiskfind
Add a sector_shift field to the MDI rather than assuming 512-byte
sectors. Fix memdiskfind to report size in bytes, not in sectors.
Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>
---
doc/memdisk.txt | 5 +++--
memdisk/mstructs.h | 2 +-
memdisk/setup.c | 21 +++++++++++----------
utils/memdiskfind.c | 8 +++++++-
4 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/doc/memdisk.txt b/doc/memdisk.txt
index c7244ab..b8ed9ae 100644
--- a/doc/memdisk.txt
+++ b/doc/memdisk.txt
@@ -190,13 +190,14 @@ The MEMDISK info structure currently contains:
[ES:DI+2] byte MEMDISK minor version
[ES:DI+3] byte MEMDISK major version
[ES:DI+4] dword Pointer to MEMDISK data in high memory
- [ES:DI+8] dword Size of MEMDISK data in 512-byte sectors
+ [ES:DI+8] dword Size of MEMDISK data in sectors
[ES:DI+12] 16:16 Far pointer to command line
[ES:DI+16] 16:16 Old INT 13h pointer
[ES:DI+20] 16:16 Old INT 15h pointer
[ES:DI+24] word Amount of DOS memory before MEMDISK loaded
[ES:DI+26] byte Boot loader ID
- [ES:DI+27] byte Currently unused
+ [ES:DI+27] byte Sector size as a power of 2
+ (If zero, assume 512-byte sectors)
[ES:DI+28] word If nonzero, offset (vs ES) to installed DPT
This pointer+16 contains the original INT 1Eh
diff --git a/memdisk/mstructs.h b/memdisk/mstructs.h
index c2e6352..fecbff4 100644
--- a/memdisk/mstructs.h
+++ b/memdisk/mstructs.h
@@ -93,7 +93,7 @@ struct mdi {
uint16_t olddosmem;
uint8_t bootloaderid;
- uint8_t _pad1;
+ uint8_t sector_shift;
uint16_t dpt_ptr;
} MEMDISK_PACKED_POSTFIX;
diff --git a/memdisk/setup.c b/memdisk/setup.c
index 20b48c4..3f69cd3 100644
--- a/memdisk/setup.c
+++ b/memdisk/setup.c
@@ -242,7 +242,7 @@ struct geometry {
uint32_t boot_lba; /* LBA of bootstrap code */
uint8_t type; /* Type byte for INT 13h AH=08h */
uint8_t driveno; /* Drive no */
- uint16_t sector_size; /* Sector size in bytes (512 vs. 2048) */
+ uint8_t sector_shift; /* Sector size as a power of 2 */
const char *hsrc, *ssrc; /* Origins of H and S geometries */
};
@@ -322,13 +322,13 @@ static const struct geometry *get_disk_image_geometry(uint32_t where,
printf("command line: %s\n", shdr->cmdline);
- hd_geometry.sector_size = 512; /* Assume floppy/HDD at first */
+ hd_geometry.sector_shift = 9; /* Assume floppy/HDD at first */
offset = 0;
if (CMD_HASDATA(p = getcmditem("offset")) && (v = atou(p)))
offset = v;
- sectors = xsectors = (size - offset) >> 9;
+ sectors = xsectors = (size - offset) >> hd_geometry.sector_shift;
hd_geometry.hsrc = "guess";
hd_geometry.ssrc = "guess";
@@ -372,8 +372,7 @@ static const struct geometry *get_disk_image_geometry(uint32_t where,
hd_geometry.h = 255;
hd_geometry.s = 15;
/* 2048-byte sectors, so adjust the size and count */
- hd_geometry.sector_size = 2048;
- sectors = (size - hd_geometry.offset) >> 11;
+ hd_geometry.sector_shift = 11;
break;
case 1: /* 1.2 MB floppy */
hd_geometry.s = 15;
@@ -393,9 +392,10 @@ static const struct geometry *get_disk_image_geometry(uint32_t where,
case 4:
hd_geometry.driveno = 0x80;
hd_geometry.type = 0;
- sectors = (size - hd_geometry.offset) >> 9;
break;
}
+ sectors = (size - hd_geometry.offset) >> hd_geometry.sector_shift;
+
/* For HDD emulation, we figure out the geometry later. Otherwise: */
if (hd_geometry.s) {
hd_geometry.hsrc = hd_geometry.ssrc = "El Torito";
@@ -413,7 +413,7 @@ static const struct geometry *get_disk_image_geometry(uint32_t where,
hd_geometry.h = dosemu.h;
hd_geometry.s = dosemu.s;
hd_geometry.offset += dosemu.offset;
- sectors = (size - hd_geometry.offset) >> 9;
+ sectors = (size - hd_geometry.offset) >> hd_geometry.sector_shift;
hd_geometry.hsrc = hd_geometry.ssrc = "DOSEMU";
}
@@ -466,7 +466,7 @@ static const struct geometry *get_disk_image_geometry(uint32_t where,
if (!(max_h | max_s)) {
/* No FAT filesystem found to steal geometry from... */
- if ((sectors < 4096 * 2) && (hd_geometry.sector_size == 512)) {
+ if ((sectors < 4096 * 2) && (hd_geometry.sector_shift == 9)) {
int ok = 0;
unsigned int xsectors = sectors;
@@ -778,7 +778,7 @@ void setup(const struct real_mode_args *rm_args_ptr)
/* Choose the appropriate installable memdisk hook */
if (do_eltorito) {
- if (geometry->sector_size == 2048) {
+ if (geometry->sector_shift == 11) {
bin_size = (int)&_binary_memdisk_iso_2048_bin_size;
memdisk_hook = (char *)&_binary_memdisk_iso_2048_bin_start;
} else {
@@ -817,6 +817,7 @@ void setup(const struct real_mode_args *rm_args_ptr)
pptr->sectors = geometry->s;
pptr->mdi.disksize = geometry->sectors;
pptr->mdi.diskbuf = ramdisk_image + geometry->offset;
+ pptr->mdi.sector_shift = geometry->sector_shift;
pptr->statusptr = (geometry->driveno & 0x80) ? 0x474 : 0x441;
pptr->mdi.bootloaderid = shdr->type_of_loader;
@@ -912,7 +913,7 @@ void setup(const struct real_mode_args *rm_args_ptr)
* for INT 0x13, AH=0x48 "EDD Get Disk Parameters" call on an
* El Torito ODD. Check for 2048-byte sector size
*/
- if (geometry->sector_size != 2048)
+ if (geometry->sector_shift != 11)
pptr->edd_dpt.flags |= 0x0002; /* Geometry valid */
}
if (!(geometry->driveno & 0x80)) {
diff --git a/utils/memdiskfind.c b/utils/memdiskfind.c
index 45d54bc..f2086b2 100644
--- a/utils/memdiskfind.c
+++ b/utils/memdiskfind.c
@@ -60,7 +60,13 @@ static bool valid_mbft(const struct mBFT *mbft, size_t space)
static void output_params(const struct mBFT *mbft)
{
- printf("%u,%u\n", mbft->mdi.diskbuf, mbft->mdi.disksize);
+ int sector_shift = mbft->mdi.sector_shift;
+
+ if (!sector_shift)
+ sector_shift = 9;
+
+ printf("%#x,%#x\n",
+ mbft->mdi.diskbuf, mbft->mdi.disksize << sector_shift);
}
int main(int argc, char *argv[])
More information about the Syslinux-commits
mailing list