46 lines
1.2 KiB
Diff
46 lines
1.2 KiB
Diff
Reported-by: Dark Raven <drdarkraven at gmail.com>
|
|
Signed-off-by: Raphael S. Carvalho <raphael.scarv at gmail.com>
|
|
---
|
|
com32/lib/syslinux/disk.c | 22 ++++++++++++++--------
|
|
1 files changed, 14 insertions(+), 8 deletions(-)
|
|
|
|
--- com32/lib/syslinux/disk.c
|
|
+++ 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;
|