summaryrefslogtreecommitdiffstats
path: root/arch/i386/boot/edd.c
diff options
context:
space:
mode:
authorH. Peter Anvin2007-07-31 22:17:13 +0200
committerH. Peter Anvin2007-07-31 22:18:05 +0200
commitff659d13ed91dd0b237064aba91a5259f827aeb3 (patch)
tree43f73d3d59ece433b3b463ec2c7d36d6a6d85fec /arch/i386/boot/edd.c
parent[x86 setup] Newline after setup signature failure message (diff)
downloadkernel-qcow2-linux-ff659d13ed91dd0b237064aba91a5259f827aeb3.tar.gz
kernel-qcow2-linux-ff659d13ed91dd0b237064aba91a5259f827aeb3.tar.xz
kernel-qcow2-linux-ff659d13ed91dd0b237064aba91a5259f827aeb3.zip
[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>
Diffstat (limited to 'arch/i386/boot/edd.c')
-rw-r--r--arch/i386/boot/edd.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/i386/boot/edd.c b/arch/i386/boot/edd.c
index 25a282494f4c..77d92daf7923 100644
--- a/arch/i386/boot/edd.c
+++ b/arch/i386/boot/edd.c
@@ -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)