diff -ru grub2-1.96+20090721/include/grub/pc_partition.h grub2+patch/include/grub/pc_partition.h --- grub2-1.96+20090721/include/grub/pc_partition.h 2009-05-09 13:04:08.000000000 +0200 +++ grub2+patch/include/grub/pc_partition.h 2009-07-22 10:49:34.557536456 +0200 @@ -184,6 +184,9 @@ /* The offset of the extended partition. */ unsigned long ext_offset; + + /* Partition entry. */ + struct grub_pc_partition_entry pc_part_entry; }; static inline int diff -ru grub2-1.96+20090721/loader/i386/pc/chainloader.c grub2+patch/loader/i386/pc/chainloader.c --- grub2-1.96+20090721/loader/i386/pc/chainloader.c 2009-06-11 18:13:39.000000000 +0200 +++ grub2+patch/loader/i386/pc/chainloader.c 2009-07-22 10:51:36.170516258 +0200 @@ -32,6 +32,7 @@ #include #include #include +#include static grub_dl_t my_mod; static int boot_drive; @@ -94,10 +95,11 @@ 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_pc_partition *pcdata = dev->disk->partition->data; + grub_memcpy((void *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR, + (void *) &pcdata->pc_part_entry, + sizeof(struct grub_pc_partition_entry)); + part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); } if (dev) diff -ru grub2-1.96+20090721/partmap/pc.c grub2+patch/partmap/pc.c --- grub2-1.96+20090721/partmap/pc.c 2009-06-10 23:04:23.000000000 +0200 +++ grub2+patch/partmap/pc.c 2009-07-22 10:53:34.679495828 +0200 @@ -131,6 +131,8 @@ pcdata.bsd_part = -1; pcdata.dos_type = e->type; pcdata.bsd_type = -1; + grub_memcpy(&pcdata.pc_part_entry, e, sizeof(struct grub_pc_partition_entry)); + pcdata.pc_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",