[syslinux] [PATCH 07/12] com32: remove disklib from com32

Andre Ericson de.ericson at gmail.com
Mon Aug 20 01:16:49 PDT 2012


Since disklib was moved to core on previous commit it can be removed from
com32.

Signed-off-by: Andre Ericson <de.ericson at gmail.com>
---
 com32/chain/chain.c           |   2 +-
 com32/chain/partiter.c        |   2 +-
 com32/chain/partiter.h        |   2 +-
 com32/chain/utility.c         |   2 +-
 com32/chain/utility.h         |   2 +-
 com32/include/syslinux/disk.h | 180 -------------
 com32/lib/Makefile            |   1 -
 com32/lib/syslinux/disk.c     | 569 ------------------------------------------
 core/disk.c                   |  90 +++----
 core/include/disk.h           |  40 ++-
 10 files changed, 86 insertions(+), 804 deletions(-)
 delete mode 100644 com32/include/syslinux/disk.h
 delete mode 100644 com32/lib/syslinux/disk.c

diff --git a/com32/chain/chain.c b/com32/chain/chain.c
index 30153c4..2945c51 100644
--- a/com32/chain/chain.c
+++ b/com32/chain/chain.c
@@ -32,7 +32,7 @@
 #include <syslinux/loadfile.h>
 #include <syslinux/bootrm.h>
 #include <syslinux/config.h>
-#include <syslinux/disk.h>
+#include <disk.h>
 #include <syslinux/video.h>
 #include "common.h"
 #include "chain.h"
diff --git a/com32/chain/partiter.c b/com32/chain/partiter.c
index 1acd195..5728198 100644
--- a/com32/chain/partiter.c
+++ b/com32/chain/partiter.c
@@ -38,7 +38,7 @@
 #include <string.h>
 #include <stdarg.h>
 #include <zlib.h>
-#include <syslinux/disk.h>
+#include <disk.h>
 #include "common.h"
 #include "partiter.h"
 #include "utility.h"
diff --git a/com32/chain/partiter.h b/com32/chain/partiter.h
index 7deeb53..4c52357 100644
--- a/com32/chain/partiter.h
+++ b/com32/chain/partiter.h
@@ -37,7 +37,7 @@
 #define _COM32_CHAIN_PARTITER_H
 
 #include <stdint.h>
-#include <syslinux/disk.h>
+#include <disk.h>
 
 #define PI_ERRLOAD 3
 #define PI_INSANE 2
diff --git a/com32/chain/utility.c b/com32/chain/utility.c
index cb88272..57bf23b 100644
--- a/com32/chain/utility.c
+++ b/com32/chain/utility.c
@@ -5,7 +5,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <fs.h>
-#include <syslinux/disk.h>
+#include <disk.h>
 #include <syslinux/pmapi.h>
 #include "utility.h"
 
diff --git a/com32/chain/utility.h b/com32/chain/utility.h
index 8a08be7..b7892d2 100644
--- a/com32/chain/utility.h
+++ b/com32/chain/utility.h
@@ -2,7 +2,7 @@
 #define _COM32_CHAIN_UTILITY_H
 
 #include <stdint.h>
-#include <syslinux/disk.h>
+#include <disk.h>
 
 #define bpbUNK	0
 #define bpbV20	1
