]> git.proxmox.com Git - grub2.git/commitdiff
2008-11-12 Robert Millan <rmh@aybabtu.com>
authorrobertmh <robertmh@localhost>
Tue, 11 Nov 2008 23:27:18 +0000 (23:27 +0000)
committerrobertmh <robertmh@localhost>
Tue, 11 Nov 2008 23:27:18 +0000 (23:27 +0000)
        Use newly-added Multiboot support in coreboot.

        * conf/i386-coreboot.rmk (kernel_elf_SOURCES): Replace
        `kern/i386/coreboot/mmap.c' with `kern/i386/multiboot_mmap.c'.

        * kern/i386/coreboot/startup.S: Enable Multiboot header, fix its
        alignment, set `MULTIBOOT_MEMORY_INFO' flag.
        (codestart): Store the MBI in `startup_multiboot_info' when we're
        being loaded using Multiboot.

        * kern/i386/coreboot/init.c (grub_machine_init): Move
        grub_at_keyboard_init() call to beginning of function (useful for
        debugging).  Call grub_machine_mmap_init() before attempting to use
        grub_machine_mmap_iterate().
        (grub_lower_mem, grub_upper_mem): Move from here ...
        * kern/i386/multiboot_mmap.c (grub_lower_mem, grub_upper_mem): ... to
        here (new file).

        * include/grub/i386/coreboot/memory.h (grub_machine_mmap_init): New
        function prototype.

ChangeLog
DISTLIST
conf/i386-coreboot.mk
conf/i386-coreboot.rmk
include/grub/i386/coreboot/memory.h
kern/i386/coreboot/init.c
kern/i386/coreboot/startup.S
kern/i386/multiboot_mmap.c [new file with mode: 0644]

index 33e70ec89f38983228462e49311a988fe6cee015..cbb920c62fdea6ea00ba8806b79d4db9eac92c3d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2008-11-12  Robert Millan  <rmh@aybabtu.com>
+
+       Use newly-added Multiboot support in coreboot.
+
+       * conf/i386-coreboot.rmk (kernel_elf_SOURCES): Replace
+       `kern/i386/coreboot/mmap.c' with `kern/i386/multiboot_mmap.c'.
+
+       * kern/i386/coreboot/startup.S: Enable Multiboot header, fix its
+       alignment, set `MULTIBOOT_MEMORY_INFO' flag.
+       (codestart): Store the MBI in `startup_multiboot_info' when we're
+       being loaded using Multiboot.
+
+       * kern/i386/coreboot/init.c (grub_machine_init): Move
+       grub_at_keyboard_init() call to beginning of function (useful for
+       debugging).  Call grub_machine_mmap_init() before attempting to use
+       grub_machine_mmap_iterate().
+       (grub_lower_mem, grub_upper_mem): Move from here ...
+       * kern/i386/multiboot_mmap.c (grub_lower_mem, grub_upper_mem): ... to
+       here (new file).
+
+       * include/grub/i386/coreboot/memory.h (grub_machine_mmap_init): New
+       function prototype.
+
 2008-11-12  Robert Millan  <rmh@aybabtu.com>
 
        Fix a regression introduced by the at_keyboard.mod split.  Because
index 95f28a4d06c2b638dcaf4ec00dd33eaf66950589..01046c2e46751ee545614e1243d84294a8c849cd 100644 (file)
--- a/DISTLIST
+++ b/DISTLIST
@@ -313,6 +313,7 @@ kern/generic/rtc_get_time_ms.c
 kern/i386/dl.c
 kern/i386/halt.c
 kern/i386/loader.S
+kern/i386/multiboot_mmap.c
 kern/i386/pit.c
 kern/i386/realmode.S
 kern/i386/reboot.c
index aaa221c617164d137672412e631a6a15af243e31..f15ae2158879ab6aedc49ab03e36e7e8d156be0f 100644 (file)
@@ -14,7 +14,7 @@ pkglib_PROGRAMS = kernel.elf
 # For kernel.elf.
 kernel_elf_SOURCES = kern/i386/coreboot/startup.S \
        kern/i386/coreboot/init.c \
