2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2007,2008 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #include <grub/machine/memory.h>
20 #include <grub/types.h>
22 #include <grub/misc.h>
25 grub_linuxbios_table_iterate (int (*hook
) (grub_linuxbios_table_item_t
))
27 grub_linuxbios_table_header_t table_header
;
28 grub_linuxbios_table_item_t table_item
;
30 auto int check_signature (grub_linuxbios_table_header_t
);
31 int check_signature (grub_linuxbios_table_header_t tbl_header
)
33 if (! grub_memcmp (tbl_header
->signature
, "LBIO", 4))
39 /* Assuming table_header is aligned to its size (8 bytes). */
41 for (table_header
= (grub_linuxbios_table_header_t
) 0x500;
42 table_header
< (grub_linuxbios_table_header_t
) 0x1000; table_header
++)
43 if (check_signature (table_header
))
46 for (table_header
= (grub_linuxbios_table_header_t
) 0xf0000;
47 table_header
< (grub_linuxbios_table_header_t
) 0x100000; table_header
++)
48 if (check_signature (table_header
))
51 grub_fatal ("Could not find coreboot table\n");
56 (grub_linuxbios_table_item_t
) ((long) table_header
+
57 (long) table_header
->size
);
58 for (; table_item
->size
;
59 table_item
= (grub_linuxbios_table_item_t
) ((long) table_item
+ (long) table_item
->size
))
60 if (hook (table_item
))
67 grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook
) (grub_uint64_t
, grub_uint64_t
, grub_uint32_t
))
69 mem_region_t mem_region
;
71 auto int iterate_linuxbios_table (grub_linuxbios_table_item_t
);
72 int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item
)
74 if (table_item
->tag
!= GRUB_LINUXBIOS_MEMBER_MEMORY
)
78 (mem_region_t
) ((long) table_item
+
79 sizeof (struct grub_linuxbios_table_item
));
80 while ((long) mem_region
< (long) table_item
+ (long) table_item
->size
)
82 if (hook (mem_region
->addr
, mem_region
->size
,
83 /* Multiboot mmaps match with the coreboot mmap definition.
84 Therefore, we can just pass type through. */
94 grub_linuxbios_table_iterate (iterate_linuxbios_table
);