diff -ru grub2.org/include/grub/pc_partition.h grub2/include/grub/pc_partition.h --- grub2.org/include/grub/pc_partition.h 2007-07-21 20:32:22.000000000 -0300 +++ grub2/include/grub/pc_partition.h 2008-06-29 22:13:38.000000000 -0300 @@ -182,6 +182,9 @@ /* The offset of the extended partition. */ unsigned long ext_offset; + + /* Partition entry. */ + struct grub_pc_partition_entry e; }; static inline int diff -ru grub2.org/loader/i386/pc/chainloader.c grub2/loader/i386/pc/chainloader.c --- grub2.org/loader/i386/pc/chainloader.c 2007-09-03 17:10:19.000000000 -0300 +++ grub2/loader/i386/pc/chainloader.c 2008-06-29 22:50:50.000000000 -0300 @@ -31,6 +31,7 @@ #include #include #include +#include static grub_dl_t my_mod; static int boot_drive; @@ -103,10 +104,11 @@ if (p) { - grub_disk_read (disk, p->offset, 446, 64, - (char *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); - part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR - + (p->index << 4)); + struct grub_pc_partition *pcdata = p->data; + grub_memcpy((void *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR, + (void *) &pcdata->e, + sizeof(struct grub_pc_partition_entry)); + part_addr = (void *) (GRUB_MEMORY_MACHINE_PART_TABLE_ADDR); } } diff -ru grub2.org/partmap/pc.c grub2/partmap/pc.c --- grub2.org/partmap/pc.c 2007-07-21 20:32:30.000000000 -0300 +++ grub2/partmap/pc.c 2008-06-29 22:55:50.000000000 -0300 @@ -135,6 +135,8 @@ pcdata.bsd_part = -1; pcdata.dos_type = e->type; pcdata.bsd_type = -1; + grub_memcpy(&pcdata.e, e, sizeof(struct grub_pc_partition_entry)); + pcdata.e.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",