diff --git a/com32/include/syslinux/disk.h b/com32/include/syslinux/disk.h
deleted file mode 100644
index f96ca68..0000000
--- a/com32/include/syslinux/disk.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
- *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
- *   Copyright (C) 2010 Shao Miller
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/**
- * @file syslinux/disk.h
- *
- * Deal with disks and partitions
- */
-
-#ifndef _SYSLINUX_DISK_H
-#define _SYSLINUX_DISK_H
-
-#include <com32.h>
-#include <stdint.h>
-
-#define SECTOR 512u		/* bytes/sector */
-
-struct disk_info {
-    int disk;
-    int ebios;			/* EBIOS supported on this disk */
-    int cbios;			/* CHS geometry is valid */
-    uint32_t bps;		/* bytes per sector */
-    uint64_t lbacnt;		/* total amount of sectors */
-    uint32_t cyl;
-    uint32_t head;
-    uint32_t spt;
-};
-
-struct disk_ebios_dapa {
-    uint16_t len;
-    uint16_t count;
-    uint16_t off;
-    uint16_t seg;
-    uint64_t lba;
-} __attribute__ ((packed));
-
-struct disk_ebios_eparam {
-    uint16_t len;
-    uint16_t info;
-    uint32_t cyl;
-    uint32_t head;
-    uint32_t spt;
-    uint64_t lbacnt;
-    uint16_t bps;	/* bytes per sector */
-    uint32_t edd;
-    uint16_t dpi_sig;
-    uint8_t  dpi_len;
-    char     reserved1[3];
-    char     hostbus[4];
-    char     if_type[8];
-    char     if_path[8];
-    char     dev_path[8];
-    char     reserved2;
-    uint8_t  checksum;
-} __attribute__ ((packed));
-
-/**
- * CHS (cylinder, head, sector) value extraction macros.
- * Taken from WinVBlock.  None expand to an lvalue.
-*/
-#define     chs_head(chs) chs[0]
-#define   chs_sector(chs) (chs[1] & 0x3F)
-#define chs_cyl_high(chs) (((uint16_t)(chs[1] & 0xC0)) << 2)
-#define  chs_cyl_low(chs) ((uint16_t)chs[2])
-#define chs_cylinder(chs) (chs_cyl_high(chs) | chs_cyl_low(chs))
-typedef uint8_t disk_chs[3];
-
-/* A DOS partition table entry */
-struct disk_dos_part_entry {
-    uint8_t active_flag;	/* 0x80 if "active" */
-    disk_chs start;
-    uint8_t ostype;
-    disk_chs end;
-    uint32_t start_lba;
-    uint32_t length;
-} __attribute__ ((packed));
-
-/* A DOS MBR */
-struct disk_dos_mbr {
-    char code[440];
-    uint32_t disk_sig;
-    char pad[2];
-    struct disk_dos_part_entry table[4];
-    uint16_t sig;
-} __attribute__ ((packed));
-#define disk_mbr_sig_magic 0xAA55
-
-/**
- * A GPT disk/partition GUID
- *
- * Be careful with endianness, you must adjust it yourself
- * iff you are directly using the fourth data chunk.
- * There might be a better header for this...
- */
-struct guid {
-    uint32_t data1;
-    uint16_t data2;
-    uint16_t data3;
-    uint64_t data4;
-} __attribute__ ((packed));
-
-/* A GPT partition */
-struct disk_gpt_part_entry {
-    struct guid type;
-    struct guid uid;
-    uint64_t lba_first;
-    uint64_t lba_last;
-    uint64_t attribs;
-    char name[72];
-} __attribute__ ((packed));
-
-/* A GPT header */
-struct disk_gpt_header {
-    char sig[8];
-    union {
-	struct {
-	    uint16_t minor;
-	    uint16_t major;
-	} fields __attribute__ ((packed));
-	uint32_t uint32;
-	char raw[4];
-    } rev __attribute__ ((packed));
-    uint32_t hdr_size;
-    uint32_t chksum;
-    char reserved1[4];
-    uint64_t lba_cur;
-    uint64_t lba_alt;
-    uint64_t lba_first_usable;
-    uint64_t lba_last_usable;
-    struct guid disk_guid;
-    uint64_t lba_table;
-    uint32_t part_count;
-    uint32_t part_size;
-    uint32_t table_chksum;
-    char reserved2[1];
-} __attribute__ ((packed));
-static const char disk_gpt_sig_magic[] = "EFI PART";
-
-extern int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg);
-extern int disk_get_params(int disk, struct disk_info *const diskinfo);
-extern void *disk_read_sectors(const struct disk_info *const diskinfo,
-			       uint64_t lba, uint8_t count);
-extern int disk_write_sectors(const struct disk_info *const diskinfo,
-			      uint64_t lba, const void *data, uint8_t count);
-extern int disk_write_verify_sectors(const struct disk_info *const diskinfo,
-				     uint64_t lba, const void *buf, uint8_t count);
-extern void disk_dos_part_dump(const struct disk_dos_part_entry *const part);
-extern void guid_to_str(char *buf, const struct guid *const id);
-extern int str_to_guid(const char *buf, struct guid *const id);
-extern void disk_gpt_part_dump(const struct disk_gpt_part_entry *const
-			       gpt_part);
-extern void disk_gpt_header_dump(const struct disk_gpt_header *const gpt);
-
-#endif /* _SYSLINUX_DISK_H */
diff --git a/com32/lib/Makefile b/com32/lib/Makefile
index 5d270a4..8857808 100644
--- a/com32/lib/Makefile
+++ b/com32/lib/Makefile
@@ -159,7 +159,6 @@ LIBOTHER_OBJS = \
 	pci/writeb.o pci/writew.o pci/writel.o	\
 	\
 	sys/x86_init_fpu.o math/pow.o math/strtod.o			\
