[1800] 2008-08-11 Robert Millan <[email protected]>

Robert Millan <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 1800
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1800
Author:   robertmh
Date:     2008-08-11 14:57:39 +0000 (Mon, 11 Aug 2008)

Log Message:
-----------
2008-08-11  Robert Millan  <[email protected]>

        * kern/i386/linuxbios/startup.S: Move from here ...
        * kern/i386/coreboot/startup.S: ... to here.

        * kern/i386/linuxbios/init.c: Move from here ...
        * kern/i386/coreboot/init.c: ... to here.

        * kern/i386/linuxbios/table.c: Move from here ...
        * kern/i386/coreboot/mmap.c: ... to here.

        * conf/i386-coreboot.rmk (kernel_elf_SOURCES): Update moved files.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/DISTLIST
    trunk/grub2/conf/i386-coreboot.mk
    trunk/grub2/conf/i386-coreboot.rmk

Added Paths:
-----------
    trunk/grub2/kern/i386/coreboot/
    trunk/grub2/kern/i386/coreboot/init.c
    trunk/grub2/kern/i386/coreboot/mmap.c
    trunk/grub2/kern/i386/coreboot/startup.S

Removed Paths:
-------------
    trunk/grub2/kern/i386/linuxbios/

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2008-08-11 10:33:14 UTC (rev 1799)
+++ trunk/grub2/ChangeLog	2008-08-11 14:57:39 UTC (rev 1800)
@@ -1,5 +1,18 @@
 2008-08-11  Robert Millan  <[email protected]>
 
+	* kern/i386/linuxbios/startup.S: Move from here ...
+	* kern/i386/coreboot/startup.S: ... to here.
+
+	* kern/i386/linuxbios/init.c: Move from here ...
+	* kern/i386/coreboot/init.c: ... to here.
+
+	* kern/i386/linuxbios/table.c: Move from here ...
+	* kern/i386/coreboot/mmap.c: ... to here.
+
+	* conf/i386-coreboot.rmk (kernel_elf_SOURCES): Update moved files.
+
+2008-08-11  Robert Millan  <[email protected]>
+
 	* kern/device.c (grub_device_open): Do not handle grub_disk_open()
 	errors.  Leave it to the upper layer to handle them.
 

Modified: trunk/grub2/DISTLIST
===================================================================
--- trunk/grub2/DISTLIST	2008-08-11 10:33:14 UTC (rev 1799)
+++ trunk/grub2/DISTLIST	2008-08-11 14:57:39 UTC (rev 1800)
@@ -234,13 +234,13 @@
 kern/err.c
 kern/file.c
 kern/fs.c
+kern/i386/coreboot/init.c
+kern/i386/coreboot/mmap.c
+kern/i386/coreboot/startup.S
 kern/i386/dl.c
 kern/i386/efi/init.c
 kern/i386/efi/startup.S
 kern/i386/halt.c
-kern/i386/linuxbios/init.c
-kern/i386/linuxbios/startup.S
-kern/i386/linuxbios/table.c
 kern/i386/loader.S
 kern/i386/pc/init.c
 kern/i386/pc/lzo1x.S

Modified: trunk/grub2/conf/i386-coreboot.mk
===================================================================
--- trunk/grub2/conf/i386-coreboot.mk	2008-08-11 10:33:14 UTC (rev 1799)
+++ trunk/grub2/conf/i386-coreboot.mk	2008-08-11 14:57:39 UTC (rev 1800)
@@ -12,8 +12,9 @@
 pkglib_PROGRAMS = kernel.elf
 
 # For kernel.elf.
-kernel_elf_SOURCES = kern/i386/linuxbios/startup.S kern/i386/linuxbios/init.c \
-	kern/i386/linuxbios/table.c \
+kernel_elf_SOURCES = kern/i386/coreboot/startup.S \
+	kern/i386/coreboot/init.c \
+	kern/i386/coreboot/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 \
@@ -26,23 +27,23 @@
 	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_linuxbios_startup.o kernel_elf-kern_i386_linuxbios_init.o kernel_elf-kern_i386_linuxbios_table.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-symlis
 t.o
