]> git.proxmox.com Git - grub2.git/blame - kern/i386/coreboot/mmap.c
Use LBIO on coreboot.
[grub2.git] / kern / i386 / coreboot / mmap.c
CommitLineData
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
24static grub_err_t
1210e168 25grub_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
53signature_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 76grub_err_t
deceb3ec 77grub_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}