-	syslinux/disk.o							\
 	\
 	syslinux/setup_data.o
 
diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c
deleted file mode 100644
index 093751a..0000000
--- a/com32/lib/syslinux/disk.c
+++ /dev/null
@@ -1,569 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
- *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
- *   Copyright (C) 2010 Shao Miller
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/**
- * @file disk.c
- *
- * Deal with disks and partitions
- */
-
-#include <dprintf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslinux/disk.h>
-
-/**
- * Call int 13h, but with retry on failure.  Especially floppies need this.
- *
- * @v inreg			CPU register settings upon INT call
- * @v outreg			CPU register settings returned by INT call
- * @ret (int)			0 upon success, -1 upon failure
- */
-int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg)
-{
-    int retry = 6;		/* Number of retries */
-    com32sys_t tmpregs;
-
-    if (!outreg)
-	outreg = &tmpregs;
-
-    while (retry--) {
-	__intcall(0x13, inreg, outreg);
-	if (!(outreg->eflags.l & EFLAGS_CF))
-	    return 0;		/* CF=0, OK */
-    }
-
-    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
- * @ret (int)			0 upon success, -1 upon failure
- */
-int disk_get_params(int disk, struct disk_info *const diskinfo)
-{
-    static com32sys_t inreg, outreg;
-    struct disk_ebios_eparam *eparam;
-    int rv = 0;
-
-    memset(diskinfo, 0, sizeof *diskinfo);
-    diskinfo->disk = disk;
-    diskinfo->bps = SECTOR;
-
-    /* Get EBIOS support */
-    memset(&inreg, 0, sizeof inreg);
-    inreg.eax.b[1] = 0x41;
-    inreg.ebx.w[0] = 0x55aa;
-    inreg.edx.b[0] = disk;
-    inreg.eflags.b[0] = 0x3;	/* CF set */
-
-    __intcall(0x13, &inreg, &outreg);
-
-    if (!(outreg.eflags.l & EFLAGS_CF) &&
-	outreg.ebx.w[0] == 0xaa55 && (outreg.ecx.b[0] & 1)) {
-	diskinfo->ebios = 1;
-    }
-
-    eparam = lmalloc(sizeof *eparam);
-    if (!eparam)
-	return -1;
-
-    /* Get extended disk parameters if ebios == 1 */
-    if (diskinfo->ebios) {
-	memset(&inreg, 0, sizeof inreg);
-	inreg.eax.b[1] = 0x48;
-	inreg.edx.b[0] = disk;
-	inreg.esi.w[0] = OFFS(eparam);
-	inreg.ds = SEG(eparam);
-
-	memset(eparam, 0, sizeof *eparam);
-	eparam->len = sizeof *eparam;
-
-	__intcall(0x13, &inreg, &outreg);
-
-	if (!(outreg.eflags.l & EFLAGS_CF)) {
-	    diskinfo->lbacnt = eparam->lbacnt;
-	    if (eparam->bps)
-		diskinfo->bps = eparam->bps;
-	    /*
-	     * don't think about using geometry data returned by
-	     * 48h, as it can differ from 08h a lot ...
-	     */
-	}
-    }
-    /*
-     * Get disk parameters the old way - really only useful for hard
-     * disks, but if we have a partitioned floppy it's actually our best
-     * chance...
-     */
-    memset(&inreg, 0, sizeof inreg);
-    inreg.eax.b[1] = 0x08;
-    inreg.edx.b[0] = disk;
-
-    __intcall(0x13, &inreg, &outreg);
-
-    if (outreg.eflags.l & EFLAGS_CF) {
-	rv = diskinfo->ebios ? 0 : -1;
-	goto out;
-    }
-
-    diskinfo->spt = 0x3f & outreg.ecx.b[0];
-    diskinfo->head = 1 + outreg.edx.b[1];
-    diskinfo->cyl = 1 + (outreg.ecx.b[1] | ((outreg.ecx.b[0] & 0xc0u) << 2));
-
-    if (diskinfo->spt)
-	diskinfo->cbios = 1;	/* Valid geometry */
-    else {
-	diskinfo->head = 1;
-	diskinfo->spt = 1;
-	diskinfo->cyl = 1;
-    }
-
-    if (!diskinfo->lbacnt)
-	diskinfo->lbacnt = diskinfo->cyl * diskinfo->head * diskinfo->spt;
-
-out:
-    lfree(eparam);
-    return rv;
-}
-
-/**
- * Get disk block(s) and return a malloc'd buffer.
- *
- * @v diskinfo			The disk drive to read from
- * @v lba			The logical block address to begin reading at
- * @v count			The number of sectors to read
- * @ret data			An allocated buffer with the read data
- *
- * Uses the disk number and information from diskinfo.  Read count sectors
- * from drive, starting at lba.  Return a new buffer, or NULL upon failure.
- */
-void *disk_read_sectors(const struct disk_info *const diskinfo, uint64_t lba,
-			uint8_t count)
-{
-    com32sys_t inreg;
-    struct disk_ebios_dapa *dapa;
-    void *buf;
-    void *data = NULL;
-    uint32_t maxcnt;
-    uint32_t size = 65536;
-
-    maxcnt = (size - diskinfo->bps) / diskinfo->bps;
-    if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
-	return NULL;
-
-    memset(&inreg, 0, sizeof inreg);
-
-    buf = lmalloc(count * diskinfo->bps);
-    if (!buf)
-	return NULL;
-
-    dapa = lmalloc(sizeof(*dapa));
-    if (!dapa)
-	goto out;
-
-    if (diskinfo->ebios) {
-	dapa->len = sizeof(*dapa);
-	dapa->count = count;
-	dapa->off = OFFS(buf);
-	dapa->seg = SEG(buf);
-	dapa->lba = lba;
-
-	inreg.esi.w[0] = OFFS(dapa);
-	inreg.ds = SEG(dapa);
-	inreg.edx.b[0] = diskinfo->disk;
-	inreg.eax.b[1] = 0x42;	/* Extended read */
-    } else {
-	unsigned int c, h, s, t;
-	/*
-	 * if we passed lba + count check and we get here, that means that
-	 * lbacnt was calculated from chs geometry (or faked from 1/1/1), thus
-	 * 32bits are perfectly enough and lbacnt corresponds to cylinder
-	 * boundary
-	 */
-	s = lba % diskinfo->spt;
-	t = lba / diskinfo->spt;
-	h = t % diskinfo->head;
-	c = t / diskinfo->head;
-
-	inreg.eax.b[0] = count;
-	inreg.eax.b[1] = 0x02;	/* Read */
-	inreg.ecx.b[1] = c;
-	inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s+1);
-	inreg.edx.b[1] = h;
-	inreg.edx.b[0] = diskinfo->disk;
-	inreg.ebx.w[0] = OFFS(buf);
-	inreg.es = SEG(buf);
-    }
-
-    if (disk_int13_retry(&inreg, NULL))
-	goto out;
-
-    data = malloc(count * diskinfo->bps);
-    if (data)
-	memcpy(data, buf, count * diskinfo->bps);
-out:
-    lfree(dapa);
-    lfree(buf);
-    return data;
-}
-
-/**
- * Write disk block(s).
- *
- * @v diskinfo			The disk drive to write to
- * @v lba			The logical block address to begin writing at
- * @v data			The data to write
- * @v count			The number of sectors to write
- * @ret (int)			0 upon success, -1 upon failure
- *
- * Uses the disk number and information from diskinfo.
- * Write sector(s) to a disk drive, starting at lba.
- */
-int disk_write_sectors(const struct disk_info *const diskinfo, uint64_t lba,
-		       const void *data, uint8_t count)
-{
-    com32sys_t inreg;
-    struct disk_ebios_dapa *dapa;
-    void *buf;
-    uint32_t maxcnt;
-    uint32_t size = 65536;
-    int rv = -1;
-
-    maxcnt = (size - diskinfo->bps) / diskinfo->bps;
-    if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
-	return -1;
-
-    buf = lmalloc(count * diskinfo->bps);
-    if (!buf)
-	return -1;
-
-    memcpy(buf, data, count * diskinfo->bps);
-    memset(&inreg, 0, sizeof inreg);
-
-    dapa = lmalloc(sizeof(*dapa));
-    if (!dapa)
-	goto out;
-
-    if (diskinfo->ebios) {
-	dapa->len = sizeof(*dapa);
-	dapa->count = count;
-	dapa->off = OFFS(buf);
-	dapa->seg = SEG(buf);
-	dapa->lba = lba;
-
-	inreg.esi.w[0] = OFFS(dapa);
-	inreg.ds = SEG(dapa);
-	inreg.edx.b[0] = diskinfo->disk;
-	inreg.eax.b[1] = 0x43;	/* Extended write */
-    } else {
-	unsigned int c, h, s, t;
-	/*
-	 * if we passed lba + count check and we get here, that means that
-	 * lbacnt was calculated from chs geometry (or faked from 1/1/1), thus
-	 * 32bits are perfectly enough and lbacnt corresponds to cylinder
-	 * boundary
-	 */
-	s = lba % diskinfo->spt;
-	t = lba / diskinfo->spt;
-	h = t % diskinfo->head;
-	c = t / diskinfo->head;
-
-	inreg.eax.b[0] = count;
-	inreg.eax.b[1] = 0x03;	/* Write */
-	inreg.ecx.b[1] = c;
-	inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s+1);
-	inreg.edx.b[1] = h;
-	inreg.edx.b[0] = diskinfo->disk;
-	inreg.ebx.w[0] = OFFS(buf);
-	inreg.es = SEG(buf);
-    }
-
-    if (disk_int13_retry(&inreg, NULL))
-	goto out;
-
-    rv = 0;			/* ok */
-out:
-    lfree(dapa);
-    lfree(buf);
-    return rv;
-}
-
-/**
- * Write disk blocks and verify they were written.
- *
- * @v diskinfo			The disk drive to write to
- * @v lba			The logical block address to begin writing at
- * @v buf			The data to write
- * @v count			The number of sectors to write
- * @ret rv			0 upon success, -1 upon failure
- *
- * Uses the disk number and information from diskinfo.
- * Writes sectors to a disk drive starting at lba, then reads them back
- * to verify they were written correctly.
- */
-int disk_write_verify_sectors(const struct disk_info *const diskinfo,
-			      uint64_t lba, const void *buf, uint8_t count)
-{
-    char *rb;
-    int rv;
-
-    rv = disk_write_sectors(diskinfo, lba, buf, count);
-    if (rv)
-	return rv;		/* Write failure */
-    rb = disk_read_sectors(diskinfo, lba, count);
-    if (!rb)
-	return -1;		/* Readback failure */
-    rv = memcmp(buf, rb, count * diskinfo->bps);
-    free(rb);
-    return rv ? -1 : 0;
-}
-
-/**
- * Dump info about a DOS partition entry
- *
- * @v part			The 16-byte partition entry to examine
- */
-void disk_dos_part_dump(const struct disk_dos_part_entry *const part)
-{
-    (void)part;
-    dprintf("Partition status _____ : 0x%.2x\n"
-	    "Partition CHS start\n"
-	    "  Cylinder ___________ : 0x%.4x (%u)\n"
-	    "  Head _______________ : 0x%.2x (%u)\n"
-	    "  Sector _____________ : 0x%.2x (%u)\n"
-	    "Partition type _______ : 0x%.2x\n"
-	    "Partition CHS end\n"
-	    "  Cylinder ___________ : 0x%.4x (%u)\n"
-	    "  Head _______________ : 0x%.2x (%u)\n"
-	    "  Sector _____________ : 0x%.2x (%u)\n"
-	    "Partition LBA start __ : 0x%.8x (%u)\n"
-	    "Partition LBA count __ : 0x%.8x (%u)\n"
-	    "-------------------------------\n",
-	    part->active_flag,
-	    chs_cylinder(part->start),
-	    chs_cylinder(part->start),
-	    chs_head(part->start),
-	    chs_head(part->start),
-	    chs_sector(part->start),
-	    chs_sector(part->start),
-	    part->ostype,
-	    chs_cylinder(part->end),
-	    chs_cylinder(part->end),
-	    chs_head(part->end),
-	    chs_head(part->end),
-	    chs_sector(part->end),
-	    chs_sector(part->end),
-	    part->start_lba, part->start_lba, part->length, part->length);
-}
-
-/* Trivial error message output */
-static inline void error(const char *msg)
-{
-    fputs(msg, stderr);
-}
-
-/**
- * This walk-map effectively reverses the little-endian
- * portions of a GPT disk/partition GUID for a string representation.
- * There might be a better header for this...
- */
-static const char guid_le_walk_map[] = {
-    3, -1, -1, -1, 0,
-    5, -1, 0,
-    3, -1, 0,
-    2, 1, 0,
-    1, 1, 1, 1, 1, 1
-};
-
-/**
- * Fill a buffer with a textual GUID representation.
- *
- * @v buf			Points to a minimum array of 37 chars
- * @v id			The GUID to represent as text
- *
- * The buffer must be >= char[37] and will be populated
- * with an ASCII NUL C string terminator.
- * Example: 11111111-2222-3333-4444-444444444444
- * Endian:  LLLLLLLL-LLLL-LLLL-BBBB-BBBBBBBBBBBB
- */
-void guid_to_str(char *buf, const struct guid *const id)
-{
-    unsigned int i = 0;
-    const char *walker = (const char *)id;
-
-    while (i < sizeof(guid_le_walk_map)) {
-	walker += guid_le_walk_map[i];
-	if (!guid_le_walk_map[i])
-	    *buf = '-';
-	else {
-	    *buf = ((*walker & 0xF0) >> 4) + '0';
-	    if (*buf > '9')
-		*buf += 'A' - '9' - 1;
-	    buf++;
-	    *buf = (*walker & 0x0F) + '0';
-	    if (*buf > '9')
-		*buf += 'A' - '9' - 1;
-	}
-	buf++;
-	i++;
-    }
-    *buf = 0;
-}
-
-/**
- * Create a GUID structure from a textual GUID representation.
- *
- * @v buf			Points to a GUID string to parse
- * @v id			Points to a GUID to be populated
- * @ret (int)			Returns 0 upon success, -1 upon failure
- *
- * The input buffer must be >= 32 hexadecimal chars and be
- * terminated with an ASCII NUL.  Returns non-zero on failure.
- * Example: 11111111-2222-3333-4444-444444444444
- * Endian:  LLLLLLLL-LLLL-LLLL-BBBB-BBBBBBBBBBBB
- */
-int str_to_guid(const char *buf, struct guid *const id)
-{
-    char guid_seq[sizeof(struct guid) * 2];
-    unsigned int i = 0;
-    char *walker = (char *)id;
-
-    while (*buf && i < sizeof(guid_seq)) {
-	switch (*buf) {
-	    /* Skip these three characters */
-	case '{':
-	case '}':
-	case '-':
-	    break;
-	default:
-	    /* Copy something useful to the temp. sequence */
-	    if ((*buf >= '0') && (*buf <= '9'))
-		guid_seq[i] = *buf - '0';
-	    else if ((*buf >= 'A') && (*buf <= 'F'))
-		guid_seq[i] = *buf - 'A' + 10;
-	    else if ((*buf >= 'a') && (*buf <= 'f'))
-		guid_seq[i] = *buf - 'a' + 10;
-	    else {
-		/* Or not */
-		error("Illegal character in GUID!\n");
-		return -1;
-	    }
-	    i++;
-	}
-	buf++;
-    }
-    /* Check for insufficient valid characters */
-    if (i < sizeof(guid_seq)) {
-	error("Too few GUID characters!\n");
-	return -1;
-    }
-    buf = guid_seq;
-    i = 0;
-    while (i < sizeof(guid_le_walk_map)) {
-	if (!guid_le_walk_map[i])
-	    i++;
-	walker += guid_le_walk_map[i];
-	*walker = *buf << 4;
-	buf++;
-	*walker |= *buf;
-	buf++;
-	i++;
-    }
-    return 0;
-}
-
-/**
- * Display GPT partition details.
- *
- * @v gpt_part			The GPT partition entry to display
- */
-void disk_gpt_part_dump(const struct disk_gpt_part_entry *const gpt_part)
-{
-    unsigned int i;
-    char guid_text[37];
-
-    dprintf("----------------------------------\n"
-	    "GPT part. LBA first __ : 0x%.16llx\n"
-	    "GPT part. LBA last ___ : 0x%.16llx\n"
-	    "GPT part. attribs ____ : 0x%.16llx\n"
-	    "GPT part. name _______ : '",
-	    gpt_part->lba_first, gpt_part->lba_last, gpt_part->attribs);
-    for (i = 0; i < sizeof(gpt_part->name); i++) {
-	if (gpt_part->name[i])
-	    dprintf("%c", gpt_part->name[i]);
-    }
-    dprintf("'");
-    guid_to_str(guid_text, &gpt_part->type);
-    dprintf("GPT part. type GUID __ : {%s}\n", guid_text);
-    guid_to_str(guid_text, &gpt_part->uid);
-    dprintf("GPT part. unique ID __ : {%s}\n", guid_text);
-}
-
-/**
- * Display GPT header details.
- *
- * @v gpt			The GPT header to display
- */
-void disk_gpt_header_dump(const struct disk_gpt_header *const gpt)
-{
-    char guid_text[37];
-
-    printf("GPT sig ______________ : '%8.8s'\n"
-	   "GPT major revision ___ : 0x%.4x\n"
-	   "GPT minor revision ___ : 0x%.4x\n"
-	   "GPT header size ______ : 0x%.8x\n"
-	   "GPT header checksum __ : 0x%.8x\n"
-	   "GPT reserved _________ : '%4.4s'\n"
-	   "GPT LBA current ______ : 0x%.16llx\n"
-	   "GPT LBA alternative __ : 0x%.16llx\n"
-	   "GPT LBA first usable _ : 0x%.16llx\n"
-	   "GPT LBA last usable __ : 0x%.16llx\n"
-	   "GPT LBA part. table __ : 0x%.16llx\n"
-	   "GPT partition count __ : 0x%.8x\n"
-	   "GPT partition size ___ : 0x%.8x\n"
-	   "GPT part. table chksum : 0x%.8x\n",
-	   gpt->sig,
-	   gpt->rev.fields.major,
-	   gpt->rev.fields.minor,
-	   gpt->hdr_size,
-	   gpt->chksum,
-	   gpt->reserved1,
-	   gpt->lba_cur,
-	   gpt->lba_alt,
-	   gpt->lba_first_usable,
-	   gpt->lba_last_usable,
-	   gpt->lba_table, gpt->part_count, gpt->part_size, gpt->table_chksum);
-    guid_to_str(guid_text, &gpt->disk_guid);
-    printf("GPT disk GUID ________ : {%s}\n", guid_text);
-}
diff --git a/core/disk.c b/core/disk.c
index 9280c83..8d49c43 100644
--- a/core/disk.c
+++ b/core/disk.c
@@ -3,7 +3,6 @@
  *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
  *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
  *   Copyright (C) 2010 Shao Miller