-       kern/i386/coreboot/mmap.c \
+       kern/i386/multiboot_mmap.c \
        kern/main.c kern/device.c \
        kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
        kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
@@ -27,11 +27,11 @@ kernel_elf_SOURCES = kern/i386/coreboot/startup.S \
        term/i386/pc/console.c \
        term/i386/pc/at_keyboard.c term/i386/pc/vga_text.c \
        symlist.c
-CLEANFILES += kernel.elf kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_coreboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o
-MOSTLYCLEANFILES += kernel_elf-kern_i386_coreboot_startup.d kernel_elf-kern_i386_coreboot_init.d kernel_elf-kern_i386_coreboot_mmap.d kernel_elf-kern_main.d kernel_elf-kern_device.d kernel_elf-kern_disk.d kernel_elf-kern_dl.d kernel_elf-kern_file.d kernel_elf-kern_fs.d kernel_elf-kern_err.d kernel_elf-kern_misc.d kernel_elf-kern_mm.d kernel_elf-kern_loader.d kernel_elf-kern_rescue.d kernel_elf-kern_term.d kernel_elf-kern_time.d kernel_elf-kern_i386_dl.d kernel_elf-kern_parser.d kernel_elf-kern_partition.d kernel_elf-kern_i386_tsc.d kernel_elf-kern_i386_pit.d kernel_elf-kern_generic_rtc_get_time_ms.d kernel_elf-kern_generic_millisleep.d kernel_elf-kern_env.d kernel_elf-term_i386_pc_console.d kernel_elf-term_i386_pc_at_keyboard.d kernel_elf-term_i386_pc_vga_text.d kernel_elf-symlist.d
+CLEANFILES += kernel.elf kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_multiboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o
+MOSTLYCLEANFILES += kernel_elf-kern_i386_coreboot_startup.d kernel_elf-kern_i386_coreboot_init.d kernel_elf-kern_i386_multiboot_mmap.d kernel_elf-kern_main.d kernel_elf-kern_device.d kernel_elf-kern_disk.d kernel_elf-kern_dl.d kernel_elf-kern_file.d kernel_elf-kern_fs.d kernel_elf-kern_err.d kernel_elf-kern_misc.d kernel_elf-kern_mm.d kernel_elf-kern_loader.d kernel_elf-kern_rescue.d kernel_elf-kern_term.d kernel_elf-kern_time.d kernel_elf-kern_i386_dl.d kernel_elf-kern_parser.d kernel_elf-kern_partition.d kernel_elf-kern_i386_tsc.d kernel_elf-kern_i386_pit.d kernel_elf-kern_generic_rtc_get_time_ms.d kernel_elf-kern_generic_millisleep.d kernel_elf-kern_env.d kernel_elf-term_i386_pc_console.d kernel_elf-term_i386_pc_at_keyboard.d kernel_elf-term_i386_pc_vga_text.d kernel_elf-symlist.d
 
-kernel.elf: $(kernel_elf_DEPENDENCIES) kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_coreboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o
-       $(TARGET_CC) -o $@ kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_coreboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o $(TARGET_LDFLAGS) $(kernel_elf_LDFLAGS)
+kernel.elf: $(kernel_elf_DEPENDENCIES) kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_multiboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o
+       $(TARGET_CC) -o $@ kernel_elf-kern_i386_coreboot_startup.o kernel_elf-kern_i386_coreboot_init.o kernel_elf-kern_i386_multiboot_mmap.o kernel_elf-kern_main.o kernel_elf-kern_device.o kernel_elf-kern_disk.o kernel_elf-kern_dl.o kernel_elf-kern_file.o kernel_elf-kern_fs.o kernel_elf-kern_err.o kernel_elf-kern_misc.o kernel_elf-kern_mm.o kernel_elf-kern_loader.o kernel_elf-kern_rescue.o kernel_elf-kern_term.o kernel_elf-kern_time.o kernel_elf-kern_i386_dl.o kernel_elf-kern_parser.o kernel_elf-kern_partition.o kernel_elf-kern_i386_tsc.o kernel_elf-kern_i386_pit.o kernel_elf-kern_generic_rtc_get_time_ms.o kernel_elf-kern_generic_millisleep.o kernel_elf-kern_env.o kernel_elf-term_i386_pc_console.o kernel_elf-term_i386_pc_at_keyboard.o kernel_elf-term_i386_pc_vga_text.o kernel_elf-symlist.o $(TARGET_LDFLAGS) $(kernel_elf_LDFLAGS)
 
 kernel_elf-kern_i386_coreboot_startup.o: kern/i386/coreboot/startup.S $(kern/i386/coreboot/startup.S_DEPENDENCIES)
        $(TARGET_CC) -Ikern/i386/coreboot -I$(srcdir)/kern/i386/coreboot $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
