int image_setup_linux(bootm_headers_t *images) { ulong of_size = images->ft_len; char **of_flat_tree = &images->ft_addr; struct lmb *lmb = &images->lmb; int ret; if (IMAGE_ENABLE_OF_LIBFDT) boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree); if (IMAGE_BOOT_GET_CMDLINE) { ret = boot_get_cmdline(lmb, &images->cmdline_start, &images->cmdline_end); if (ret) { puts("ERROR with allocation of cmdline\n"); return ret; } } if (IMAGE_ENABLE_OF_LIBFDT) { ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size); if (ret) return ret; } if (IMAGE_ENABLE_OF_LIBFDT && of_size) { ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb); if (ret) return ret; } return 0; }
/* * Load an EFI payload into a newly allocated piece of memory, register all * EFI objects it would want to access and jump to it. */ static unsigned long do_bootefi_exec(void *efi) { ulong (*entry)(void *image_handle, struct efi_system_table *st); ulong fdt_pages, fdt_size, fdt_start, fdt_end; bootm_headers_t img = { 0 }; /* * gd lives in a fixed register which may get clobbered while we execute * the payload. So save it here and restore it on every callback entry */ efi_save_gd(); /* Update system table to point to our currently loaded FDT */ if (working_fdt) { /* Prepare fdt for payload */ if (image_setup_libfdt(&img, working_fdt, 0, NULL)) { printf("ERROR: Failed to process device tree\n"); return -EINVAL; } /* Link to it in the efi tables */ systab.tables[0].guid = EFI_FDT_GUID; systab.tables[0].table = working_fdt; systab.nr_tables = 1; /* And reserve the space in the memory map */ fdt_start = ((ulong)working_fdt) & ~EFI_PAGE_MASK; fdt_end = ((ulong)working_fdt) + fdt_totalsize(working_fdt); fdt_size = (fdt_end - fdt_start) + EFI_PAGE_MASK; fdt_pages = fdt_size >> EFI_PAGE_SHIFT; /* Give a bootloader the chance to modify the device tree */ fdt_pages += 2; efi_add_memory_map(fdt_start, fdt_pages, EFI_BOOT_SERVICES_DATA, true); } else {