[syslinux:disklib] chain.c32, libcom32: Move get_disk_params() as disk_get_params()

syslinux-bot for Shao Miller shao.miller at yrdsb.edu.on.ca
Sun Jul 25 17:33:08 PDT 2010


Commit-ID:  14e2dc6336a763930043baf654b3ff0f38f932fa
Gitweb:     http://syslinux.zytor.com/commit/14e2dc6336a763930043baf654b3ff0f38f932fa
Author:     Shao Miller <shao.miller at yrdsb.edu.on.ca>
AuthorDate: Mon, 28 Jun 2010 01:22:04 -0400
Committer:  Shao Miller <shao.miller at yrdsb.edu.on.ca>
CommitDate: Sat, 10 Jul 2010 01:03:04 -0400

chain.c32, libcom32: Move get_disk_params() as disk_get_params()

Also moved struct diskinfo as disk_info.
Moving portions of chain.c32 into libcom32.

Signed-off-by: Shao Miller <shao.miller at yrdsb.edu.on.ca>


---
 com32/include/syslinux/disk.h |    9 ++++
 com32/lib/syslinux/disk.c     |   48 +++++++++++++++++++++
 com32/modules/chain.c         |   95 +++++++++-------------------------------
 3 files changed, 79 insertions(+), 73 deletions(-)

diff --git a/com32/include/syslinux/disk.h b/com32/include/syslinux/disk.h
index 83db05c..f880a89 100644
--- a/com32/include/syslinux/disk.h
+++ b/com32/include/syslinux/disk.h
@@ -40,6 +40,15 @@
 
 #define SECTOR 512		/* bytes/sector */
 
+struct disk_info {
+    int disk;
+    int ebios;			/* EBIOS supported on this disk */
+    int cbios;			/* CHS geometry is valid */
+    int head;
+    int sect;
+};
+
 extern int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg);
+extern int disk_get_params(int disk, struct disk_info *diskinfo);
 
 #endif /* _SYSLINUX_DISK_H */
diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c
index 7be59f2..0fd3548 100644
--- a/com32/lib/syslinux/disk.c
+++ b/com32/lib/syslinux/disk.c
@@ -57,3 +57,51 @@ int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg)
 
     return -1;			/* Error */
 }
+
+/*
+ * Query disk parameters and EBIOS availability for a particular disk.
+ *
+ * @v disk			The INT 0x13 disk drive number to process
+ * @v diskinfo			The structure to save the queried params to
+ */
+int disk_get_params(int disk, struct disk_info *diskinfo)
+{
+    static com32sys_t getparm, parm, getebios, ebios;
+
+    diskinfo->disk = disk;
+    diskinfo->ebios = diskinfo->cbios = 0;
+
+    /* Get EBIOS support */
+    getebios.eax.w[0] = 0x4100;
+    getebios.ebx.w[0] = 0x55aa;
+    getebios.edx.b[0] = disk;
+    getebios.eflags.b[0] = 0x3;	/* CF set */
+
+    __intcall(0x13, &getebios, &ebios);
+
+    if (!(ebios.eflags.l & EFLAGS_CF) &&
+	ebios.ebx.w[0] == 0xaa55 && (ebios.ecx.b[0] & 1)) {
+	diskinfo->ebios = 1;
+    }
+
+    /* Get disk parameters -- really only useful for
+       hard disks, but if we have a partitioned floppy
+       it's actually our best chance... */
+    getparm.eax.b[1] = 0x08;
+    getparm.edx.b[0] = disk;
+
+    __intcall(0x13, &getparm, &parm);
+
+    if (parm.eflags.l & EFLAGS_CF)
+	return diskinfo->ebios ? 0 : -1;
+
+    diskinfo->head = parm.edx.b[1] + 1;
+    diskinfo->sect = parm.ecx.b[0] & 0x3f;
+    if (diskinfo->sect == 0) {
+	diskinfo->sect = 1;
+    } else {
+	diskinfo->cbios = 1;	/* Valid geometry */
+    }
+
+    return 0;
+}
diff --git a/com32/modules/chain.c b/com32/modules/chain.c
index ffcf8c2..738d8c7 100644
--- a/com32/modules/chain.c
+++ b/com32/modules/chain.c
@@ -145,62 +145,11 @@ static inline void error(const char *msg)
     fputs(msg, stderr);
 }
 
