diff options
author | Matt Fleming <matt.fleming@intel.com> | 2012-06-08 14:07:37 +0100 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2012-06-08 14:07:37 +0100 |
commit | b1b44de1264c40f806f672012bac590cf87eca92 (patch) | |
tree | 158a0f5b18260e65e6a68a24afc667786a0e37f8 /com32/gpllib | |
parent | e33c487c3930357a4f53455e019c72be0477ef98 (diff) | |
download | syslinux-b1b44de1264c40f806f672012bac590cf87eca92.tar.gz syslinux-b1b44de1264c40f806f672012bac590cf87eca92.tar.xz syslinux-b1b44de1264c40f806f672012bac590cf87eca92.zip |
Delete all references to __com32.cs_bounce
The COM32 cs_bounce buffer is not usable with ELF modules, as we're
trying to move to an environment where memory is dynamically
allocated. All users of __com32.cs_bounce have been converted to using
lmalloc() to allocate low memory.
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'com32/gpllib')
-rw-r--r-- | com32/gpllib/disk/geom.c | 11 | ||||
-rw-r--r-- | com32/gpllib/disk/read.c | 25 | ||||
-rw-r--r-- | com32/gpllib/disk/write.c | 26 | ||||
-rw-r--r-- | com32/gpllib/memory.c | 15 |
4 files changed, 58 insertions, 19 deletions
diff --git a/com32/gpllib/disk/geom.c b/com32/gpllib/disk/geom.c index 9e673ed4..e1095200 100644 --- a/com32/gpllib/disk/geom.c +++ b/com32/gpllib/disk/geom.c @@ -120,7 +120,7 @@ static int detect_extensions(struct driveinfo *drive_info) static int get_drive_parameters_with_extensions(struct driveinfo *drive_info) { com32sys_t inreg, outreg; - struct edd_device_parameters *dp = __com32.cs_bounce; + struct edd_device_parameters *dp; memset(&inreg, 0, sizeof inreg); @@ -134,6 +134,10 @@ static int get_drive_parameters_with_extensions(struct driveinfo *drive_info) * If the buffer length is less than 26 on entry an error shall be * returned. */ + dp = lmalloc(sizeof *dp); + if (!dp) + return -1; + dp->len = sizeof(struct edd_device_parameters); inreg.esi.w[0] = OFFS(dp); @@ -144,10 +148,13 @@ static int get_drive_parameters_with_extensions(struct driveinfo *drive_info) __intcall(0x13, &inreg, &outreg); /* CF set on error */ - if (outreg.eflags.l & EFLAGS_CF) + if (outreg.eflags.l & EFLAGS_CF) { + lfree(dp); return outreg.eax.b[1]; + } memcpy(&drive_info->edd_params, dp, sizeof drive_info->edd_params); + lfree(dp); return 0; } diff --git a/com32/gpllib/disk/read.c b/com32/gpllib/disk/read.c index 7a6cc430..541957f9 100644 --- a/com32/gpllib/disk/read.c +++ b/com32/gpllib/disk/read.c @@ -76,13 +76,22 @@ int read_sectors(struct driveinfo *drive_info, void *data, const unsigned int lba, const int sectors) { com32sys_t inreg, outreg; - struct ebios_dapa *dapa = __com32.cs_bounce; - void *buf = (char *)__com32.cs_bounce + sectors * SECTOR; + struct ebios_dapa *dapa; + void *buf; char *bufp = data; + int rv = -1; if (get_drive_parameters(drive_info) == -1) return -1; + buf = lmalloc(sectors * SECTOR); + if (!buf) + return -1; + + dapa = lmalloc(sizeof(*dapa)); + if (!dapa) + goto fail; + memset(&inreg, 0, sizeof inreg); if (drive_info->ebios) { @@ -102,7 +111,7 @@ int read_sectors(struct driveinfo *drive_info, void *data, if (!drive_info->cbios) { // XXX errno /* We failed to get the geometry */ if (lba) - return -1; /* Can only read MBR */ + goto fail; /* Can only read MBR */ s = 1; h = 0; @@ -112,7 +121,7 @@ int read_sectors(struct driveinfo *drive_info, void *data, // XXX errno if (s > 63 || h > 256 || c > 1023) - return -1; + goto fail; inreg.eax.w[0] = 0x0201; /* Read one sector */ inreg.ecx.b[1] = c & 0xff; @@ -126,10 +135,14 @@ int read_sectors(struct driveinfo *drive_info, void *data, /* Perform the read */ if (int13_retry(&inreg, &outreg)) { errno_disk = outreg.eax.b[1]; - return -1; /* Give up */ + goto fail; /* Give up */ } memcpy(bufp, buf, sectors * SECTOR); + rv = sectors; - return sectors; +fail: + lfree(dapa); + lfree(buf); + return rv; } diff --git a/com32/gpllib/disk/write.c b/com32/gpllib/disk/write.c index 89e530d9..d183adef 100644 --- a/com32/gpllib/disk/write.c +++ b/com32/gpllib/disk/write.c @@ -36,8 +36,17 @@ int write_sectors(const struct driveinfo *drive_info, const unsigned int lba, const void *data, const int size) { com32sys_t inreg, outreg; - struct ebios_dapa *dapa = __com32.cs_bounce; - void *buf = (char *)__com32.cs_bounce + size; + struct ebios_dapa *dapa; + void *buf; + int rv = -1; + + buf = lmalloc(size); + if (!buf) + return -1; + + dapa = lmalloc(sizeof(*dapa)); + if (!dapa) + goto out; memcpy(buf, data, size); memset(&inreg, 0, sizeof inreg); @@ -59,7 +68,7 @@ int write_sectors(const struct driveinfo *drive_info, const unsigned int lba, if (!drive_info->cbios) { // XXX errno /* We failed to get the geometry */ if (lba) - return -1; /* Can only write MBR */ + goto out; /* Can only write MBR */ s = 1; h = 0; @@ -69,7 +78,7 @@ int write_sectors(const struct driveinfo *drive_info, const unsigned int lba, // XXX errno if (s > 63 || h > 256 || c > 1023) - return -1; + goto out; inreg.eax.w[0] = 0x0301; /* Write one sector */ inreg.ecx.b[1] = c & 0xff; @@ -82,10 +91,13 @@ int write_sectors(const struct driveinfo *drive_info, const unsigned int lba, /* Perform the write */ if (int13_retry(&inreg, &outreg)) { - errno_disk = outreg.eax.b[1]; - return -1; /* Give up */ + errno_disk = outreg.eax.b[1]; /* Give up */ } else - return size; + rv = size; +out: + lfree(dapa); + lfree(buf); + return rv; } /** diff --git a/com32/gpllib/memory.c b/com32/gpllib/memory.c index 28a95ff4..06c746da 100644 --- a/com32/gpllib/memory.c +++ b/com32/gpllib/memory.c @@ -87,15 +87,20 @@ void detect_memory_e820(struct e820entry *desc, int size_map, int *size_found) { int count = 0; static struct e820_ext_entry buf; /* static so it is zeroed */ + void *bounce; com32sys_t ireg, oreg; memset(&ireg, 0, sizeof ireg); + bounce = lmalloc(sizeof buf); + if (!bounce) + goto out; + ireg.eax.w[0] = 0xe820; ireg.edx.l = SMAP; ireg.ecx.l = sizeof(struct e820_ext_entry); - ireg.edi.w[0] = OFFS(__com32.cs_bounce); - ireg.es = SEG(__com32.cs_bounce); + ireg.edi.w[0] = OFFS(bounce); + ireg.es = SEG(bounce); /* * Set this here so that if the BIOS doesn't change this field @@ -105,7 +110,7 @@ void detect_memory_e820(struct e820entry *desc, int size_map, int *size_found) buf.ext_flags = 1; do { - memcpy(__com32.cs_bounce, &buf, sizeof buf); + memcpy(bounce, &buf, sizeof buf); /* Important: %edx and %esi are clobbered by some BIOSes, so they must be either used for the error output @@ -126,7 +131,7 @@ void detect_memory_e820(struct e820entry *desc, int size_map, int *size_found) if (oreg.eflags.l & EFLAGS_CF || oreg.ecx.l < 20) break; - memcpy(&buf, __com32.cs_bounce, sizeof buf); + memcpy(&buf, bounce, sizeof buf); /* * ACPI 3.0 added the extended flags support. If bit 0 @@ -143,6 +148,8 @@ void detect_memory_e820(struct e820entry *desc, int size_map, int *size_found) ireg.ebx.l = oreg.ebx.l; } while (ireg.ebx.l && count < size_map); +out: + lfree(bounce); *size_found = count; } |