]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/boot/edd.c
Merge branch 'next'
[linux-2.6-omap-h63xx.git] / arch / x86 / boot / edd.c
index bf4ae6ff518e0bafecb2bba1b715cb9c9ace3020..1aae8f3e5ca1912b6eb60ad75e3c120af1110bed 100644 (file)
@@ -32,9 +32,7 @@ static int read_mbr(u8 devno, void *buf)
                     : "+a" (ax), "+c" (cx), "+d" (dx), "+b" (bx)
                     : : "esi", "edi", "memory");
 
-       /* Some BIOSes do not set carry flag on error but still return
-        * error in AH. The condition below is expected to catch both */
-       return -!!ax;           /* 0 or -1 */
+       return -(u8)ax;         /* 0 or -1 */
 }
 
 static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
@@ -43,6 +41,7 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
        char *mbrbuf_ptr, *mbrbuf_end;
        u32 buf_base, mbr_base;
        extern char _end[];
+       u16 mbr_magic;
 
        sector_size = ei->params.bytes_per_sector;
        if (!sector_size)
@@ -60,11 +59,15 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
        if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
                return -1;
 
+       memset(mbrbuf_ptr, 0, sector_size);
        if (read_mbr(devno, mbrbuf_ptr))
                return -1;
 
        *mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET];
-       return 0;
+       mbr_magic = *(u16 *)&mbrbuf_ptr[510];
+
+       /* check for valid MBR magic */
+       return mbr_magic == 0xAA55 ? 0 : -1;
 }
 
 static int get_edd_info(u8 devno, struct edd_info *ei)