@@ -41,9 +41,9 @@ kernel_elf-kern_i386_coreboot_init.o: kern/i386/coreboot/init.c $(kern/i386/core
        $(TARGET_CC) -Ikern/i386/coreboot -I$(srcdir)/kern/i386/coreboot $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
 -include kernel_elf-kern_i386_coreboot_init.d
 
-kernel_elf-kern_i386_coreboot_mmap.o: kern/i386/coreboot/mmap.c $(kern/i386/coreboot/mmap.c_DEPENDENCIES)
-       $(TARGET_CC) -Ikern/i386/coreboot -I$(srcdir)/kern/i386/coreboot $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
--include kernel_elf-kern_i386_coreboot_mmap.d
+kernel_elf-kern_i386_multiboot_mmap.o: kern/i386/multiboot_mmap.c $(kern/i386/multiboot_mmap.c_DEPENDENCIES)
+       $(TARGET_CC) -Ikern/i386 -I$(srcdir)/kern/i386 $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
+-include kernel_elf-kern_i386_multiboot_mmap.d
 
 kernel_elf-kern_main.o: kern/main.c $(kern/main.c_DEPENDENCIES)
        $(TARGET_CC) -Ikern -I$(srcdir)/kern $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
index 78088fd3f4117580577d417f925bc40704d588c7..79333e5b7a9827b4603821227ad28f8a98ba64e4 100644 (file)
@@ -13,7 +13,7 @@ pkglib_PROGRAMS = kernel.elf
 # For kernel.elf.
 kernel_elf_SOURCES = kern/i386/coreboot/startup.S \
        kern/i386/coreboot/init.c \
-       kern/i386/coreboot/mmap.c \
+       kern/i386/multiboot_mmap.c \
        kern/main.c kern/device.c \
        kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
        kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
index 687077c485d13c4e46888696b9ec62fc7db44f61..b1b01547257a86ad96ba42a6a2a706ddb346d944 100644 (file)
@@ -59,6 +59,8 @@ struct grub_linuxbios_mem_region
 };
 typedef struct grub_linuxbios_mem_region *mem_region_t;
 
+void grub_machine_mmap_init (void);
+
 void EXPORT_FUNC(grub_machine_mmap_iterate)
      (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
 
index 05115476576b8b4bd9844e7b5dc35a3e7ca1c874..e08bc866d52e4a8b1aa4fde40ab7007b8ca28f4c 100644 (file)
@@ -42,7 +42,6 @@ extern char _end[];
 
 grub_addr_t grub_os_area_addr;
 grub_size_t grub_os_area_size;
-grub_size_t grub_lower_mem, grub_upper_mem;
 
 /* FIXME: we need interrupts to do this right */
 static grub_uint32_t grub_time_tics = 0;
@@ -79,9 +78,7 @@ grub_machine_init (void)
 {
   /* Initialize the console as early as possible.  */
   grub_console_init ();
-
-  grub_lower_mem = GRUB_MEMORY_MACHINE_LOWER_USABLE;
-  grub_upper_mem = 0;
+  grub_at_keyboard_init ();
 
   auto int NESTED_FUNC_ATTR heap_init (grub_uint64_t, grub_uint64_t, grub_uint32_t);
   int NESTED_FUNC_ATTR heap_init (grub_uint64_t addr, grub_uint64_t size, grub_uint32_t type)
@@ -132,13 +129,13 @@ grub_machine_init (void)
     return 0;
   }
 
+  grub_machine_mmap_init ();
   grub_machine_mmap_iterate (heap_init);
 
   /* This variable indicates size, not offset.  */
   grub_upper_mem -= GRUB_MEMORY_MACHINE_UPPER_START;
 
   grub_tsc_init ();
-  grub_at_keyboard_init ();
 }
 
 void