-MOSTLYCLEANFILES += kernel_elf-kern_i386_linuxbios_startup.d kernel_elf-kern_i386_linuxbios_init.d kernel_elf-kern_i386_linuxbios_table.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_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
 
-kernel.elf: $(kernel_elf_DEPENDENCIES) kernel_elf-kern_i386_linuxbios_startup.o kernel_elf-kern_i386_linuxbios_init.o kernel_elf-kern_i386_linuxbios_table.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 ker
 nel_elf-symlist.o
-	$(TARGET_CC) -o $@ kernel_elf-kern_i386_linuxbios_startup.o kernel_elf-kern_i386_linuxbios_init.o kernel_elf-kern_i386_linuxbios_table.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_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 $(TAR
 GET_LDFLAGS) $(kernel_elf_LDFLAGS)
 
-kernel_elf-kern_i386_linuxbios_startup.o: kern/i386/linuxbios/startup.S $(kern/i386/linuxbios/startup.S_DEPENDENCIES)
-	$(TARGET_CC) -Ikern/i386/linuxbios -I$(srcdir)/kern/i386/linuxbios $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
--include kernel_elf-kern_i386_linuxbios_startup.d
+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 $@ $<
+-include kernel_elf-kern_i386_coreboot_startup.d
 
-kernel_elf-kern_i386_linuxbios_init.o: kern/i386/linuxbios/init.c $(kern/i386/linuxbios/init.c_DEPENDENCIES)
-	$(TARGET_CC) -Ikern/i386/linuxbios -I$(srcdir)/kern/i386/linuxbios $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
--include kernel_elf-kern_i386_linuxbios_init.d
+kernel_elf-kern_i386_coreboot_init.o: kern/i386/coreboot/init.c $(kern/i386/coreboot/init.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_init.d
 
-kernel_elf-kern_i386_linuxbios_table.o: kern/i386/linuxbios/table.c $(kern/i386/linuxbios/table.c_DEPENDENCIES)
-	$(TARGET_CC) -Ikern/i386/linuxbios -I$(srcdir)/kern/i386/linuxbios $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(kernel_elf_CFLAGS) -MD -c -o $@ $<
--include kernel_elf-kern_i386_linuxbios_table.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_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 $@ $<

Modified: trunk/grub2/conf/i386-coreboot.rmk
===================================================================
--- trunk/grub2/conf/i386-coreboot.rmk	2008-08-11 10:33:14 UTC (rev 1799)
+++ trunk/grub2/conf/i386-coreboot.rmk	2008-08-11 14:57:39 UTC (rev 1800)
@@ -11,8 +11,9 @@
 pkglib_PROGRAMS = kernel.elf
 
 # For kernel.elf.
-kernel_elf_SOURCES = kern/i386/linuxbios/startup.S kern/i386/linuxbios/init.c \
-	kern/i386/linuxbios/table.c \
+kernel_elf_SOURCES = kern/i386/coreboot/startup.S \
+	kern/i386/coreboot/init.c \
+	kern/i386/coreboot/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 \

Copied: trunk/grub2/kern/i386/coreboot/init.c (from rev 1799, trunk/grub2/kern/i386/linuxbios/init.c)
===================================================================
--- trunk/grub2/kern/i386/coreboot/init.c	                        (rev 0)
+++ trunk/grub2/kern/i386/coreboot/init.c	2008-08-11 14:57:39 UTC (rev 1800)
@@ -0,0 +1,163 @@
+/*
+ *  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/kernel.h>
+#include <grub/mm.h>
+#include <grub/machine/time.h>
+#include <grub/machine/init.h>
+#include <grub/machine/memory.h>
+#include <grub/machine/console.h>
+#include <grub/machine/kernel.h>
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/loader.h>
+#include <grub/env.h>
+#include <grub/cache.h>
+#include <grub/time.h>
+#include <grub/symbol.h>
+#include <grub/cpu/io.h>
+
+#define GRUB_FLOPPY_REG_DIGITAL_OUTPUT		0x3f2
+
+extern char _start[];
+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;
+
+grub_uint32_t
+grub_get_rtc (void)
+{
+  return grub_time_tics;
+}
+
+/* Stop the floppy drive from spinning, so that other software is
+   jumped to with a known state.  */
+void
+grub_stop_floppy (void)
+{
+  grub_outb (0, GRUB_FLOPPY_REG_DIGITAL_OUTPUT);
+}
+
+void
+grub_exit (void)
+{
+  grub_printf ("grub_exit() is not implemented.\n");
+  grub_stop ();
+}
+
+void
+grub_arch_sync_caches (void *address __attribute__ ((unused)),
+		       grub_size_t len __attribute__ ((unused)))
+{
+}
+
+void
+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;
+
+  auto int heap_init (mem_region_t);
+  int heap_init (mem_region_t mem_region)
+  {
+    grub_uint64_t addr = mem_region->addr;
+    grub_uint64_t size = mem_region->size;
+
+#if GRUB_CPU_SIZEOF_VOID_P == 4
+    /* Restrict ourselves to 32-bit memory space.  */
+    if (addr > ULONG_MAX)
+      {
+	grub_upper_mem = ULONG_MAX;
+	return 0;
+      }
+    if (addr + size > ULONG_MAX)
+      size = ULONG_MAX - addr;
+#endif
+
+    grub_upper_mem = grub_max (grub_upper_mem, addr + size);
+
+    if (mem_region->type != GRUB_LINUXBIOS_MEMORY_AVAILABLE)
+      return 0;
+
+    /* Avoid the lower memory.  */
+    if (addr < GRUB_MEMORY_MACHINE_LOWER_SIZE)
+      {
+	if (addr + size <= GRUB_MEMORY_MACHINE_LOWER_SIZE)
+	  return 0;
+	else
+	  {
+	    size -= GRUB_MEMORY_MACHINE_LOWER_SIZE - addr;
+	    addr = GRUB_MEMORY_MACHINE_LOWER_SIZE;
+	  }
+      }
+
+    if (addr == GRUB_MEMORY_MACHINE_UPPER_START
+	|| (addr >= GRUB_MEMORY_MACHINE_LOWER_SIZE
+	    && addr <= GRUB_MEMORY_MACHINE_UPPER_START
+	    && (addr + size > GRUB_MEMORY_MACHINE_UPPER_START)))
+      {
+	grub_size_t quarter = size >> 2;
+
+	grub_os_area_addr = addr;
+	grub_os_area_size = size - quarter;
+	grub_mm_init_region ((void *) (grub_os_area_addr + grub_os_area_size),
+			     quarter);
+      }
+    else
+      grub_mm_init_region ((void *) (grub_addr_t) addr, (grub_size_t) size);
+
+    return 0;
+  }
+
+  grub_available_iterate (heap_init);
+
+  /* This variable indicates size, not offset.  */
+  grub_upper_mem -= GRUB_MEMORY_MACHINE_UPPER_START;
+
+  grub_tsc_init ();
+}
+
+void
+grub_machine_set_prefix (void)
+{
+  /* Initialize the prefix.  */
+  grub_env_set ("prefix", grub_prefix);
+}
+
+void
+grub_machine_fini (void)
+{
+  grub_console_fini ();
+}
+
+/* Return the end of the core image.  */
+grub_addr_t
+grub_arch_modules_addr (void)
+{
+  return ALIGN_UP((grub_addr_t) _end, GRUB_MOD_ALIGN);
+}

