diff --git a/loader/i386/pc/chainloader.c b/loader/i386/pc/chainloader.c index 825dbb3..ab3b203 100644 --- a/loader/i386/pc/chainloader.c +++ b/loader/i386/pc/chainloader.c @@ -101,12 +101,24 @@ grub_chainloader_cmd (const char *filename, grub_chainloader_flags_t flags) /* In i386-pc, the id is equal to the BIOS drive number. */ drive = (int) disk->id; - if (p) + if ((p) && (p->index < 4)) { - grub_disk_read (disk, p->offset, 446, 64, - (char *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); + int i; + + disk->dev->read (disk, 0, 1, + (char *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR); + + grub_memcpy ((char *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR, + (char *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR + 0x1be, + 64); + part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR + (p->index << 4)); + + for (i = 0; i < 4; i++) + *((char *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR + i * 16) = 0; + + *((char *) part_addr) = 0x80; } }