diff options
Diffstat (limited to 'common/efi/payload')
-rw-r--r-- | common/efi/payload/Makefile | 6 | ||||
-rw-r--r-- | common/efi/payload/env-efi/network/eth0-discover | 5 | ||||
-rw-r--r-- | common/efi/payload/image.c | 283 | ||||
-rw-r--r-- | common/efi/payload/init.c | 387 | ||||
-rw-r--r-- | common/efi/payload/iomem.c | 179 |
5 files changed, 0 insertions, 860 deletions
diff --git a/common/efi/payload/Makefile b/common/efi/payload/Makefile deleted file mode 100644 index bcbdda335f..0000000000 --- a/common/efi/payload/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only - -obj-y += init.o -obj-y += image.o -bbenv-y += env-efi -obj-$(CONFIG_CMD_IOMEM) += iomem.o diff --git a/common/efi/payload/env-efi/network/eth0-discover b/common/efi/payload/env-efi/network/eth0-discover deleted file mode 100644 index 62c31a553c..0000000000 --- a/common/efi/payload/env-efi/network/eth0-discover +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -for i in /boot/network-drivers/*; do - $i; -done diff --git a/common/efi/payload/image.c b/common/efi/payload/image.c deleted file mode 100644 index e63da9ddf0..0000000000 --- a/common/efi/payload/image.c +++ /dev/null @@ -1,283 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * image.c - barebox EFI payload support - * - * Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix - */ - -#include <clock.h> -#include <common.h> -#include <linux/sizes.h> -#include <memory.h> -#include <command.h> -#include <magicvar.h> -#include <init.h> -#include <driver.h> -#include <io.h> -#include <efi.h> -#include <malloc.h> -#include <string.h> -#include <linux/err.h> -#include <boot.h> -#include <bootm.h> -#include <fs.h> -#include <libfile.h> -#include <binfmt.h> -#include <wchar.h> -#include <efi/efi-payload.h> -#include <efi/efi-device.h> - -struct linux_kernel_header { - /* first sector of the image */ - uint8_t code1[0x0020]; - uint16_t cl_magic; /**< Magic number 0xA33F */ - uint16_t cl_offset; /**< The offset of command line */ - uint8_t code2[0x01F1 - 0x0020 - 2 - 2]; - uint8_t setup_sects; /**< The size of the setup in sectors */ - uint16_t root_flags; /**< If the root is mounted readonly */ - uint16_t syssize; /**< obsolete */ - uint16_t swap_dev; /**< obsolete */ - uint16_t ram_size; /**< obsolete */ - uint16_t vid_mode; /**< Video mode control */ - uint16_t root_dev; /**< Default root device number */ - uint16_t boot_flag; /**< 0xAA55 magic number */ - - /* second sector of the image */ - uint16_t jump; /**< Jump instruction (this is code!) */ - uint32_t header; /**< Magic signature "HdrS" */ - uint16_t version; /**< Boot protocol version supported */ - uint32_t realmode_swtch; /**< Boot loader hook */ - uint16_t start_sys; /**< The load-low segment (obsolete) */ - uint16_t kernel_version; /**< Points to kernel version string */ - uint8_t type_of_loader; /**< Boot loader identifier */ - uint8_t loadflags; /**< Boot protocol option flags */ - uint16_t setup_move_size; /**< Move to high memory size */ - uint32_t code32_start; /**< Boot loader hook */ - uint32_t ramdisk_image; /**< initrd load address */ - uint32_t ramdisk_size; /**< initrd size */ - uint32_t bootsect_kludge; /**< obsolete */ - uint16_t heap_end_ptr; /**< Free memory after setup end */ - uint8_t ext_loader_ver; /**< boot loader's extension of the version number */ - uint8_t ext_loader_type; /**< boot loader's extension of its type */ - uint32_t cmd_line_ptr; /**< Points to the kernel command line */ - uint32_t initrd_addr_max; /**< Highest address for initrd */ - uint32_t kernel_alignment; /**< Alignment unit required by the kernel */ - uint8_t relocatable_kernel; /** */ - uint8_t min_alignment; /** */ - uint16_t xloadflags; /** */ - uint32_t cmdline_size; /** */ - uint32_t hardware_subarch; /** */ - uint64_t hardware_subarch_data; /** */ - uint32_t payload_offset; /** */ - uint32_t payload_length; /** */ - uint64_t setup_data; /** */ - uint64_t pref_address; /** */ - uint32_t init_size; /** */ - uint32_t handover_offset; /** */ -} __attribute__ ((packed)); - -static int efi_load_image(const char *file, efi_loaded_image_t **loaded_image, - efi_handle_t *h) -{ - void *exe; - size_t size; - efi_handle_t handle; - efi_status_t efiret = EFI_SUCCESS; - - exe = read_file(file, &size); - if (!exe) - return -EINVAL; - - efiret = BS->load_image(false, efi_parent_image, efi_device_path, exe, size, - &handle); - if (EFI_ERROR(efiret)) { - pr_err("failed to LoadImage: %s\n", efi_strerror(efiret)); - goto out; - }; - - efiret = BS->open_protocol(handle, &efi_loaded_image_protocol_guid, - (void **)loaded_image, - efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (EFI_ERROR(efiret)) { - pr_err("failed to OpenProtocol: %s\n", efi_strerror(efiret)); - BS->unload_image(handle); - goto out; - } - - *h = handle; -out: - free(exe); - return -efi_errno(efiret); -} - -static int efi_execute_image(const char *file) -{ - efi_handle_t handle; - efi_loaded_image_t *loaded_image; - efi_status_t efiret; - struct linux_kernel_header *image_header; - const char *options; - bool is_driver; - int ret; - - ret = efi_load_image(file, &loaded_image, &handle); - if (ret) - return ret; - - is_driver = (loaded_image->image_code_type == EFI_BOOT_SERVICES_CODE) || - (loaded_image->image_code_type == EFI_RUNTIME_SERVICES_CODE); - - image_header = (struct linux_kernel_header *)loaded_image->image_base; - if (image_header->boot_flag == 0xAA55 && - image_header->header == 0x53726448) { - pr_debug("Linux kernel detected. Adding bootargs."); - options = linux_bootargs_get(); - pr_err("add linux options '%s'\n", options); - loaded_image->load_options = xstrdup_char_to_wchar(options); - loaded_image->load_options_size = - (strlen(options) + 1) * sizeof(wchar_t); - shutdown_barebox(); - } - - efi_pause_devices(); - - efiret = BS->start_image(handle, NULL, NULL); - if (EFI_ERROR(efiret)) - pr_err("failed to StartImage: %s\n", efi_strerror(efiret)); - - efi_continue_devices(); - - if (!is_driver) - BS->unload_image(handle); - - efi_connect_all(); - efi_register_devices(); - - return -efi_errno(efiret); -} - -#ifdef __x86_64__ -typedef void(*handover_fn)(void *image, efi_system_table_t *table, - struct linux_kernel_header *header); - -static inline void linux_efi_handover(efi_handle_t handle, - struct linux_kernel_header *header) -{ - handover_fn handover; - - handover = (handover_fn)((long)header->code32_start + 512 + - header->handover_offset); - handover(handle, efi_sys_table, header); -} -#else -typedef void(*handover_fn)(VOID *image, EFI_SYSTEM_TABLE *table, - struct SetupHeader *setup) __attribute__((regparm(0))); - -static inline void linux_efi_handover(efi_handle_t handle, - struct linux_kernel_header *header) -{ - handover_fn handover; - - handover = (handover_fn)((long)header->code32_start + - header->handover_offset); - handover(handle, efi_sys_table, header); -} -#endif - -static int do_bootm_efi(struct image_data *data) -{ - void *tmp; - void *initrd = NULL; - size_t size; - efi_handle_t handle; - int ret; - const char *options; - efi_loaded_image_t *loaded_image; - struct linux_kernel_header *image_header, *boot_header; - - ret = efi_load_image(data->os_file, &loaded_image, &handle); - if (ret) - return ret; - - image_header = (struct linux_kernel_header *)loaded_image->image_base; - - if (image_header->boot_flag != 0xAA55 || - image_header->header != 0x53726448 || - image_header->version < 0x20b || - !image_header->relocatable_kernel) { - pr_err("Not a valid kernel image!\n"); - BS->unload_image(handle); - return -EINVAL; - } - - boot_header = xmalloc(0x4000); - memset(boot_header, 0, 0x4000); - memcpy(boot_header, image_header, sizeof(*image_header)); - - boot_header->type_of_loader = 0xff; - - if (data->initrd_file) { - tmp = read_file(data->initrd_file, &size); - initrd = xmemalign(PAGE_SIZE, PAGE_ALIGN(size)); - memcpy(initrd, tmp, size); - memset(initrd + size, 0, PAGE_ALIGN(size) - size); - free(tmp); - boot_header->ramdisk_image = (uint64_t)initrd; - boot_header->ramdisk_size = PAGE_ALIGN(size); - } - - options = linux_bootargs_get(); - boot_header->cmd_line_ptr = (uint64_t)options; - boot_header->cmdline_size = strlen(options); - - boot_header->code32_start = (uint64_t)loaded_image->image_base + - (image_header->setup_sects+1) * 512; - - if (bootm_verbose(data)) { - printf("\nStarting kernel at 0x%p", loaded_image->image_base); - if (data->initrd_file) - printf(", initrd at 0x%08x", - boot_header->ramdisk_image); - printf("...\n"); - } - - if (data->dryrun) { - BS->unload_image(handle); - free(boot_header); - free(initrd); - return 0; - } - - efi_set_variable_usec("LoaderTimeExecUSec", &efi_systemd_vendor_guid, - get_time_ns()/1000); - - shutdown_barebox(); - linux_efi_handover(handle, boot_header); - - return 0; -} - -static struct image_handler efi_handle_tr = { - .name = "EFI Application", - .bootm = do_bootm_efi, - .filetype = filetype_exe, -}; - -static int efi_execute(struct binfmt_hook *b, char *file, int argc, char **argv) -{ - return efi_execute_image(file); -} - -static struct binfmt_hook binfmt_efi_hook = { - .type = filetype_exe, - .hook = efi_execute, -}; - -static int efi_register_image_handler(void) -{ - register_image_handler(&efi_handle_tr); - binfmt_register(&binfmt_efi_hook); - - return 0; -} -late_initcall(efi_register_image_handler); diff --git a/common/efi/payload/init.c b/common/efi/payload/init.c deleted file mode 100644 index 6976285fb3..0000000000 --- a/common/efi/payload/init.c +++ /dev/null @@ -1,387 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * init.c - barebox EFI payload support - * - * Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix - */ - -#ifdef CONFIG_DEBUG_LL -#define DEBUG -#endif - -#include <linux/linkage.h> -#include <common.h> -#include <linux/sizes.h> -#include <memory.h> -#include <clock.h> -#include <command.h> -#include <magicvar.h> -#include <init.h> -#include <restart.h> -#include <poweroff.h> -#include <driver.h> -#include <platform_data/serial-ns16550.h> -#include <io.h> -#include <efi.h> -#include <malloc.h> -#include <string.h> -#include <linux/err.h> -#include <boot.h> -#include <fs.h> -#include <binfmt.h> -#include <wchar.h> -#include <envfs.h> -#include <efi/efi-payload.h> -#include <efi/efi-device.h> -#include <libfile.h> -#include <state.h> -#include <bbu.h> - -efi_runtime_services_t *RT; -efi_boot_services_t *BS; -efi_system_table_t *efi_sys_table; -efi_handle_t efi_parent_image; -struct efi_device_path *efi_device_path; -efi_loaded_image_t *efi_loaded_image; - -void *efi_get_variable(char *name, efi_guid_t *vendor, int *var_size) -{ - efi_status_t efiret; - void *buf; - unsigned long size = 0; - s16 *name16 = xstrdup_char_to_wchar(name); - - efiret = RT->get_variable(name16, vendor, NULL, &size, NULL); - - if (EFI_ERROR(efiret) && efiret != EFI_BUFFER_TOO_SMALL) { - buf = ERR_PTR(-efi_errno(efiret)); - goto out; - } - - buf = malloc(size); - if (!buf) { - buf = ERR_PTR(-ENOMEM); - goto out; - } - - efiret = RT->get_variable(name16, vendor, NULL, &size, buf); - if (EFI_ERROR(efiret)) { - free(buf); - buf = ERR_PTR(-efi_errno(efiret)); - goto out; - } - - if (var_size) - *var_size = size; - -out: - free(name16); - - return buf; -} - -int efi_set_variable(char *name, efi_guid_t *vendor, uint32_t attributes, - void *buf, unsigned long size) -{ - efi_status_t efiret = EFI_SUCCESS; - s16 *name16 = xstrdup_char_to_wchar(name); - - efiret = RT->set_variable(name16, vendor, attributes, size, buf); - - free(name16); - - return -efi_errno(efiret); -} - -int efi_set_variable_usec(char *name, efi_guid_t *vendor, uint64_t usec) -{ - char buf[20]; - wchar_t buf16[40]; - - snprintf(buf, sizeof(buf), "%lld", usec); - strcpy_char_to_wchar(buf16, buf); - - return efi_set_variable(name, vendor, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, buf16, - (strlen(buf)+1) * sizeof(wchar_t)); -} - -struct efi_boot { - u32 attributes; - u16 file_path_len; - char *description; - struct efi_device_path *path; - void *binary; -}; - -static struct efi_boot *efi_get_boot(int num) -{ - struct efi_boot *boot = xzalloc(sizeof(*boot)); - void *buf, *ptr; - int size; - char *name; - - name = xasprintf("Boot%04X", num); - - buf = efi_get_global_var(name, &size); - - free(name); - - if (IS_ERR(buf)) { - free(boot); - return NULL; - } - - ptr = buf; - - boot->attributes = *(u32 *)ptr; - - ptr += sizeof(u32); - - boot->file_path_len = *(u16 *)ptr; - - ptr += sizeof(u16); - - boot->description = xstrdup_wchar_to_char(ptr); - - ptr += (strlen(boot->description) + 1) * 2; - - printf("description: %s\n", boot->description); - - boot->path = memdup(ptr, boot->file_path_len); - - printf("path: %s\n", device_path_to_str(boot->path)); - - return boot; -} - -static int misc_init(void) -{ - efi_get_boot(1); - efi_get_boot(2); - efi_get_boot(3); - - return 0; -} -late_initcall(misc_init); - -static struct NS16550_plat ns16550_plat = { - .clock = 115200 * 16, -}; - -static int efi_console_init(void) -{ - barebox_set_model("barebox EFI payload"); - - add_generic_device("efi-stdio", DEVICE_ID_SINGLE, NULL, 0 , 0, 0, NULL); - - add_ns16550_device(0, 0x3f8, 0x10, IORESOURCE_IO | IORESOURCE_MEM_8BIT, - &ns16550_plat); - - return 0; -} -console_initcall(efi_console_init); - -static void __noreturn efi_restart_system(struct restart_handler *rst) -{ - RT->reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, NULL); - - hang(); -} - -static void __noreturn efi_poweroff_system(struct poweroff_handler *handler) -{ - shutdown_barebox(); - RT->reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); - - hang(); -} - -static int restart_register_feature(void) -{ - restart_handler_register_fn("efi", efi_restart_system); - poweroff_handler_register_fn(efi_poweroff_system); - - return 0; -} -coredevice_initcall(restart_register_feature); - -extern char image_base[]; -extern initcall_t __barebox_initcalls_start[], __barebox_early_initcalls_end[], - __barebox_initcalls_end[]; - -static int efi_init(void) -{ - char *env; - - defaultenv_append_directory(env_efi); - - env = xasprintf("/efivars/barebox-env-%pUl", &efi_barebox_vendor_guid); - default_environment_path_set(env); - - return 0; -} -device_initcall(efi_init); - -/** - * efi-main - Entry point for EFI images - */ -void efi_main(efi_handle_t image, efi_system_table_t *sys_table) -{ - efi_physical_addr_t mem; - size_t memsize; - efi_status_t efiret; - -#ifdef DEBUG - sys_table->con_out->output_string(sys_table->con_out, L"barebox\n"); -#endif - - BS = sys_table->boottime; - - efi_parent_image = image; - efi_sys_table = sys_table; - RT = sys_table->runtime; - - efiret = BS->open_protocol(efi_parent_image, &efi_loaded_image_protocol_guid, - (void **)&efi_loaded_image, - efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (!EFI_ERROR(efiret)) - BS->handle_protocol(efi_loaded_image->device_handle, - &efi_device_path_protocol_guid, (void **)&efi_device_path); - - mem = 0x3fffffff; - for (memsize = SZ_256M; memsize >= SZ_8M; memsize /= 2) { - efiret = BS->allocate_pages(EFI_ALLOCATE_MAX_ADDRESS, - EFI_LOADER_DATA, - memsize/PAGE_SIZE, &mem); - if (!EFI_ERROR(efiret)) - break; - if (efiret != EFI_OUT_OF_RESOURCES) - panic("failed to allocate malloc pool: %s\n", - efi_strerror(efiret)); - } - if (EFI_ERROR(efiret)) - panic("failed to allocate malloc pool: %s\n", - efi_strerror(efiret)); - mem_malloc_init((void *)mem, (void *)mem + memsize - 1); - - start_barebox(); -} - -static int efi_core_init(void) -{ - struct device_d *dev; - int ret; - - dev = device_alloc("efi-cs", DEVICE_ID_SINGLE); - ret = platform_device_register(dev); - if (ret) - return ret; - - dev = device_alloc("efi-wdt", DEVICE_ID_SINGLE); - return platform_device_register(dev); -} -core_initcall(efi_core_init); - -static int efi_postcore_init(void) -{ - char *uuid; - - efi_set_variable_usec("LoaderTimeInitUSec", &efi_systemd_vendor_guid, - get_time_ns()/1000); - - uuid = device_path_to_partuuid(device_path_from_handle( - efi_loaded_image->device_handle)); - if (uuid) { - wchar_t *uuid16 = xstrdup_char_to_wchar(uuid); - efi_set_variable("LoaderDevicePartUUID", - &efi_systemd_vendor_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - uuid16, (strlen(uuid)+1) * sizeof(wchar_t)); - free(uuid); - free(uuid16); - } - - bbu_register_std_file_update("fat", 0, "/boot/EFI/BOOT/BOOTx64.EFI", - filetype_exe); - - return 0; -} -postcore_initcall(efi_postcore_init); - -static int efi_late_init(void) -{ - char *state_desc; - int ret; - - if (!IS_ENABLED(CONFIG_STATE)) - return 0; - - state_desc = xasprintf("/boot/EFI/barebox/state.dtb"); - - if (state_desc) { - void *fdt; - size_t size; - struct device_node *root = NULL; - struct device_node *np = NULL; - struct state *state; - - fdt = read_file(state_desc, &size); - if (!fdt) { - pr_err("unable to read %s: %s\n", state_desc, - strerror(errno)); - return -errno; - } - - if (file_detect_type(fdt, size) != filetype_oftree) { - pr_err("%s is not an oftree file.\n", state_desc); - free(fdt); - return -EINVAL; - } - - root = of_unflatten_dtb(fdt, size); - - free(fdt); - - if (IS_ERR(root)) - return PTR_ERR(root); - - ret = barebox_register_of(root); - if (ret) - pr_warn("Failed to register device-tree: %pe\n", ERR_PTR(ret)); - - np = of_find_node_by_alias(root, "state"); - - state = state_new_from_node(np, false); - if (IS_ERR(state)) - return PTR_ERR(state); - - ret = state_load(state); - if (ret != -ENOMEDIUM) - pr_warn("Failed to load persistent state, continuing with defaults, %d\n", - ret); - - return 0; - } - - return 0; -} -late_initcall(efi_late_init); - -static int do_efiexit(int argc, char *argv[]) -{ - return BS->exit(efi_parent_image, EFI_SUCCESS, 0, NULL); -} - -BAREBOX_CMD_HELP_START(efiexit) -BAREBOX_CMD_HELP_TEXT("Leave barebox and return to the calling EFI process\n") -BAREBOX_CMD_HELP_END - -BAREBOX_CMD_START(efiexit) - .cmd = do_efiexit, - BAREBOX_CMD_DESC("Usage: efiexit") - BAREBOX_CMD_GROUP(CMD_GRP_MISC) - BAREBOX_CMD_HELP(cmd_efiexit_help) -BAREBOX_CMD_END diff --git a/common/efi/payload/iomem.c b/common/efi/payload/iomem.c deleted file mode 100644 index 6b92ca993a..0000000000 --- a/common/efi/payload/iomem.c +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2019 Ahmad Fatoum, Pengutronix - -#define pr_fmt(fmt) "efi-iomem: " fmt - -#include <common.h> -#include <init.h> -#include <efi.h> -#include <efi/efi-payload.h> -#include <memory.h> -#include <linux/sizes.h> - -static int efi_parse_mmap(struct efi_memory_desc *desc, bool verbose) -{ - struct resource *res; - u32 flags; - const char *name; - char *fullname; - resource_size_t va_base, va_size; - int ret = 0; - - va_size = desc->npages * SZ_4K; - if (!va_size) - return 0; - - /* XXX At least OVMF doesn't populate ->virt_start and leaves it at zero - * for all mapping. Thus assume a 1:1 mapping and ignore virt_start - */ - va_base = desc->phys_start; - - switch (desc->type) { - case EFI_RESERVED_TYPE: - if (verbose) - return 0; - name = "reserved"; - flags = IORESOURCE_MEM | IORESOURCE_DISABLED; - break; - case EFI_LOADER_CODE: - name = "loader code"; - flags = IORESOURCE_MEM | IORESOURCE_READONLY; - break; - case EFI_LOADER_DATA: - name = "loader data"; - flags = IORESOURCE_MEM; - break; - case EFI_BOOT_SERVICES_CODE: - if (!verbose) - return 0; - name = "boot services code"; - flags = IORESOURCE_MEM | IORESOURCE_READONLY; - break; - case EFI_BOOT_SERVICES_DATA: - if (!verbose) - return 0; - name = "boot services data"; - flags = IORESOURCE_MEM; - break; - case EFI_RUNTIME_SERVICES_CODE: - if (!verbose) - return 0; - name = "runtime services code"; - flags = IORESOURCE_MEM | IORESOURCE_READONLY; - break; - case EFI_RUNTIME_SERVICES_DATA: - if (!verbose) - return 0; - name = "runtime services data"; - flags = IORESOURCE_MEM; - break; - case EFI_CONVENTIONAL_MEMORY: - if (!verbose) - return 0; - name = "conventional memory"; - flags = IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_CACHEABLE; - break; - case EFI_UNUSABLE_MEMORY: - if (!verbose) - return 0; - name = "unusable"; - flags = IORESOURCE_MEM | IORESOURCE_DISABLED; - break; - case EFI_ACPI_RECLAIM_MEMORY: - if (!verbose) - return 0; - name = "ACPI reclaim memory"; - flags = IORESOURCE_MEM | IORESOURCE_READONLY; - break; - case EFI_ACPI_MEMORY_NVS: - if (!verbose) - return 0; - name = "ACPI NVS memory"; - flags = IORESOURCE_MEM | IORESOURCE_READONLY; - break; - case EFI_MEMORY_MAPPED_IO: - if (!verbose) - return 0; - name = "MMIO"; - flags = IORESOURCE_MEM; - break; - case EFI_MEMORY_MAPPED_IO_PORT_SPACE: - if (!verbose) - return 0; - name = "MMIOPORT"; - flags = IORESOURCE_IO; - break; - case EFI_PAL_CODE: - if (!verbose) - return 0; - name = "PAL code"; - flags = IORESOURCE_MEM | IORESOURCE_ROM_BIOS_COPY; - break; - default: - if (!(desc->type & (1U << 31))) { - pr_warn("illegal memory type = %u >= %u\n", - desc->type, EFI_MAX_MEMORY_TYPE); - return -EINVAL; - } - - if (!verbose) - return 0; - - name = "vendor reserved"; - flags = IORESOURCE_MEM | IORESOURCE_ROM_BIOS_COPY; - } - - fullname = xasprintf("%s@%llx", name, desc->phys_start); - - pr_debug("%s: (0x%llx+0x%llx)\n", fullname, va_base, va_size); - - res = request_iomem_region(fullname, va_base, va_base + va_size - 1); - if (IS_ERR(res)) { - ret = PTR_ERR(res); - goto out; - } - - res->flags |= flags; - -out: - free(fullname); - return ret; -} - -static int efi_barebox_populate_mmap(void) -{ - void *desc; - u8 *mmap_buf = NULL; - efi_status_t efiret; - size_t mmap_size; - size_t mapkey; - size_t descsz; - u32 descver; - int ret = 0; - - mmap_size = sizeof(struct efi_memory_desc); - - do { - mmap_buf = xrealloc(mmap_buf, mmap_size); - efiret = BS->get_memory_map(&mmap_size, mmap_buf, - &mapkey, &descsz, &descver); - } while (efiret == EFI_BUFFER_TOO_SMALL); - - if (EFI_ERROR(efiret)) { - ret = -efi_errno(efiret); - goto out; - } - - if (descver != 1) { - ret = -ENOSYS; - goto out; - } - - for (desc = mmap_buf; (u8 *)desc < mmap_buf + mmap_size; desc += descsz) - efi_parse_mmap(desc, __is_defined(DEBUG)); - -out: - free(mmap_buf); - return ret; -} -mem_initcall(efi_barebox_populate_mmap); |