diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/arm/armv7/bootblock_simple.c | 3 | ||||
-rw-r--r-- | src/arch/arm64/arm_tf.c | 48 | ||||
-rw-r--r-- | src/arch/riscv/rom_media.c | 67 | ||||
-rw-r--r-- | src/arch/x86/boot/acpi.c | 3 | ||||
-rw-r--r-- | src/arch/x86/lib/Makefile.inc | 3 | ||||
-rw-r--r-- | src/arch/x86/lib/mmap_boot.c | 44 | ||||
-rw-r--r-- | src/arch/x86/lib/rom_media.c | 97 |
7 files changed, 58 insertions, 207 deletions
diff --git a/src/arch/arm/armv7/bootblock_simple.c b/src/arch/arm/armv7/bootblock_simple.c index 903c24d819..4dc0975e22 100644 --- a/src/arch/arm/armv7/bootblock_simple.c +++ b/src/arch/arm/armv7/bootblock_simple.c @@ -21,7 +21,6 @@ #include <arch/exception.h> #include <arch/stages.h> #include <bootblock_common.h> -#include <cbfs.h> #include <console/console.h> #include <delay.h> #include <program_loading.h> @@ -45,8 +44,6 @@ void main(void) exception_init(); #endif - cbfs_set_header_offset(0); - bootblock_soc_init(); bootblock_mainboard_init(); diff --git a/src/arch/arm64/arm_tf.c b/src/arch/arm64/arm_tf.c index 1bdf522a2c..3e0892ec34 100644 --- a/src/arch/arm64/arm_tf.c +++ b/src/arch/arm64/arm_tf.c @@ -22,7 +22,7 @@ #include <assert.h> #include <cbfs.h> #include <cbmem.h> -#include <vendorcode/google/chromeos/vboot_handoff.h> +#include <program_loading.h> /* * TODO: Many of these structures are currently unused. Better not fill them out @@ -37,34 +37,6 @@ static entry_point_info_t bl32_ep_info; static entry_point_info_t bl33_ep_info; static bl31_params_t bl31_params; -/* TODO: Replace with glorious new CBFSv1 solution when it's available. */ -static void *vboot_get_bl31(void) -{ - void *bl31_entry; - struct cbfs_media *media; - struct firmware_component *component; - struct vboot_handoff *handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF); - - if (!handoff) - return NULL; - - assert(CONFIG_VBOOT_BL31_INDEX < MAX_PARSED_FW_COMPONENTS); - component = &handoff->components[CONFIG_VBOOT_BL31_INDEX]; - - /* components[] is zeroed out before filling, so size == 0 -> missing */ - if (!component->size) - return NULL; - - init_default_cbfs_media(media); - bl31_entry = cbfs_load_stage_by_offset(media, component->address); - if (bl31_entry == CBFS_LOAD_ERROR) - return NULL; - - printk(BIOS_INFO, "Loaded %u bytes verified BL31 from %#.8x to EP %p\n", - component->size, component->address, bl31_entry); - return bl31_entry; -} - void __attribute__((weak)) *soc_get_bl31_plat_params(bl31_params_t *params) { /* Default weak implementation. */ @@ -73,17 +45,19 @@ void __attribute__((weak)) *soc_get_bl31_plat_params(bl31_params_t *params) void arm_tf_run_bl31(u64 payload_entry, u64 payload_arg0, u64 payload_spsr) { - const char *bl31_filename = CONFIG_CBFS_PREFIX"/bl31"; + struct prog bl31 = { + .type = PROG_BL31, + .name = CONFIG_CBFS_PREFIX"/bl31", + }; void (*bl31_entry)(bl31_params_t *params, void *plat_params) = NULL; - if (IS_ENABLED(CONFIG_VBOOT2_VERIFY_FIRMWARE)) - bl31_entry = vboot_get_bl31(); + if (prog_locate(&bl31)) + die("BL31 not found"); + + if (cbfs_prog_stage_load(&bl31)) + die("BL31 load failed"); - if (!bl31_entry) { - bl31_entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, bl31_filename); - if (bl31_entry == CBFS_LOAD_ERROR) - die("BL31 not found in CBFS"); - } + bl31_entry = prog_entry(&bl31); SET_PARAM_HEAD(&bl31_params, PARAM_BL31, VERSION_1, 0); bl31_params.bl33_ep_info = &bl33_ep_info; diff --git a/src/arch/riscv/rom_media.c b/src/arch/riscv/rom_media.c index f18030c49f..dd57849db4 100644 --- a/src/arch/riscv/rom_media.c +++ b/src/arch/riscv/rom_media.c @@ -18,76 +18,13 @@ * Foundation, Inc. */ #include <boot_device.h> -#include <cbfs.h> -#include <console/console.h> -#include <string.h> /* This assumes that the CBFS resides at 0x0, which is true for the default * configuration. */ -static const struct mem_region_device gboot_dev = +static const struct mem_region_device boot_dev = MEM_REGION_DEV_INIT(NULL, CONFIG_ROM_SIZE); const struct region_device *boot_device_ro(void) { - return &gboot_dev.rdev; -} - -static int rom_media_open(struct cbfs_media *media) { - return 0; -} - -static void *rom_media_map(struct cbfs_media *media, size_t offset, size_t count) { - const struct region_device *boot_dev; - void *ptr; - - printk(BIOS_INFO, "%s: media %p, offset %lx, size %ld.\n", __func__, media, offset, count); - boot_dev = media->context; - - ptr = rdev_mmap(boot_dev, offset, count); - - if (ptr == NULL) - return (void *)-1; - - return ptr; -} - -static void *rom_media_unmap(struct cbfs_media *media, const void *address) { - const struct region_device *boot_dev; - - boot_dev = media->context; - - rdev_munmap(boot_dev, (void *)address); - - return NULL; -} - -static size_t rom_media_read(struct cbfs_media *media, void *dest, size_t offset, - size_t count) { - const struct region_device *boot_dev; - - boot_dev = media->context; - - if (rdev_readat(boot_dev, dest, offset, count) < 0) - return 0; - - return count; -} - -static int rom_media_close(struct cbfs_media *media) { - return 0; -} - -static int init_rom_media_cbfs(struct cbfs_media *media) { - boot_device_init(); - media->context = (void *)boot_device_ro(); - media->open = rom_media_open; - media->close = rom_media_close; - media->map = rom_media_map; - media->unmap = rom_media_unmap; - media->read = rom_media_read; - return 0; -} - -int init_default_cbfs_media(struct cbfs_media *media) { - return init_rom_media_cbfs(media); + return &boot_dev.rdev; } diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c index 4ce5ed6036..bfdb18fbf8 100644 --- a/src/arch/x86/boot/acpi.c +++ b/src/arch/x86/boot/acpi.c @@ -759,8 +759,7 @@ unsigned long write_acpi_tables(unsigned long start) if (fw) return fw; - slic_file = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, - CONFIG_CBFS_PREFIX "/slic", + slic_file = cbfs_boot_map_with_leak(CONFIG_CBFS_PREFIX "/slic", CBFS_TYPE_RAW, &slic_size); if (slic_file && (slic_file->length > slic_size diff --git a/src/arch/x86/lib/Makefile.inc b/src/arch/x86/lib/Makefile.inc index e308be91bc..0d88a6daea 100644 --- a/src/arch/x86/lib/Makefile.inc +++ b/src/arch/x86/lib/Makefile.inc @@ -5,7 +5,6 @@ romstage-y += cbfs_and_run.c romstage-y += memset.c romstage-y += memcpy.c romstage-y += memmove.c -romstage-y += rom_media.c romstage-y += mmap_boot.c endif # CONFIG_ARCH_ROMSTAGE_X86_32 @@ -22,7 +21,6 @@ ramstage-y += memset.c ramstage-y += memcpy.c ramstage-y += memmove.c ramstage-y += ebda.c -ramstage-y += rom_media.c ramstage-y += mmap_boot.c ramstage-$(CONFIG_COOP_MULTITASKING) += thread.c ramstage-$(CONFIG_COOP_MULTITASKING) += thread_switch.S @@ -33,7 +31,6 @@ romstage-$(CONFIG_COLLECT_TIMESTAMPS) += timestamp.c smm-y += memset.c smm-y += memcpy.c smm-y += memmove.c -smm-y += rom_media.c smm-y += mmap_boot.c rmodules_x86_32-y += memset.c diff --git a/src/arch/x86/lib/mmap_boot.c b/src/arch/x86/lib/mmap_boot.c index eb7b23e2b1..4dd269b772 100644 --- a/src/arch/x86/lib/mmap_boot.c +++ b/src/arch/x86/lib/mmap_boot.c @@ -18,6 +18,10 @@ */ #include <boot_device.h> +#include <console/console.h> +#include <cbfs.h> +#include <endian.h> +#include <stdlib.h> /* The ROM is memory mapped just below 4GiB. Form a pointer for the base. */ #define rom_base ((void *)(uintptr_t)(-(int32_t)CONFIG_ROM_SIZE)) @@ -29,3 +33,43 @@ const struct region_device *boot_device_ro(void) { return &boot_dev.rdev; } + +int cbfs_boot_region_properties(struct cbfs_props *props) +{ + struct cbfs_header header; + int32_t offset; + const struct region_device *bdev; + + bdev = boot_device_ro(); + + rdev_readat(bdev, &offset, CONFIG_ROM_SIZE - sizeof(offset), + sizeof(offset)); + + /* The offset is relative to the end of the media. */ + offset += CONFIG_ROM_SIZE; + + rdev_readat(bdev, &header , offset, sizeof(header)); + + header.magic = ntohl(header.magic); + header.romsize = ntohl(header.romsize); + header.bootblocksize = ntohl(header.bootblocksize); + header.align = ntohl(header.align); + header.offset = ntohl(header.offset); + + if (header.magic != CBFS_HEADER_MAGIC) + return -1; + + props->align = header.align; + props->offset = header.offset; + if (CONFIG_ROM_SIZE != header.romsize) + props->size = CONFIG_ROM_SIZE; + else + props->size = header.romsize; + props->size -= props->offset; + props->size -= header.bootblocksize; + props->size = ALIGN_DOWN(props->size, props->align); + + printk(BIOS_DEBUG, "CBFS @ %zx size %zx\n", props->offset, props->size); + + return 0; +} diff --git a/src/arch/x86/lib/rom_media.c b/src/arch/x86/lib/rom_media.c deleted file mode 100644 index d4663c7f60..0000000000 --- a/src/arch/x86/lib/rom_media.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * Copyright (C) 2013 The Chromium OS Authors. All rights reserved. - * - * This program 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; version 2 of - * the License. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc. - */ - -#include <boot_device.h> -#include <cbfs.h> -#include <string.h> - -#ifdef LIBPAYLOAD -# define printk(x...) -# define init_default_cbfs_media libpayload_init_default_cbfs_media - extern int libpayload_init_default_cbfs_media(struct cbfs_media *media); -#else -# include <console/console.h> -#endif - -// Implementation of memory-mapped ROM media source on X86. - -static int x86_rom_open(struct cbfs_media *media) { - return 0; -} - -static void *x86_rom_map(struct cbfs_media *media, size_t offset, size_t count) { - void *ptr; - const struct region_device *boot_dev; - - boot_dev = media->context; - - /* Extremely large offsets are considered relative to end of region. */ - if ((uint32_t)offset > (uint32_t)0xf0000000) - offset += region_device_sz(boot_dev); - - ptr = rdev_mmap(boot_dev, offset, count); - - if (ptr == NULL) - return (void *)-1; - - return ptr; -} - -static void *x86_rom_unmap(struct cbfs_media *media, const void *address) { - return NULL; -} - -static size_t x86_rom_read(struct cbfs_media *media, void *dest, size_t offset, - size_t count) { - void *ptr; - - ptr = x86_rom_map(media, offset, count); - - if (ptr == (void *)-1) - return 0; - - memcpy(dest, ptr, count); - x86_rom_unmap(media, ptr); - return count; -} - -static int x86_rom_close(struct cbfs_media *media) { - return 0; -} - -static int init_x86rom_cbfs_media(struct cbfs_media *media) { - boot_device_init(); - - media->context = (void *)boot_device_ro(); - - if (media->context == NULL) - return -1; - - media->open = x86_rom_open; - media->close = x86_rom_close; - media->map = x86_rom_map; - media->unmap = x86_rom_unmap; - media->read = x86_rom_read; - return 0; -} - -int init_default_cbfs_media(struct cbfs_media *media) { - return init_x86rom_cbfs_media(media); -} |