From 461bfab7b7e47fd0a76bf6076a438af1b7e2184a Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Mon, 8 May 2017 19:06:22 +0200 Subject: [PATCH 016/177] coreboot: Split parts that are platform-independent. We currently assume that coreboot is always i386, it's no longer the case, so split i386-coreboot parts from generic coreboot code. --- grub-core/Makefile.am | 2 +- grub-core/Makefile.core.def | 6 +- grub-core/commands/i386/coreboot/cb_timestamps.c | 2 +- grub-core/commands/i386/coreboot/cbls.c | 2 +- grub-core/kern/coreboot/cbtable.c | 70 ++++++++++++++++++++++++ grub-core/kern/{i386 => }/coreboot/mmap.c | 6 +- grub-core/kern/i386/coreboot/cbtable.c | 53 +++--------------- grub-core/term/i386/coreboot/cbmemc.c | 2 +- grub-core/video/{i386 => }/coreboot/cbfb.c | 2 +- include/grub/{i386 => }/coreboot/lbio.h | 9 +++ 10 files changed, 99 insertions(+), 55 deletions(-) create mode 100644 grub-core/kern/coreboot/cbtable.c rename grub-core/kern/{i386 => }/coreboot/mmap.c (97%) rename grub-core/video/{i386 => }/coreboot/cbfb.c (99%) rename include/grub/{i386 => }/coreboot/lbio.h (93%) diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am index 809a8aa26..781d0ffbf 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -112,7 +112,7 @@ endif if COND_i386_coreboot KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h -KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/coreboot/lbio.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/coreboot/lbio.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index fb59a7b1d..45ed0fa6b 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -166,7 +166,7 @@ kernel = { i386_multiboot = kern/i386/coreboot/init.c; i386_qemu = kern/i386/qemu/init.c; i386_coreboot_multiboot_qemu = term/i386/pc/vga_text.c; - i386_coreboot = video/i386/coreboot/cbfb.c; + i386_coreboot = video/coreboot/cbfb.c; efi = disk/efi/efidisk.c; efi = kern/efi/efi.c; @@ -227,8 +227,9 @@ kernel = { i386_qemu = kern/vga_init.c; i386_qemu = kern/i386/qemu/mmap.c; - i386_coreboot = kern/i386/coreboot/mmap.c; + i386_coreboot = kern/coreboot/mmap.c; i386_coreboot = kern/i386/coreboot/cbtable.c; + i386_coreboot = kern/coreboot/cbtable.c; i386_multiboot = kern/i386/multiboot_mmap.c; @@ -643,6 +644,7 @@ module = { module = { name = cbtable; common = kern/i386/coreboot/cbtable.c; + common = kern/coreboot/cbtable.c; enable = i386_pc; enable = i386_efi; enable = i386_qemu; diff --git a/grub-core/commands/i386/coreboot/cb_timestamps.c b/grub-core/commands/i386/coreboot/cb_timestamps.c index e72f38d6e..e97ea6bed 100644 --- a/grub-core/commands/i386/coreboot/cb_timestamps.c +++ b/grub-core/commands/i386/coreboot/cb_timestamps.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include GRUB_MOD_LICENSE ("GPLv3+"); diff --git a/grub-core/commands/i386/coreboot/cbls.c b/grub-core/commands/i386/coreboot/cbls.c index e0a10596f..102291f42 100644 --- a/grub-core/commands/i386/coreboot/cbls.c +++ b/grub-core/commands/i386/coreboot/cbls.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include GRUB_MOD_LICENSE ("GPLv3+"); diff --git a/grub-core/kern/coreboot/cbtable.c b/grub-core/kern/coreboot/cbtable.c new file mode 100644 index 000000000..996d3f407 --- /dev/null +++ b/grub-core/kern/coreboot/cbtable.c @@ -0,0 +1,70 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2007,2008,2013 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +/* Helper for grub_linuxbios_table_iterate. */ +int +grub_linuxbios_check_signature (grub_linuxbios_table_header_t tbl_header) +{ + if (! grub_memcmp (tbl_header->signature, "LBIO", 4)) + return 1; + + return 0; +} + +grub_err_t +grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t, + void *), + void *hook_data) +{ + grub_linuxbios_table_header_t table_header = grub_linuxbios_get_tables (); + grub_linuxbios_table_item_t table_item; + + if (!table_header) + return 0; + +signature_found: + + table_item = + (grub_linuxbios_table_item_t) ((char *) table_header + + table_header->header_size); + for (; table_item < (grub_linuxbios_table_item_t) ((char *) table_header + + table_header->header_size + + table_header->table_size); + table_item = (grub_linuxbios_table_item_t) ((char *) table_item + table_item->size)) + { + if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK + && grub_linuxbios_check_signature ((grub_linuxbios_table_header_t) (grub_addr_t) + *(grub_uint64_t *) (table_item + 1))) + { + table_header = (grub_linuxbios_table_header_t) (grub_addr_t) + *(grub_uint64_t *) (table_item + 1); + goto signature_found; + } + if (hook (table_item, hook_data)) + return 1; + } + + return 0; +} diff --git a/grub-core/kern/i386/coreboot/mmap.c b/grub-core/kern/coreboot/mmap.c similarity index 97% rename from grub-core/kern/i386/coreboot/mmap.c rename to grub-core/kern/coreboot/mmap.c index 4d29f6b7d..caf8f7cef 100644 --- a/grub-core/kern/i386/coreboot/mmap.c +++ b/grub-core/kern/coreboot/mmap.c @@ -16,8 +16,8 @@ * along with GRUB. If not, see . */ -#include -#include +#include +#include #include #include #include @@ -49,6 +49,7 @@ iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data) { grub_uint64_t start = mem_region->addr; grub_uint64_t end = mem_region->addr + mem_region->size; +#ifdef __i386__ /* Mark region 0xa0000 - 0x100000 as reserved. */ if (start < 0x100000 && end >= 0xa0000 && mem_region->type == GRUB_MACHINE_MEMORY_AVAILABLE) @@ -75,6 +76,7 @@ iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data) if (end <= start) continue; } +#endif if (ctx->hook (start, end - start, /* Multiboot mmaps match with the coreboot mmap definition. Therefore, we can just pass type diff --git a/grub-core/kern/i386/coreboot/cbtable.c b/grub-core/kern/i386/coreboot/cbtable.c index 1669bc0ca..34a2b59be 100644 --- a/grub-core/kern/i386/coreboot/cbtable.c +++ b/grub-core/kern/i386/coreboot/cbtable.c @@ -17,7 +17,7 @@ */ #include -#include +#include #include #include #include @@ -25,59 +25,20 @@ GRUB_MOD_LICENSE ("GPLv3+"); -/* Helper for grub_linuxbios_table_iterate. */ -static int -check_signature (grub_linuxbios_table_header_t tbl_header) -{ - if (! grub_memcmp (tbl_header->signature, "LBIO", 4)) - return 1; - - return 0; -} - -grub_err_t -grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t, - void *), - void *hook_data) +grub_linuxbios_table_header_t +grub_linuxbios_get_tables (void) { grub_linuxbios_table_header_t table_header; - grub_linuxbios_table_item_t table_item; - /* Assuming table_header is aligned to its size (8 bytes). */ - for (table_header = (grub_linuxbios_table_header_t) 0x500; table_header < (grub_linuxbios_table_header_t) 0x1000; table_header++) - if (check_signature (table_header)) - goto signature_found; + if (grub_linuxbios_check_signature (table_header)) + return table_header; for (table_header = (grub_linuxbios_table_header_t) 0xf0000; table_header < (grub_linuxbios_table_header_t) 0x100000; table_header++) - if (check_signature (table_header)) - goto signature_found; - - return 0; - -signature_found: - - table_item = - (grub_linuxbios_table_item_t) ((char *) table_header + - table_header->header_size); - for (; table_item < (grub_linuxbios_table_item_t) ((char *) table_header - + table_header->header_size - + table_header->table_size); - table_item = (grub_linuxbios_table_item_t) ((char *) table_item + table_item->size)) - { - if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK - && check_signature ((grub_linuxbios_table_header_t) (grub_addr_t) - *(grub_uint64_t *) (table_item + 1))) - { - table_header = (grub_linuxbios_table_header_t) (grub_addr_t) - *(grub_uint64_t *) (table_item + 1); - goto signature_found; - } - if (hook (table_item, hook_data)) - return 1; - } + if (grub_linuxbios_check_signature (table_header)) + return table_header; return 0; } diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c index 25e64a05c..129248c7f 100644 --- a/grub-core/term/i386/coreboot/cbmemc.c +++ b/grub-core/term/i386/coreboot/cbmemc.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include diff --git a/grub-core/video/i386/coreboot/cbfb.c b/grub-core/video/coreboot/cbfb.c similarity index 99% rename from grub-core/video/i386/coreboot/cbfb.c rename to grub-core/video/coreboot/cbfb.c index dede0c37e..9af81fa5b 100644 --- a/grub-core/video/i386/coreboot/cbfb.c +++ b/grub-core/video/coreboot/cbfb.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include struct grub_linuxbios_table_framebuffer *grub_video_coreboot_fbtable; diff --git a/include/grub/i386/coreboot/lbio.h b/include/grub/coreboot/lbio.h similarity index 93% rename from include/grub/i386/coreboot/lbio.h rename to include/grub/coreboot/lbio.h index 1c3fa6f19..5076d36c7 100644 --- a/include/grub/i386/coreboot/lbio.h +++ b/include/grub/coreboot/lbio.h @@ -20,6 +20,9 @@ #ifndef _GRUB_MACHINE_LBIO_HEADER #define _GRUB_MACHINE_LBIO_HEADER 1 +#include +#include + struct grub_linuxbios_table_header { grub_uint8_t signature[4]; @@ -102,4 +105,10 @@ EXPORT_FUNC(grub_linuxbios_table_iterate) (int (*hook) (grub_linuxbios_table_ite void *), void *hook_data); +grub_linuxbios_table_header_t +grub_linuxbios_get_tables (void); + +int +grub_linuxbios_check_signature (grub_linuxbios_table_header_t tbl_header); + #endif -- 2.13.3