diff --git a/loader/i386/pc/chainloader.c b/loader/i386/pc/chainloader.c index 825dbb3..5dcc08a 100644 --- a/loader/i386/pc/chainloader.c +++ b/loader/i386/pc/chainloader.c @@ -101,12 +101,25 @@ 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; + + *((unsigned char *) part_addr) = 0x80; + drive |= (p->index << 8); } } @@ -119,6 +132,8 @@ grub_chainloader_cmd (const char *filename, grub_chainloader_flags_t flags) boot_drive = drive; boot_part_addr = part_addr; + grub_printf ("edx = %x, %esi = %p\n", drive, part_addr); + grub_loader_set (grub_chainloader_boot, grub_chainloader_unload, 1); return;