From: Vladimir Serbinenko Date: Fri, 19 Feb 2016 15:47:36 +0000 (+0100) Subject: WIP2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ba6d40e8bbe4562465423fe7b846d1d914c20dea;p=thirdparty%2Fgrub.git WIP2 --- diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c index 6d12eb547..7f3ba3800 100644 --- a/util/grub-mkimagexx.c +++ b/util/grub-mkimagexx.c @@ -89,7 +89,8 @@ struct fixup_block_list static int is_relocatable (const struct grub_install_image_target_desc *image_target) { - return image_target->id == IMAGE_EFI || image_target->id == IMAGE_UBOOT; + return image_target->id == IMAGE_EFI || image_target->id == IMAGE_UBOOT + || (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_ARM); } #ifdef MKIMAGE_ELF32 @@ -291,7 +292,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc phdr->p_filesz = phdr->p_memsz = grub_host_to_target32 (*core_size - kernel_size); - if (image_target->id == IMAGE_COREBOOT) + if (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_386) target_addr_mods = GRUB_KERNEL_I386_COREBOOT_MODULES_ADDR; else target_addr_mods = ALIGN_UP (target_addr + kernel_size + bss_size @@ -1796,7 +1797,7 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, Platforms other than EFI and U-boot shouldn't have .bss in their binaries as we build with -Wl,-Ttext. */ - if (image_target->id != IMAGE_UBOOT) + if (image_target->id == IMAGE_EFI || !is_relocatable (image_target)) layout->kernel_size = layout->end; return section_addresses; @@ -1899,6 +1900,7 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, if (image_target->id == IMAGE_SPARC64_AOUT || image_target->id == IMAGE_SPARC64_RAW || image_target->id == IMAGE_UBOOT + || image_target->id == IMAGE_COREBOOT || image_target->id == IMAGE_SPARC64_CDCORE) layout->kernel_size = ALIGN_UP (layout->kernel_size, image_target->mod_align); @@ -1995,7 +1997,8 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, Platforms other than EFI and U-boot shouldn't have .bss in their binaries as we build with -Wl,-Ttext. */ - || (SUFFIX (is_bss_section) (s, image_target) && (image_target->id != IMAGE_UBOOT)) + || (SUFFIX (is_bss_section) (s, image_target) + && ((image_target->id == IMAGE_EFI) || !is_relocatable (image_target))) || SUFFIX (is_text_section) (s, image_target)) { if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS) diff --git a/util/mkimage.c b/util/mkimage.c index 06d28e7fe..134347ab1 100644 --- a/util/mkimage.c +++ b/util/mkimage.c @@ -531,6 +531,26 @@ static const struct grub_install_image_target_desc image_targets[] = .mod_align = GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN, .link_align = 4 }, + { + .dirname = "arm-coreboot", + .names = { "arm-coreboot", NULL }, + .voidp_sizeof = 4, + .bigendian = 0, + .id = IMAGE_COREBOOT, + .flags = PLATFORM_FLAGS_NONE, + .total_module_size = GRUB_KERNEL_ARM_COREBOOT_TOTAL_MODULE_SIZE, + .decompressor_compressed_size = TARGET_NO_FIELD, + .decompressor_uncompressed_size = TARGET_NO_FIELD, + .decompressor_uncompressed_addr = TARGET_NO_FIELD, + .section_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, + .vaddr_offset = 0, + .elf_target = EM_ARM, + .mod_gap = GRUB_KERNEL_ARM_COREBOOT_MOD_GAP, + .mod_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, + .link_align = 4, + /* FIXME: Remove once coreboot supports load to any address. */ + .link_addr = 0x60100000, + }, { .dirname = "arm-efi", .names = { "arm-efi", NULL }, @@ -1031,7 +1051,7 @@ grub_install_generate_image (const char *dir, const char *prefix, /* fallthrough */ case IMAGE_COREBOOT: case IMAGE_QEMU: - if (layout.kernel_size + layout.bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000) + if (image_target->elf_target != EM_ARM && layout.kernel_size + layout.bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000) grub_util_error (_("kernel image is too big (0x%x > 0x%x)"), (unsigned) layout.kernel_size + (unsigned) layout.bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR,