x86 setup: fix ghost entries under /sys/firmware/edd take 3

Some BIOSes do not indicate error when trying to read from non-
existing device. Zero buffer before reading and check that we
possibly have valid MBR by looking for MBR magic.

This was fixed in different way for edd.S in
http://marc.info/?l=linux-kernel&m=114087765422490&w=2, but lost
again when edd.S was rewritten in C.

Signed-off-by: Andrey Borzenkov < arvidjaar@mail.ru>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
Andrey Borzenkov 2008-10-03 21:08:49 +04:00 committed by H. Peter Anvin
parent 464f04c9e9
commit 6cdcdb99cf
1 changed files with 6 additions and 1 deletions

View File

@ -43,6 +43,7 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
char *mbrbuf_ptr, *mbrbuf_end; char *mbrbuf_ptr, *mbrbuf_end;
u32 buf_base, mbr_base; u32 buf_base, mbr_base;
extern char _end[]; extern char _end[];
u16 mbr_magic;
sector_size = ei->params.bytes_per_sector; sector_size = ei->params.bytes_per_sector;
if (!sector_size) if (!sector_size)
@ -60,11 +61,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) if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
return -1; return -1;
memset(mbrbuf_ptr, 0, sector_size);
if (read_mbr(devno, mbrbuf_ptr)) if (read_mbr(devno, mbrbuf_ptr))
return -1; return -1;
*mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET]; *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) static int get_edd_info(u8 devno, struct edd_info *ei)