if (!fdt_addr)
pr_efi("Generating empty DTB\n");
- status = efi_load_initrd(image, &initrd_addr, &initrd_size,
+ status = efi_load_initrd(image, &initrd_addr, &initrd_size, ULONG_MAX,
efi_get_max_initrd_addr(dram_base, image_addr));
if (status != EFI_SUCCESS)
pr_efi_err("Failed initrd from command line!\n");
static efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
const efi_char16_t *optstr,
int optstr_size,
- unsigned long max_addr,
+ unsigned long soft_limit,
+ unsigned long hard_limit,
unsigned long *load_addr,
unsigned long *load_size)
{
round_up(alloc_size, EFI_ALLOC_ALIGN)) {
unsigned long old_addr = alloc_addr;
- status = efi_allocate_pages(alloc_size + size, &alloc_addr,
- max_addr);
+ status = EFI_OUT_OF_RESOURCES;
+ if (soft_limit < hard_limit)
+ status = efi_allocate_pages(alloc_size + size,
+ &alloc_addr,
+ soft_limit);
+ if (status == EFI_OUT_OF_RESOURCES)
+ status = efi_allocate_pages(alloc_size + size,
+ &alloc_addr,
+ hard_limit);
if (status != EFI_SUCCESS) {
pr_efi_err("Failed to reallocate memory for files\n");
goto err_close_file;
unsigned long *load_size)
{
return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
- ULONG_MAX, load_addr, load_size);
+ ULONG_MAX, ULONG_MAX, load_addr, load_size);
}
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
unsigned long *load_addr,
unsigned long *load_size,
- unsigned long max_addr)
+ unsigned long soft_limit,
+ unsigned long hard_limit)
{
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
- max_addr, load_addr, load_size);
+ soft_limit, hard_limit, load_addr, load_size);
}
goto fail2;
status = efi_load_initrd(image, &ramdisk_addr, &ramdisk_size,
- hdr->initrd_addr_max);
-
- if (status != EFI_SUCCESS &&
- hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G) {
- efi_printk("Trying to load files to higher address\n");
- status = efi_load_initrd(image, &ramdisk_addr, &ramdisk_size,
- ULONG_MAX);
- }
-
+ hdr->initrd_addr_max,
+ above4g ? ULONG_MAX : hdr->initrd_addr_max);
if (status != EFI_SUCCESS)
goto fail2;
hdr->ramdisk_image = ramdisk_addr & 0xffffffff;