[syslinux:firmware] chain: Fix chainloading on 6.02

syslinux-bot for Raphael S. Carvalho raphael.scarv at gmail.com
Thu Oct 17 16:12:10 PDT 2013


Commit-ID:  4ac63b5ac412d54462e292daf65a309775bc0448
Gitweb:     http://www.syslinux.org/commit/4ac63b5ac412d54462e292daf65a309775bc0448
Author:     Raphael S. Carvalho <raphael.scarv at gmail.com>
AuthorDate: Thu, 17 Oct 2013 19:05:32 -0300
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Thu, 17 Oct 2013 15:57:04 -0700

chain: Fix chainloading on 6.02

My commit 09f4ac33 broke 'com32/lib/syslinux/disk.c'

__lowmem doesn't work for declarations outside the core.
Using __lowmem outside the core wouldn't have the desired effect, then lmalloc
must be used instead to store dapa into the correct section (".lowmem").

Reported-by: Dark Raven <drdarkraven at gmail.com>
Signed-off-by: Raphael S. Carvalho <raphael.scarv at gmail.com>
Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>

---
 com32/lib/syslinux/disk.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c
index 0b0c737..a824acc 100644
--- a/com32/lib/syslinux/disk.c
+++ b/com32/lib/syslinux/disk.c
@@ -171,22 +171,28 @@ out:
 static void *ebios_setup(const struct disk_info *const diskinfo, com32sys_t *inreg,
 			 uint64_t lba, uint8_t count, uint8_t op_code)
 {
-    static __lowmem struct disk_ebios_dapa dapa;
+    static struct disk_ebios_dapa *dapa = NULL;
     void *buf;
 
+    if (!dapa) {
+	dapa = lmalloc(sizeof *dapa);
+	if (!dapa)
+	    return NULL;
+    }
+
     buf = lmalloc(count * diskinfo->bps);
     if (!buf)
 	return NULL;
 
-    dapa.len = sizeof(dapa);
-    dapa.count = count;
-    dapa.off = OFFS(buf);
-    dapa.seg = SEG(buf);
-    dapa.lba = lba;
+    dapa->len = sizeof(*dapa);
+    dapa->count = count;
+    dapa->off = OFFS(buf);
+    dapa->seg = SEG(buf);
+    dapa->lba = lba;
 
     inreg->eax.b[1] = op_code;
-    inreg->esi.w[0] = OFFS(&dapa);
-    inreg->ds = SEG(&dapa);
+    inreg->esi.w[0] = OFFS(dapa);
+    inreg->ds = SEG(dapa);
     inreg->edx.b[0] = diskinfo->disk;
 
     return buf;


More information about the Syslinux-commits mailing list