efi_loader: export efi_install_fdt()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 8 Dec 2019 00:07:01 +0000 (01:07 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 7 Jan 2020 17:08:20 +0000 (18:08 +0100)
Use a pointer to addressable memory instead of a "physical" address in the
virtual address space of the sandbox to efi_install_fdt().

Export the efi_install_fdt() function.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/bootefi.c
include/efi_loader.h

index 15b4ff95159220f31f6942b5835b6d372da3f07f..78c8b8dbd166ce3bac91910d0efe797257679ef2 100644 (file)
@@ -212,24 +212,24 @@ static void *get_config_table(const efi_guid_t *guid)
  *             the environment variable fdtcontroladdr
  * Return:     status code
  */
-static efi_status_t efi_install_fdt(uintptr_t fdt_addr)
+efi_status_t efi_install_fdt(void *fdt)
 {
        /*
         * The EBBR spec requires that we have either an FDT or an ACPI table
         * but not both.
         */
 #if CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
-       if (fdt_addr) {
+       if (fdt) {
                printf("ERROR: can't have ACPI table and device tree.\n");
                return EFI_LOAD_ERROR;
        }
 #else
-       void *fdt;
        bootm_headers_t img = { 0 };
        efi_status_t ret;
 
-       if (fdt_addr == EFI_FDT_USE_INTERNAL) {
+       if (fdt == EFI_FDT_USE_INTERNAL) {
                const char *fdt_opt;
+               uintptr_t fdt_addr;
 
                /* Look for device tree that is already installed */
                if (get_config_table(&efi_guid_fdt))
@@ -249,10 +249,10 @@ static efi_status_t efi_install_fdt(uintptr_t fdt_addr)
                        printf("ERROR: invalid $fdt_addr or $fdtcontroladdr\n");
                        return EFI_LOAD_ERROR;
                }
+               fdt = map_sysmem(fdt_addr, 0);
        }
 
        /* Install device tree */
-       fdt = map_sysmem(fdt_addr, 0);
        if (fdt_check_header(fdt)) {
                printf("ERROR: invalid device tree\n");
                return EFI_LOAD_ERROR;
@@ -574,7 +574,7 @@ static int do_efi_selftest(void)
 static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        efi_status_t ret;
-       uintptr_t fdt_addr;
+       void *fdt;
 
        if (argc < 2)
                return CMD_RET_USAGE;
@@ -587,11 +587,15 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_FAILURE;
        }
 
-       if (argc > 2)
+       if (argc > 2) {
+               uintptr_t fdt_addr;
+
                fdt_addr = simple_strtoul(argv[2], NULL, 16);
-       else
-               fdt_addr = EFI_FDT_USE_INTERNAL;
-       ret = efi_install_fdt(fdt_addr);
+               fdt = map_sysmem(fdt_addr, 0);
+       } else {
+               fdt = EFI_FDT_USE_INTERNAL;
+       }
+       ret = efi_install_fdt(fdt);
        if (ret == EFI_INVALID_PARAMETER)
                return CMD_RET_USAGE;
        else if (ret != EFI_SUCCESS)
index 1e1fe52bc0fbe5bd717010391fd63a4be38df305..4d401f69d753f83191d26a55dbf49761b0263837 100644 (file)
@@ -35,7 +35,7 @@ static inline int guidcmp(const void *g1, const void *g2)
                 0x9a, 0xab, 0x3a, 0x7d, 0xbf, 0x40, 0xc4, 0x82)
 
 /* Use internal device tree when starting UEFI application */
-#define EFI_FDT_USE_INTERNAL 0UL
+#define EFI_FDT_USE_INTERNAL NULL
 
 /* Root node */
 extern efi_handle_t efi_root;
@@ -341,6 +341,8 @@ extern struct list_head efi_register_notify_events;
 
 /* Initialize efi execution environment */
 efi_status_t efi_init_obj_list(void);
+/* Install device tree */
+efi_status_t efi_install_fdt(void *fdt);
 /* Run loaded UEFI image */
 efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size);
 /* Initialize variable services */