Copied: trunk/grub2/kern/i386/coreboot/mmap.c (from rev 1799, trunk/grub2/kern/i386/linuxbios/table.c)
===================================================================
--- trunk/grub2/kern/i386/coreboot/mmap.c	                        (rev 0)
+++ trunk/grub2/kern/i386/coreboot/mmap.c	2008-08-11 14:57:39 UTC (rev 1800)
@@ -0,0 +1,91 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 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/memory.h>
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/misc.h>
+
+static grub_err_t
+grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t))
+{
+  grub_linuxbios_table_header_t table_header;
+  grub_linuxbios_table_item_t table_item;
+
+  auto int check_signature (grub_linuxbios_table_header_t);
+  int check_signature (grub_linuxbios_table_header_t tbl_header)
+  {
+    if (! grub_memcmp (tbl_header->signature, "LBIO", 4))
+      return 1;
+
+    return 0;
+  }
+
+  /* Assuming table_header is aligned to its size (8 bytes).  */
+
+  for (table_header = (grub_linuxbios_table_header_t) 0x500;
+       table_header < (grub_linuxbios_table_header_t) 0x1000; table_header++)
+    if (check_signature (table_header))
+      goto signature_found;
+
+  for (table_header = (grub_linuxbios_table_header_t) 0xf0000;
+       table_header < (grub_linuxbios_table_header_t) 0x100000; table_header++)
+    if (check_signature (table_header))
+      goto signature_found;
+
+  grub_fatal ("Could not find coreboot table\n");
+
+signature_found:
+
+  table_item =
+    (grub_linuxbios_table_item_t) ((long) table_header +
+			       (long) table_header->size);
+  for (; table_item->size;
+       table_item = (grub_linuxbios_table_item_t) ((long) table_item + (long) table_item->size))
+    if (hook (table_item))
+      return 1;
+
+  return 0;
+}
+
+grub_err_t
+grub_available_iterate (int (*hook) (mem_region_t))
+{
+  mem_region_t mem_region;
+
+  auto int iterate_linuxbios_table (grub_linuxbios_table_item_t);
+  int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item)
+  {
+    if (table_item->tag != GRUB_LINUXBIOS_MEMBER_MEMORY)
+      return 0;
+
+    mem_region =
+      (mem_region_t) ((long) table_item +
+				 sizeof (struct grub_linuxbios_table_item));
+    for (; (long) mem_region < (long) table_item + (long) table_item->size;
+	 mem_region++)
+      if (hook (mem_region))
+	return 1;
+
+    return 0;
+  }
+
+  grub_linuxbios_table_iterate (iterate_linuxbios_table);
+
+  return 0;
+}