- *   Copyright 2012 Andre Ericson
  *
  *   Permission is hereby granted, free of charge, to any person
  *   obtaining a copy of this software and associated documentation
@@ -56,7 +55,6 @@ int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg)
         outreg = &tmpregs;
 
     while (retry--) {
-
         __intcall(0x13, inreg, outreg);
         if (!(outreg->eflags.l & EFLAGS_CF))
             return 0;		/* CF=0, OK */
@@ -74,8 +72,9 @@ int disk_int13_retry(const com32sys_t * inreg, com32sys_t * outreg)
  */
 int disk_get_params(int disk, struct disk_info *const diskinfo)
 {
-    com32sys_t inreg, outreg;
-    struct disk_ebios_eparam *eparam = NULL;
+    static com32sys_t inreg, outreg;
+    struct disk_ebios_eparam *eparam;
+    int rv = 0;
 
     memset(diskinfo, 0, sizeof *diskinfo);
     diskinfo->disk = disk;
@@ -95,11 +94,12 @@ int disk_get_params(int disk, struct disk_info *const diskinfo)
         diskinfo->ebios = 1;
     }
 
+    eparam = lmalloc(sizeof *eparam);
+    if (!eparam)
+        return -1;
+
     /* Get extended disk parameters if ebios == 1 */
     if (diskinfo->ebios) {
-        eparam = lmalloc(sizeof *eparam);
-        if (!eparam)
-            return -1;
         memset(&inreg, 0, sizeof inreg);
         inreg.eax.b[1] = 0x48;
         inreg.edx.b[0] = disk;
@@ -133,8 +133,8 @@ int disk_get_params(int disk, struct disk_info *const diskinfo)
     __intcall(0x13, &inreg, &outreg);
 
     if (outreg.eflags.l & EFLAGS_CF) {
-        lfree(eparam);
-        return diskinfo->ebios ? 0 : -1;
+        rv = diskinfo->ebios ? 0 : -1;
+        goto out;
     }
 
     diskinfo->spt = 0x3f & outreg.ecx.b[0];
@@ -152,8 +152,9 @@ int disk_get_params(int disk, struct disk_info *const diskinfo)
     if (!diskinfo->lbacnt)
         diskinfo->lbacnt = diskinfo->cyl * diskinfo->head * diskinfo->spt;
 
+out:
     lfree(eparam);
-    return 0;
+    return rv;
 }
 
 /**
@@ -171,24 +172,28 @@ void *disk_read_sectors(const struct disk_info *const diskinfo, uint64_t lba,
         uint8_t count)
 {
     com32sys_t inreg;
-    struct disk_ebios_dapa *dapa = NULL;
-    uint8_t *buf = NULL;
-    void *data;
-
-    if (!count || lba + count > diskinfo->lbacnt)
+    struct disk_ebios_dapa *dapa;
+    void *buf;
+    void *data = NULL;
+    uint32_t maxcnt;
+    uint32_t size = 65536;
+
+    maxcnt = (size - diskinfo->bps) / diskinfo->bps;
+    if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
         return NULL;
 
     memset(&inreg, 0, sizeof inreg);
 
-    buf = (uint8_t *)lmalloc(diskinfo->bps * count);
+    buf = lmalloc(count * diskinfo->bps);
     if (!buf)
         return NULL;
 
+    dapa = lmalloc(sizeof(*dapa));
+    if (!dapa)
+        goto out;
+
     if (diskinfo->ebios) {
-        dapa = lmalloc(sizeof *dapa);
-        if (!dapa)
-            goto fail;
-        dapa->len = sizeof(struct disk_ebios_dapa);
+        dapa->len = sizeof(*dapa);
         dapa->count = count;
         dapa->off = OFFS(buf);
         dapa->seg = SEG(buf);
@@ -222,19 +227,15 @@ void *disk_read_sectors(const struct disk_info *const diskinfo, uint64_t lba,
     }
 
     if (disk_int13_retry(&inreg, NULL))
-        goto fail;
+        goto out;
 
     data = malloc(count * diskinfo->bps);
     if (data)
         memcpy(data, buf, count * diskinfo->bps);
+out:
     lfree(dapa);
     lfree(buf);
     return data;
-
-fail:
-    lfree(buf);
-    lfree(dapa);
-    return NULL;
 }
 
 /**
@@ -253,24 +254,29 @@ int disk_write_sectors(const struct disk_info *const diskinfo, uint64_t lba,
         const void *data, uint8_t count)
 {
     com32sys_t inreg;
-    struct disk_ebios_dapa *dapa = NULL;
-    uint8_t *buf = NULL;
-
-    if (!count || lba + count > diskinfo->lbacnt)
+    struct disk_ebios_dapa *dapa;
+    void *buf;
+    uint32_t maxcnt;
+    uint32_t size = 65536;
+    int rv = -1;
+
+    maxcnt = (size - diskinfo->bps) / diskinfo->bps;
+    if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
         return -1;
 
-    buf = (uint8_t *)lmalloc(diskinfo->bps * count);
+    buf = lmalloc(count * diskinfo->bps);
     if (!buf)
         return -1;
 
     memcpy(buf, data, count * diskinfo->bps);
     memset(&inreg, 0, sizeof inreg);
 
+    dapa = lmalloc(sizeof(*dapa));
+    if (!dapa)
+        goto out;
+
     if (diskinfo->ebios) {
-        dapa = lmalloc(sizeof *dapa);
-        if (!dapa)
-            goto fail;
-        dapa->len = sizeof *dapa;
+        dapa->len = sizeof(*dapa);
         dapa->count = count;
         dapa->off = OFFS(buf);
         dapa->seg = SEG(buf);
@@ -304,17 +310,13 @@ int disk_write_sectors(const struct disk_info *const diskinfo, uint64_t lba,
     }
 
     if (disk_int13_retry(&inreg, NULL))
-        goto fail;
+        goto out;
 
+    rv = 0;			/* ok */
+out:
     lfree(dapa);
     lfree(buf);
-
-    return 0;			/* ok */
-
-fail:
-    lfree(buf);
-    lfree(dapa);
-    return -1;
+    return rv;
 }
 
 /**
@@ -355,7 +357,7 @@ int disk_write_verify_sectors(const struct disk_info *const diskinfo,
 void disk_dos_part_dump(const struct disk_dos_part_entry *const part)
 {
     (void)part;
-    printf("Partition status _____ : 0x%.2x\n"
+    dprintf("Partition status _____ : 0x%.2x\n"
             "Partition CHS start\n"
             "  Cylinder ___________ : 0x%.4x (%u)\n"
             "  Head _______________ : 0x%.2x (%u)\n"
diff --git a/core/include/disk.h b/core/include/disk.h
index 51358ea..547df5c 100644
--- a/core/include/disk.h
+++ b/core/include/disk.h
@@ -1,12 +1,42 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
+ *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
+ *   Copyright (C) 2010 Shao Miller
+ *
+ *   Permission is hereby granted, free of charge, to any person
+ *   obtaining a copy of this software and associated documentation
+ *   files (the "Software"), to deal in the Software without
+ *   restriction, including without limitation the rights to use,
+ *   copy, modify, merge, publish, distribute, sublicense, and/or
+ *   sell copies of the Software, and to permit persons to whom
+ *   the Software is furnished to do so, subject to the following
+ *   conditions:
+ *
+ *   The above copyright notice and this permission notice shall
+ *   be included in all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *   OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+
+/**
+ *
+ * Deal with disks and partitions
+ */
+
 #ifndef DISK_H
 #define DISK_H
 
-#include <stddef.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <stdint.h>
 #include <com32.h>
-#include "core.h"
+#include <stdint.h>
 
 #define SECTOR 512u     /* bytes/sector */
 
-- 
1.7.11.3




More information about the Syslinux mailing list