core/diskio: correct the EDD parameter query syslinux-4.00-pre10
authorH. Peter Anvin <hpa@zytor.com>
Fri, 22 Jan 2010 05:36:52 +0000 (21:36 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 22 Jan 2010 05:38:50 +0000 (21:38 -0800)
We need to tell the BIOS how big of a buffer we have for the EDD
parameter query.  This caused us to *never* use EDD, which meant that
large filesystems never worked.

Reported-by: Gert Hulselmans <kimmik999999@yahoo.co.uk>
Isolated-by: Alek Du <alek.du@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
core/diskio.c

index 911e4dd..eddcd8d 100644 (file)
@@ -254,14 +254,20 @@ struct disk *disk_init(uint8_t devno, bool cdrom, sector_t part_start,
 
     if (cdrom || (!(oreg.eflags.l & EFLAGS_CF) &&
                  oreg.ebx.w[0] == 0xaa55 && (oreg.ecx.b[0] & 1))) {
+       ebios = true;
+
        /* Query EBIOS parameters */
+       edd_params.len = sizeof edd_params;
+
        ireg.eax.b[1] = 0x48;
        ireg.ds = SEG(&edd_params);
        ireg.esi.w[0] = OFFS(&edd_params);
        __intcall(0x13, &ireg, &oreg);
 
        if (!(oreg.eflags.l & EFLAGS_CF) && oreg.eax.b[1] == 0) {
-           ebios = true;
+           if (edd_params.len < sizeof edd_params)
+               memset((char *)&edd_params + edd_params.len, 0,
+                      sizeof edd_params - edd_params.len);
            if (edd_params.sector_size >= 512 &&
                is_power_of_2(edd_params.sector_size))
                sector_size = edd_params.sector_size;