Copied: trunk/grub2/kern/i386/coreboot/startup.S (from rev 1799, trunk/grub2/kern/i386/linuxbios/startup.S)
===================================================================
--- trunk/grub2/kern/i386/coreboot/startup.S	                        (rev 0)
+++ trunk/grub2/kern/i386/coreboot/startup.S	2008-08-11 14:57:39 UTC (rev 1800)
@@ -0,0 +1,95 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 1999,2000,2001,2002,2003,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/>.
+ */
+
+#define ASM_FILE	1
+
+#include <grub/symbol.h>
+#include <grub/machine/kernel.h>
+#include <grub/machine/memory.h>
+#include <grub/cpu/linux.h>
+#include <multiboot.h>
+#include <multiboot2.h>
+
+/*
+ * Note: GRUB is compiled with the options -mrtd and -mregparm=3.
+ *       So the first three arguments are passed in %eax, %edx, and %ecx,
+ *       respectively, and if a function has a fixed number of arguments
+ *       and the number if greater than three, the function must return
+ *       with "ret $N" where N is ((the number of arguments) - 3) * 4.
+ */
+
+	.file	"startup.S"
+	.text
+	.globl	start, _start
+start:
+_start:
+	jmp codestart
+
+	/*
+	 *  This is a special data area at a fixed offset from the beginning.
+	 */
+
+	. = EXT_C(start) + GRUB_KERNEL_MACHINE_PREFIX
+
+VARIABLE(grub_prefix)
+	/* to be filled by grub-mkimage */
+
+	/*
+	 *  Leave some breathing room for the prefix.
+	 */
+
+	. = EXT_C(start) + GRUB_KERNEL_MACHINE_DATA_END
+
+#if 0
+/*
+ *  Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself).
+ */
+multiboot_header:
+	/* magic */
+	.long	0x1BADB002
+	/* flags */
+	.long	0
+	/* checksum */
+	.long	-0x1BADB002
+#endif
+
+codestart:
+	/* initialize the stack */
+	movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp
+
+	/* jump to the main body of C code */
+	jmp EXT_C(grub_main)
+
+/*
+ *  This call is special...  it never returns...  in fact it should simply
+ *  hang at this point!
+ */
+FUNCTION(grub_stop)
+	hlt
+	jmp EXT_C(grub_stop)
+
+/*
+ *  prot_to_real and associated structures (but NOT real_to_prot, that is
+ *  only needed for BIOS gates).
+ */
+#include "../realmode.S"
+
+/*
+ *  Routines needed by Linux and Multiboot loaders.
+ */
+#include "../loader.S"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.