index 8d1aa3c150be59bf03f28d9672cbb764d07d9b03..835978bfe6417bd9874a0b0ddfb8d7fedc2a596f 100644 (file)
@@ -55,20 +55,24 @@ VARIABLE(grub_prefix)
 
        . = EXT_C(start) + GRUB_KERNEL_CPU_DATA_END
 
-#if 0
 /*
  *  Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself).
  */
+       .p2align        2       /* force 4-byte alignment */
 multiboot_header:
        /* magic */
        .long   0x1BADB002
        /* flags */
-       .long   0
+       .long   MULTIBOOT_MEMORY_INFO
        /* checksum */
-       .long   -0x1BADB002
-#endif
+       .long   -0x1BADB002 - MULTIBOOT_MEMORY_INFO
 
 codestart:
+       cmpl    $MULTIBOOT_MAGIC2, %eax
+       jne 0f
+       movl    %ebx, EXT_C(startup_multiboot_info)
+0:
+
        /* initialize the stack */
        movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp
 
diff --git a/kern/i386/multiboot_mmap.c b/kern/i386/multiboot_mmap.c
new file mode 100644 (file)
index 0000000..16f155b
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2002,2003,2004,2005,2006,2007,2008  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/machine/init.h>
+#include <grub/machine/memory.h>
+#include <grub/types.h>
+#include <grub/multiboot.h>
+#include <grub/err.h>
+#include <grub/misc.h>
+
+grub_size_t grub_lower_mem, grub_upper_mem;
+
+/* A pointer to the MBI in its initial location.  */
+struct grub_multiboot_info *startup_multiboot_info;
+
+/* The MBI has to be copied to our BSS so that it won't be
+   overwritten.  This is its final location.  */
+static struct grub_multiboot_info kern_multiboot_info;
+
+/* Unfortunately we can't use heap at this point.  But 32 looks like a sane
+   limit (used by memtest86).  */
+static grub_uint8_t mmap_entries[sizeof (struct grub_multiboot_mmap_entry) * 32];
+
+void
+grub_machine_mmap_init ()
+{
+  if (! startup_multiboot_info)
+    grub_fatal ("Must be loaded using Multiboot specification (is this an old version of coreboot?)");
+
+  /* Move MBI to a safe place.  */
+  grub_memmove (&kern_multiboot_info, startup_multiboot_info, sizeof (struct grub_multiboot_info));
+
+  if ((kern_multiboot_info.flags & MULTIBOOT_INFO_MEM_MAP) == 0)
+    grub_fatal ("Missing Multiboot memory information");
+
+  /* Move the memory map to a safe place.  */
+  if (kern_multiboot_info.mmap_length > sizeof (mmap_entries))
+    {
+      grub_printf ("WARNING: Memory map size exceeds limit; it will be truncated\n");
+      kern_multiboot_info.mmap_length = sizeof (mmap_entries);
+    }
+  grub_memmove (mmap_entries, (void *) kern_multiboot_info.mmap_addr, kern_multiboot_info.mmap_length);
+  kern_multiboot_info.mmap_addr = (grub_uint32_t) mmap_entries;
+
+  if ((kern_multiboot_info.flags & MULTIBOOT_INFO_MEMORY) == 0)
+    {
+      grub_lower_mem = GRUB_MEMORY_MACHINE_LOWER_USABLE;
+      grub_upper_mem = 0;
+    }
+  else
+    {
+      grub_lower_mem = kern_multiboot_info.mem_lower * 1024;
+      grub_upper_mem = kern_multiboot_info.mem_upper * 1024;
+    }
+}
+
+void
+grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t))
+{
+  struct grub_multiboot_mmap_entry *entry = (void *) kern_multiboot_info.mmap_addr;
+
+  while ((unsigned long) entry < kern_multiboot_info.mmap_addr + kern_multiboot_info.mmap_length)
+    {
+      if (hook (entry->addr, entry->len, entry->type))
+       break;
+
+      entry = (void *) ((grub_addr_t) entry + entry->size + sizeof (entry->size));
+    }
+}