]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[multiboot] Build memory map after shutting down and unhiding gPXE
authorStefan Hajnoczi <stefanha@gmail.com>
Thu, 13 Aug 2009 20:48:10 +0000 (21:48 +0100)
committerStefan Hajnoczi <stefanha@gmail.com>
Mon, 14 Dec 2009 17:58:38 +0000 (17:58 +0000)
The Multiboot memory map needs to be built after unhiding gPXE and
downloaded images from memory.  Solaris faults during boot when trying
to access the ramdisk, which is hidden from the memory map while gPXE is
executing.  This issue is fixed by using the memory map from after gPXE
unhides itself.

Reported-by: Moinak Ghosh <moinakg@belenix.org>
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
src/arch/i386/image/multiboot.c

index 1811e913fa39728f1bfc2eb0c9ae6b0fa61fdbe5..5b620956f5d512b9f2b14775a9ed5deb549c9660 100644 (file)
@@ -267,8 +267,6 @@ static int multiboot_exec ( struct image *image ) {
        memset ( &mbinfo, 0, sizeof ( mbinfo ) );
        mbinfo.flags = ( MBI_FLAG_LOADER | MBI_FLAG_MEM | MBI_FLAG_MMAP |
                         MBI_FLAG_CMDLINE | MBI_FLAG_MODS );
-       multiboot_build_memmap ( image, &mbinfo, mbmemmap,
-                                ( sizeof(mbmemmap) / sizeof(mbmemmap[0]) ) );
        mb_cmdline_offset = 0;
        mbinfo.cmdline = multiboot_add_cmdline ( image->name, image->cmdline );
        mbinfo.mods_count = multiboot_build_module_list ( image, mbmodules,
@@ -282,6 +280,12 @@ static int multiboot_exec ( struct image *image ) {
         */
        shutdown ( SHUTDOWN_BOOT );
 
+       /* Build memory map after unhiding bootloader memory regions as part of
+        * shutting everything down.
+        */
+       multiboot_build_memmap ( image, &mbinfo, mbmemmap,
+                                ( sizeof(mbmemmap) / sizeof(mbmemmap[0]) ) );
+
        /* Jump to OS with flat physical addressing */
        DBGC ( image, "MULTIBOOT %p starting execution at %lx\n",
               image, entry );