diff --git a/ChangeLog b/ChangeLog index 3f2e78f0b..fcd21caeb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-01-16 Robert Millan + + * include/grub/i386/linuxbios/memory.h + (GRUB_MEMORY_MACHINE_LINUXBIOS_TABLE_ADDR): Remove macro. + * kern/i386/linuxbios/table.c (grub_linuxbios_table_iterate): Do not + receive `table_header' as argument. Instead, probe for it in the + known memory ranges where it can be present. + (grub_available_iterate): Do not pass a fixed `table_header' address + to grub_linuxbios_table_iterate(). + 2008-01-15 Robert Millan * configure.ac: Add `i386-ieee1275' to the list of supported targets. diff --git a/include/grub/i386/linuxbios/memory.h b/include/grub/i386/linuxbios/memory.h index f94c3894d..3534adf58 100644 --- a/include/grub/i386/linuxbios/memory.h +++ b/include/grub/i386/linuxbios/memory.h @@ -28,8 +28,6 @@ #include #endif -#define GRUB_MEMORY_MACHINE_LINUXBIOS_TABLE_ADDR 0x500 - #define GRUB_MEMORY_MACHINE_LOWER_USABLE 0x9fc00 /* 640 kiB - 1 kiB */ #define GRUB_MEMORY_MACHINE_LOWER_SIZE 0xf0000 /* 960 kiB */ diff --git a/kern/i386/linuxbios/table.c b/kern/i386/linuxbios/table.c index c5bc71f40..1adab639a 100644 --- a/kern/i386/linuxbios/table.c +++ b/kern/i386/linuxbios/table.c @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2007 Free Software Foundation, Inc. + * 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 @@ -21,13 +21,33 @@ #include static grub_err_t -grub_linuxbios_table_iterate (grub_linuxbios_table_header_t table_header, - int (*hook) (grub_linuxbios_table_item_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; - if (grub_memcmp (table_header->signature, "LBIO", 4)) - grub_fatal ("Could not find LinuxBIOS table\n"); + auto int check_signature (grub_linuxbios_table_header_t); + int check_signature (grub_linuxbios_table_header_t table_header) + { + if (! grub_memcmp (table_header->signature, "LBIO", 4)) + return 1; + + return 0; + } + + /* Assuming table_header is aligned to its size (8 bytes). */ + + for (table_header = 0x500; table_header < 0x1000; table_header++) + if (check_signature (table_header)) + goto signature_found; + + for (table_header = 0xf0000; table_header < 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 + @@ -62,8 +82,7 @@ grub_available_iterate (int (*hook) (mem_region_t)) return 0; } - grub_linuxbios_table_iterate (GRUB_MEMORY_MACHINE_LINUXBIOS_TABLE_ADDR, - iterate_linuxbios_table); + grub_linuxbios_table_iterate (iterate_linuxbios_table); return 0; }