]>
Commit | Line | Data |
---|---|---|
ca25d8f0 | 1 | /* |
2 | * GRUB -- GRand Unified Bootloader | |
1210e168 | 3 | * Copyright (C) 2007,2008 Free Software Foundation, Inc. |
ca25d8f0 | 4 | * |
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. | |
9 | * | |
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. | |
14 | * | |
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/>. | |
17 | */ | |
18 | ||
19 | #include <grub/machine/memory.h> | |
20 | #include <grub/types.h> | |
21 | #include <grub/err.h> | |
bcd35b90 | 22 | #include <grub/misc.h> |
ca25d8f0 | 23 | |
24 | static grub_err_t | |
1210e168 | 25 | grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t)) |
ca25d8f0 | 26 | { |
1210e168 | 27 | grub_linuxbios_table_header_t table_header; |
ca25d8f0 | 28 | grub_linuxbios_table_item_t table_item; |
29 | ||
1210e168 | 30 | auto int check_signature (grub_linuxbios_table_header_t); |
bcd35b90 | 31 | int check_signature (grub_linuxbios_table_header_t tbl_header) |
1210e168 | 32 | { |
bcd35b90 | 33 | if (! grub_memcmp (tbl_header->signature, "LBIO", 4)) |
1210e168 | 34 | return 1; |
35 | ||
36 | return 0; | |
37 | } | |
38 | ||
39 | /* Assuming table_header is aligned to its size (8 bytes). */ | |
40 | ||
bcd35b90 | 41 | for (table_header = (grub_linuxbios_table_header_t) 0x500; |
42 | table_header < (grub_linuxbios_table_header_t) 0x1000; table_header++) | |
1210e168 | 43 | if (check_signature (table_header)) |
44 | goto signature_found; | |
45 | ||
bcd35b90 | 46 | for (table_header = (grub_linuxbios_table_header_t) 0xf0000; |
47 | table_header < (grub_linuxbios_table_header_t) 0x100000; table_header++) | |
1210e168 | 48 | if (check_signature (table_header)) |
49 | goto signature_found; | |
50 | ||
51 | grub_fatal ("Could not find coreboot table\n"); | |
52 | ||
53 | signature_found: | |
ca25d8f0 | 54 | |
55 | table_item = | |
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)) | |
7819a456 VS |
60 | { |
61 | if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK | |
62 | && check_signature ((grub_linuxbios_table_header_t) (grub_addr_t) | |
63 | *(grub_uint64_t *) (table_item + 1))) | |
64 | { | |
65 | table_header = (grub_linuxbios_table_header_t) (grub_addr_t) | |
66 | *(grub_uint64_t *) (table_item + 1); | |
67 | goto signature_found; | |
68 | } | |
69 | if (hook (table_item)) | |
70 | return 1; | |
71 | } | |
ca25d8f0 | 72 | |
73 | return 0; | |
74 | } | |
75 | ||
7819a456 | 76 | grub_err_t |
deceb3ec | 77 | grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t)) |
ca25d8f0 | 78 | { |
79 | mem_region_t mem_region; | |
80 | ||
81 | auto int iterate_linuxbios_table (grub_linuxbios_table_item_t); | |
82 | int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item) | |
83 | { | |
84 | if (table_item->tag != GRUB_LINUXBIOS_MEMBER_MEMORY) | |
85 | return 0; | |
86 | ||
87 | mem_region = | |
88 | (mem_region_t) ((long) table_item + | |
89 | sizeof (struct grub_linuxbios_table_item)); | |
deceb3ec | 90 | while ((long) mem_region < (long) table_item + (long) table_item->size) |
91 | { | |
92 | if (hook (mem_region->addr, mem_region->size, | |
93 | /* Multiboot mmaps match with the coreboot mmap definition. | |
94 | Therefore, we can just pass type through. */ | |
95 | mem_region->type)) | |
96 | return 1; | |
97 | ||
98 | mem_region++; | |
99 | } | |
ca25d8f0 | 100 | |
101 | return 0; | |
102 | } | |
103 | ||
1210e168 | 104 | grub_linuxbios_table_iterate (iterate_linuxbios_table); |
ca25d8f0 | 105 | |
106 | return 0; | |
107 | } |