-/*
- * Query disk parameters and EBIOS availability for a particular disk.
- */
-struct diskinfo {
-    int disk;
-    int ebios;			/* EBIOS supported on this disk */
-    int cbios;			/* CHS geometry is valid */
-    int head;
-    int sect;
-} disk_info;
-
-static int get_disk_params(int disk)
-{
-    static com32sys_t getparm, parm, getebios, ebios;
-
-    disk_info.disk = disk;
-    disk_info.ebios = disk_info.cbios = 0;
-
-    /* Get EBIOS support */
-    getebios.eax.w[0] = 0x4100;
-    getebios.ebx.w[0] = 0x55aa;
-    getebios.edx.b[0] = disk;
-    getebios.eflags.b[0] = 0x3;	/* CF set */
-
-    __intcall(0x13, &getebios, &ebios);
-
-    if (!(ebios.eflags.l & EFLAGS_CF) &&
-	ebios.ebx.w[0] == 0xaa55 && (ebios.ecx.b[0] & 1)) {
-	disk_info.ebios = 1;
-    }
-
-    /* Get disk parameters -- really only useful for
-       hard disks, but if we have a partitioned floppy
-       it's actually our best chance... */
-    getparm.eax.b[1] = 0x08;
-    getparm.edx.b[0] = disk;
-
-    __intcall(0x13, &getparm, &parm);
-
-    if (parm.eflags.l & EFLAGS_CF)
-	return disk_info.ebios ? 0 : -1;
-
-    disk_info.head = parm.edx.b[1] + 1;
-    disk_info.sect = parm.ecx.b[0] & 0x3f;
-    if (disk_info.sect == 0) {
-	disk_info.sect = 1;
-    } else {
-	disk_info.cbios = 1;	/* Valid geometry */
-    }
-
-    return 0;
-}
+static struct disk_info diskinfo;
 
 /*
  * Get a disk block and return a malloc'd buffer.
- * Uses the disk number and information from disk_info.
+ * Uses the disk number and information from diskinfo.
  */
 struct ebios_dapa {
     uint16_t len;
@@ -224,7 +173,7 @@ static void *read_sectors(uint64_t lba, uint8_t count)
 
     memset(&inreg, 0, sizeof inreg);
 
-    if (disk_info.ebios) {
+    if (diskinfo.ebios) {
 	dapa->len = sizeof(*dapa);
 	dapa->count = count;
 	dapa->off = OFFS(buf);
@@ -233,12 +182,12 @@ static void *read_sectors(uint64_t lba, uint8_t count)
 
 	inreg.esi.w[0] = OFFS(dapa);
 	inreg.ds = SEG(dapa);
-	inreg.edx.b[0] = disk_info.disk;
+	inreg.edx.b[0] = diskinfo.disk;
 	inreg.eax.b[1] = 0x42;	/* Extended read */
     } else {
 	unsigned int c, h, s, t;
 
-	if (!disk_info.cbios) {
+	if (!diskinfo.cbios) {
 	    /* We failed to get the geometry */
 
 	    if (lba)
@@ -248,10 +197,10 @@ static void *read_sectors(uint64_t lba, uint8_t count)
 	    h = 0;
 	    c = 0;
 	} else {
-	    s = (lba % disk_info.sect) + 1;
-	    t = lba / disk_info.sect;	/* Track = head*cyl */
-	    h = t % disk_info.head;
-	    c = t / disk_info.head;
+	    s = (lba % diskinfo.sect) + 1;
+	    t = lba / diskinfo.sect;	/* Track = head*cyl */
+	    h = t % diskinfo.head;
+	    c = t / diskinfo.head;
 	}
 
 	if (s > 63 || h > 256 || c > 1023)
@@ -262,7 +211,7 @@ static void *read_sectors(uint64_t lba, uint8_t count)
 	inreg.ecx.b[1] = c & 0xff;
 	inreg.ecx.b[0] = s + (c >> 6);
 	inreg.edx.b[1] = h;
-	inreg.edx.b[0] = disk_info.disk;
+	inreg.edx.b[0] = diskinfo.disk;
 	inreg.ebx.w[0] = OFFS(buf);
 	inreg.es = SEG(buf);
     }
@@ -285,7 +234,7 @@ static int write_sector(unsigned int lba, const void *data)
     memcpy(buf, data, SECTOR);
     memset(&inreg, 0, sizeof inreg);
 
-    if (disk_info.ebios) {
+    if (diskinfo.ebios) {
 	dapa->len = sizeof(*dapa);
 	dapa->count = 1;	/* 1 sector */
 	dapa->off = OFFS(buf);
@@ -294,12 +243,12 @@ static int write_sector(unsigned int lba, const void *data)
 
 	inreg.esi.w[0] = OFFS(dapa);
 	inreg.ds = SEG(dapa);
-	inreg.edx.b[0] = disk_info.disk;
+	inreg.edx.b[0] = diskinfo.disk;
 	inreg.eax.w[0] = 0x4300;	/* Extended write */
     } else {
 	unsigned int c, h, s, t;
 
-	if (!disk_info.cbios) {
+	if (!diskinfo.cbios) {
 	    /* We failed to get the geometry */
 
 	    if (lba)
@@ -309,10 +258,10 @@ static int write_sector(unsigned int lba, const void *data)
 	    h = 0;
 	    c = 0;
 	} else {
-	    s = (lba % disk_info.sect) + 1;
-	    t = lba / disk_info.sect;	/* Track = head*cyl */
-	    h = t % disk_info.head;
-	    c = t / disk_info.head;
+	    s = (lba % diskinfo.sect) + 1;
+	    t = lba / diskinfo.sect;	/* Track = head*cyl */
+	    h = t % diskinfo.head;
+	    c = t / diskinfo.head;
 	}
 
 	if (s > 63 || h > 256 || c > 1023)
@@ -322,7 +271,7 @@ static int write_sector(unsigned int lba, const void *data)
 	inreg.ecx.b[1] = c & 0xff;
 	inreg.ecx.b[0] = s + (c >> 6);
 	inreg.edx.b[1] = h;
-	inreg.edx.b[0] = disk_info.disk;
+	inreg.edx.b[0] = diskinfo.disk;
 	inreg.ebx.w[0] = OFFS(buf);
 	inreg.es = SEG(buf);
     }
@@ -421,7 +370,7 @@ static int find_disk(uint32_t mbr_sig)
     struct mbr *mbr;
 
     for (drive = 0x80; drive <= 0xff; drive++) {
-	if (get_disk_params(drive))
+	if (disk_get_params(drive, &diskinfo))
 	    continue;		/* Drive doesn't exist */
 	if (!(mbr = read_sectors(0, 1)))
 	    continue;		/* Cannot read sector */
@@ -951,7 +900,7 @@ static int find_by_guid(const struct guid *gpt_guid,
     struct gpt *header;
 
     for (drive = 0x80; drive <= 0xff; drive++) {
-	if (get_disk_params(drive))
+	if (disk_get_params(drive, &diskinfo))
 	    continue;		/* Drive doesn't exist */
 	if (!(header = read_sectors(1, 1)))
 	    continue;		/* Cannot read sector */
@@ -997,7 +946,7 @@ static int find_by_label(const char *label, struct disk_part_iter **boot_part)
     bool is_me;
 
     for (drive = 0x80; drive <= 0xff; drive++) {
-	if (get_disk_params(drive))
+	if (disk_get_params(drive, &diskinfo))
 	    continue;		/* Drive doesn't exist */
 	/* Check for a GPT disk */
 	boot_part[0] = get_first_partition(NULL);
@@ -1440,7 +1389,7 @@ int main(int argc, char *argv[])
     regs.ebx.b[0] = regs.edx.b[0] = drive;
 
     /* Get the disk geometry and disk access setup */
-    if (get_disk_params(drive)) {
+    if (disk_get_params(drive, &diskinfo)) {
 	error("Cannot get disk parameters\n");
 	goto bail;
     }



More information about the Syslinux-commits mailing list