* 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(). diff -ur ../grub2/include/grub/i386/linuxbios/memory.h ./include/grub/i386/linuxbios/memory.h --- ../grub2/include/grub/i386/linuxbios/memory.h 2007-10-31 23:35:13.000000000 +0100 +++ ./include/grub/i386/linuxbios/memory.h 2008-01-16 13:36:24.000000000 +0100 @@ -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 -ur ../grub2/kern/i386/linuxbios/table.c ./kern/i386/linuxbios/table.c --- ../grub2/kern/i386/linuxbios/table.c 2007-10-31 23:35:13.000000000 +0100 +++ ./kern/i386/linuxbios/table.c 2008-01-16 14:35:35.000000000 +0100 @@ -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 sizeof(*table_header) alignment. */ + + 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 @@ return 0; } - grub_linuxbios_table_iterate (GRUB_MEMORY_MACHINE_LINUXBIOS_TABLE_ADDR, - iterate_linuxbios_table); + grub_linuxbios_table_iterate (iterate_linuxbios_table); return 0; }