--- grub2.orig/include/grub/msdos_partition.h 2009-08-23 05:00:57.000000000 -0700 +++ grub2/include/grub/msdos_partition.h 2009-11-01 12:23:09.359537024 -0800 @@ -184,6 +184,9 @@ struct grub_msdos_partition /* The offset of the extended partition. */ unsigned long ext_offset; + + /* Partition entry. */ + struct grub_msdos_partition_entry msdos_part_entry; }; static inline int --- grub2.orig/loader/i386/pc/chainloader.c 2009-06-11 09:13:39.000000000 -0700 +++ grub2/loader/i386/pc/chainloader.c 2009-11-01 12:33:23.599518294 -0800 @@ -32,6 +32,7 @@ #include #include #include +#include static grub_dl_t my_mod; static int boot_drive; @@ -94,10 +95,11 @@ grub_chainloader_cmd (const char *filena dev = grub_device_open (0); if (dev && dev->disk && dev->disk->partition) { - grub_disk_read (dev->disk, dev->disk->partition->offset, 446, 64, - (void *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); - part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR - + (dev->disk->partition->index << 4)); + struct grub_msdos_partition *msdosdata = dev->disk->partition->data; + grub_memcpy((void *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR, + (void *) &msdosdata->msdos_part_entry, + sizeof(struct grub_msdos_partition_entry)); + part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); } if (dev) --- grub2.orig/partmap/msdos.c 2009-09-16 12:23:33.000000000 -0700 +++ grub2/partmap/msdos.c 2009-11-01 12:23:40.709544500 -0800 @@ -153,6 +153,8 @@ pc_partition_map_iterate (grub_disk_t di pcdata.bsd_part = -1; pcdata.dos_type = e->type; pcdata.bsd_type = -1; + grub_memcpy(&pcdata.msdos_part_entry, e, sizeof(struct grub_msdos_partition_entry)); + pcdata.msdos_part_entry.start = grub_cpu_to_le32(p.offset + grub_le_to_cpu32 (e->start)); grub_dprintf ("partition", "partition %d: flag 0x%x, type 0x%x, start 0x%llx, len 0x%llx\n",