+ load_size = highest_load - mld->link_base_addr;
+
+ if (mld->relocatable)
+ {
+ if (load_size > mld->max_addr || mld->min_addr > mld->max_addr - load_size)
+ return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load size");
+
+ err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
+ mld->min_addr, mld->max_addr - load_size,
+ load_size, mld->align ? mld->align : 1,
+ mld->preference, mld->avoid_efi_boot_services);
+ }
+ else
+ err = grub_relocator_alloc_chunk_addr (grub_multiboot_relocator, &ch,
+ mld->link_base_addr, load_size);
+
+ if (err)
+ {
+ grub_dprintf ("multiboot_loader", "Cannot allocate memory for OS image\n");
+ return err;
+ }
+
+ mld->load_base_addr = get_physical_target_address (ch);
+ source = get_virtual_current_address (ch);
+
+ grub_dprintf ("multiboot_loader", "link_base_addr=0x%x, load_base_addr=0x%x, "
+ "load_size=0x%x, relocatable=%d\n", mld->link_base_addr,
+ mld->load_base_addr, load_size, mld->relocatable);
+
+ if (mld->relocatable)
+ grub_dprintf ("multiboot_loader", "align=0x%lx, preference=0x%x, avoid_efi_boot_services=%d\n",
+ (long) mld->align, mld->preference, mld->avoid_efi_boot_services);