Package: grub-pc
Version: 1.97~beta3-1
Tags: upstream,patch

Hello,

without this patch chainloading certain other loaders, esp.
syslinux, does not work.

This situation occurs with grub installed on the mbr and the
other loader as a partition boot loader.

A smiliar patch appeared on the grub-devel mailing list. This one
is adapted to the mentioned debian version of grub.

Please consider.

Bye,

Joerg


diff -ru grub2-1.96+20090721/include/grub/msdos_partition.h 
grub2+patch/include/grub/msdos_partition.h
--- grub2-1.96+20090721/include/grub/msdos_partition.h  2009-05-09 
13:04:08.000000000 +0200
+++ grub2+patch/include/grub/msdos_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_msdos_partition_entry msdos_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 <grub/dl.h>
 #include <grub/command.h>
 #include <grub/machine/biosnum.h>
+#include <grub/msdos_partition.h>
 
 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_msdos_partition *pcdata = dev->disk->partition->data;
+      grub_memcpy((void *) GRUB_MEMORY_MACHINE_PART_TABLE_ADDR,
+                         (void *) &pcdata->msdos_part_entry,
+                         sizeof(struct grub_msdos_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/msdos.c 2009-06-10 23:04:23.000000000 +0200
+++ grub2+patch/partmap/msdos.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.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",

Attachment: signature.asc
Description: Digital signature

Reply via email to