Commit ff659d13 authored by H. Peter Anvin's avatar H. Peter Anvin

[x86 setup] EDD: Fix the computation of the MBR sector buffer

Some BIOSes require that sector buffers not cross 64K
boundaries.  As a result, we compute a dynamic address on the
setup heap.  Unfortunately, this address computation was just
totally wrong.
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 8b608d2f
...@@ -72,17 +72,18 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei) ...@@ -72,17 +72,18 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei)
u32 mbrsig; u32 mbrsig;
u32 buf_base, mbr_base; u32 buf_base, mbr_base;
extern char _end[]; extern char _end[];
static char mbr_buf[1024];
sector_size = ei->params.bytes_per_sector; sector_size = ei->params.bytes_per_sector;
if (!sector_size) if (!sector_size)
sector_size = 512; /* Best available guess */ sector_size = 512; /* Best available guess */
/* Produce a naturally aligned buffer on the heap */
buf_base = (ds() << 4) + (u32)&_end; buf_base = (ds() << 4) + (u32)&_end;
mbr_base = (buf_base+sector_size-1) & ~(sector_size-1); mbr_base = (buf_base+sector_size-1) & ~(sector_size-1);
mbrbuf_ptr = mbr_buf + (mbr_base-buf_base); mbrbuf_ptr = _end + (mbr_base-buf_base);
mbrbuf_end = mbrbuf_ptr + sector_size; mbrbuf_end = mbrbuf_ptr + sector_size;
/* Make sure we actually have space on the heap... */
if (!(boot_params.hdr.loadflags & CAN_USE_HEAP)) if (!(boot_params.hdr.loadflags & CAN_USE_HEAP))
return 0; return 0;
if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr) if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment