New port arm64-efi
This commit is contained in:
commit
b29b77fee2
28 changed files with 746 additions and 17 deletions
|
@ -636,6 +636,7 @@ static struct
|
|||
[GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275] = { "powerpc", "ieee1275" },
|
||||
[GRUB_INSTALL_PLATFORM_IA64_EFI] = { "ia64", "efi" },
|
||||
[GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm", "efi" },
|
||||
[GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64", "efi" },
|
||||
[GRUB_INSTALL_PLATFORM_ARM_UBOOT] = { "arm", "uboot" },
|
||||
};
|
||||
|
||||
|
|
|
@ -267,6 +267,8 @@ get_default_platform (void)
|
|||
return "ia64-efi";
|
||||
#elif defined (__arm__)
|
||||
return "arm-uboot";
|
||||
#elif defined (__aarch64__)
|
||||
return "arm64-efi";
|
||||
#elif defined (__amd64__) || defined (__x86_64__) || defined (__i386__)
|
||||
return grub_install_get_default_x86_platform ();
|
||||
#else
|
||||
|
@ -400,6 +402,7 @@ have_bootdev (enum grub_install_plat pl)
|
|||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
|
||||
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
|
||||
case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
|
||||
|
@ -750,6 +753,7 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
|
||||
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
|
||||
|
@ -789,6 +793,7 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
|
||||
|
@ -836,6 +841,7 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
is_efi = 1;
|
||||
break;
|
||||
|
@ -940,6 +946,9 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
efi_file = "BOOTARM.EFI";
|
||||
break;
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
efi_file = "BOOTAARCH64.EFI";
|
||||
break;
|
||||
default:
|
||||
grub_util_error ("%s", _("You've found a bug"));
|
||||
break;
|
||||
|
@ -964,6 +973,9 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
efi_file = "grubarm.efi";
|
||||
break;
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
efi_file = "grubarm64.efi";
|
||||
break;
|
||||
default:
|
||||
efi_file = "grub.efi";
|
||||
break;
|
||||
|
@ -1189,6 +1201,7 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
g = grub_util_guess_efi_drive (*curdev);
|
||||
break;
|
||||
|
@ -1278,6 +1291,7 @@ main (int argc, char *argv[])
|
|||
case GRUB_INSTALL_PLATFORM_I386_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
core_name = "core.efi";
|
||||
snprintf (mkimage_target, sizeof (mkimage_target),
|
||||
|
@ -1380,6 +1394,7 @@ main (int argc, char *argv[])
|
|||
}
|
||||
break;
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
|
||||
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
|
||||
|
@ -1516,6 +1531,7 @@ main (int argc, char *argv[])
|
|||
|
||||
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
|
||||
case GRUB_INSTALL_PLATFORM_IA64_EFI:
|
||||
{
|
||||
char *dst = grub_util_path_concat (2, efidir, efi_file);
|
||||
|
|
|
@ -718,6 +718,35 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case EM_AARCH64:
|
||||
{
|
||||
sym_addr += addend;
|
||||
switch (ELF_R_TYPE (info))
|
||||
{
|
||||
case R_AARCH64_ABS64:
|
||||
{
|
||||
*target = grub_host_to_target64 (grub_target_to_host64 (*target) + sym_addr);
|
||||
}
|
||||
break;
|
||||
case R_AARCH64_JUMP26:
|
||||
case R_AARCH64_CALL26:
|
||||
{
|
||||
grub_err_t err;
|
||||
sym_addr -= offset;
|
||||
sym_addr -= SUFFIX (entry_point);
|
||||
err = grub_arm64_reloc_xxxx26((grub_uint32_t *)target,
|
||||
sym_addr);
|
||||
if (err)
|
||||
grub_util_error ("%s", grub_errmsg);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
grub_util_error (_("relocation %d is not implemented yet"),
|
||||
(unsigned long long) ELF_R_TYPE (info));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#if defined(MKIMAGE_ELF32)
|
||||
case EM_ARM:
|
||||
|
@ -995,6 +1024,32 @@ SUFFIX (make_reloc_section) (Elf_Ehdr *e, void **out,
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case EM_AARCH64:
|
||||
switch (ELF_R_TYPE (info))
|
||||
{
|
||||
case R_AARCH64_ABS64:
|
||||
{
|
||||
Elf_Addr addr;
|
||||
|
||||
addr = section_address + offset;
|
||||
current_address
|
||||
= SUFFIX (add_fixup_entry) (&lst,
|
||||
GRUB_PE32_REL_BASED_DIR64,
|
||||
addr, 0, current_address,
|
||||
image_target);
|
||||
}
|
||||
break;
|
||||
/* Relative relocations do not require fixup entries. */
|
||||
case R_AARCH64_CALL26:
|
||||
case R_AARCH64_JUMP26:
|
||||
break;
|
||||
default:
|
||||
grub_util_error (_("fixup for relocation %d is not implemented yet"),
|
||||
(unsigned long long) ELF_R_TYPE (info));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
#if defined(MKIMAGE_ELF32)
|
||||
case EM_ARM:
|
||||
switch (ELF_R_TYPE (info))
|
||||
|
@ -1357,7 +1412,7 @@ SUFFIX (load_image) (const char *kernel_path, size_t *exec_size,
|
|||
image_target);
|
||||
if (*start == 0)
|
||||
grub_util_error ("start symbol is not defined");
|
||||
|
||||
|
||||
SUFFIX (entry_point) = (Elf_Addr) *start;
|
||||
|
||||
/* Resolve addresses in the virtual address space. */
|
||||
|
@ -1366,7 +1421,7 @@ SUFFIX (load_image) (const char *kernel_path, size_t *exec_size,
|
|||
num_sections, strtab,
|
||||
out_img, ia64_toff, ia64_got_off,
|
||||
image_target);
|
||||
|
||||
|
||||
*reloc_size = SUFFIX (make_reloc_section) (e, reloc_section,
|
||||
section_vaddresses, sections,
|
||||
section_entsize, num_sections,
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include <grub/efi/pe32.h>
|
||||
#include <grub/uboot/image.h>
|
||||
#include <grub/arm/reloc.h>
|
||||
#include <grub/arm64/reloc.h>
|
||||
#include <grub/ia64/reloc.h>
|
||||
#include <grub/osdep/hostfile.h>
|
||||
#include <grub/util/install.h>
|
||||
|
@ -578,6 +579,22 @@ static const struct grub_install_image_target_desc image_targets[] =
|
|||
.pe_target = GRUB_PE32_MACHINE_ARMTHUMB_MIXED,
|
||||
.elf_target = EM_ARM,
|
||||
},
|
||||
{
|
||||
.dirname = "arm64-efi",
|
||||
.names = { "arm64-efi", NULL },
|
||||
.voidp_sizeof = 8,
|
||||
.bigendian = 0,
|
||||
.id = IMAGE_EFI,
|
||||
.flags = PLATFORM_FLAGS_NONE,
|
||||
.total_module_size = TARGET_NO_FIELD,
|
||||
.decompressor_compressed_size = TARGET_NO_FIELD,
|
||||
.decompressor_uncompressed_size = TARGET_NO_FIELD,
|
||||
.decompressor_uncompressed_addr = TARGET_NO_FIELD,
|
||||
.section_align = GRUB_PE32_SECTION_ALIGNMENT,
|
||||
.vaddr_offset = EFI64_HEADER_SIZE,
|
||||
.pe_target = GRUB_PE32_MACHINE_ARM64,
|
||||
.elf_target = EM_AARCH64,
|
||||
},
|
||||
};
|
||||
|
||||
#define grub_target_to_host32(x) (grub_target_to_host32_real (image_target, (x)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue