[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: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
8b608d2f5a
commit
ff659d13ed
1 changed files with 3 additions and 2 deletions
|
@ -72,17 +72,18 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei)
|
|||
u32 mbrsig;
|
||||
u32 buf_base, mbr_base;
|
||||
extern char _end[];
|
||||
static char mbr_buf[1024];
|
||||
|
||||
sector_size = ei->params.bytes_per_sector;
|
||||
if (!sector_size)
|
||||
sector_size = 512; /* Best available guess */
|
||||
|
||||
/* Produce a naturally aligned buffer on the heap */
|
||||
buf_base = (ds() << 4) + (u32)&_end;
|
||||
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;
|
||||
|
||||
/* Make sure we actually have space on the heap... */
|
||||
if (!(boot_params.hdr.loadflags & CAN_USE_HEAP))
|
||||
return 0;
|
||||
if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
|
||||
|
|
Loading…
Reference in a new issue