Index: loader/i386/pc/multiboot.c
===================================================================
RCS file: /sources/grub/grub2/loader/i386/pc/multiboot.c,v
retrieving revision 1.19
diff -u -p -r1.19 multiboot.c
--- loader/i386/pc/multiboot.c	5 Mar 2008 05:09:35 -0000	1.19
+++ loader/i386/pc/multiboot.c	19 Apr 2008 20:36:54 -0000
@@ -24,7 +24,6 @@
  *  - a.out support
  *  - boot device
  *  - symbol table
- *  - memory map
  *  - drives table
  *  - ROM configuration table
  *  - APM table
@@ -74,6 +73,7 @@ grub_multiboot_unload (void)
 	}
       grub_free ((void *) mbi->mods_addr);
       grub_free ((void *) mbi->cmdline);
+      grub_free ((void *) mbi->mmap_addr);
       grub_free (mbi);
     }
 
@@ -314,6 +314,10 @@ grub_multiboot (int argc, char *argv[])
   char buffer[MULTIBOOT_SEARCH], *cmdline = 0, *p;
   struct grub_multiboot_header *header;
   grub_ssize_t len;
+  struct grub_machine_mmap_entry *mmap_entry
+    = (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+  struct grub_machine_mmap_entry *mmap;
+  grub_uint32_t cont;
   int i;
 
   grub_loader_unset ();
@@ -411,6 +415,26 @@ grub_multiboot (int argc, char *argv[])
   mbi->flags |= MULTIBOOT_INFO_CMDLINE;
   mbi->cmdline = (grub_uint32_t) cmdline;
 
+  /* Create memory map */
+  cont = grub_get_mmap_entry (mmap_entry, 0);
+
+  if (mmap_entry->size)
+    {
+      /* Allocate space for 32 memory map entries */
+      mmap = grub_malloc (sizeof (struct grub_machine_mmap_entry) * 32);
+      if (! mmap)
+        goto fail;
+      mmap[0] = *mmap_entry;
+      for (i = 1; cont; i++)
+        {
+          cont = grub_get_mmap_entry (mmap_entry, cont);
+          mmap[i] = *mmap_entry;
+        }
+      mbi->flags |= MULTIBOOT_INFO_MEM_MAP;
+      mbi->mmap_length = sizeof (struct grub_machine_mmap_entry) * i;
+      mbi->mmap_addr = (grub_uint32_t) mmap;
+    }
+
   mbi->flags |= MULTIBOOT_INFO_BOOT_LOADER_NAME;
   mbi->boot_loader_name = (grub_uint32_t) grub_strdup (PACKAGE_STRING);
 
@@ -426,6 +450,8 @@ grub_multiboot (int argc, char *argv[])
   if (grub_errno != GRUB_ERR_NONE)
     {
       grub_free (cmdline);
+      if (mbi->flags & MULTIBOOT_INFO_MEM_MAP)
+        grub_free (mmap);
       grub_free (mbi);
       grub_dl_unref (my_mod);
     }
