diff options
author | Xiaotian Wu <wuxiaotian@loongson.cn> | 2023-02-03 12:44:11 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2023-02-03 12:44:11 +0000 |
commit | d405a0bd84e34d5c549d71145657add506079fb4 (patch) | |
tree | 1c6b9c4f44ccc722f5da9f06da993da73a99172c | |
parent | 49c13e81bcb49e4a70ee2603fbf4e883be43bc1e (diff) | |
download | ipxe-d405a0bd84e34d5c549d71145657add506079fb4.tar.gz |
[util] Add support for LoongArch64 binariesloongarch64
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/util/efirom.c | 1 | ||||
-rw-r--r-- | src/util/elf2efi.c | 34 | ||||
-rwxr-xr-x | src/util/genfsimg | 3 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/util/efirom.c b/src/util/efirom.c index 8ac7966ef..b0334bdb1 100644 --- a/src/util/efirom.c +++ b/src/util/efirom.c @@ -95,6 +95,7 @@ static void read_pe_info ( void *pe, uint16_t *machine, break; case EFI_IMAGE_MACHINE_X64: case EFI_IMAGE_MACHINE_AARCH64: + case EFI_IMAGE_MACHINE_LOONGARCH64: *subsystem = nt->nt64.OptionalHeader.Subsystem; break; default: diff --git a/src/util/elf2efi.c b/src/util/elf2efi.c index 9523ccc31..cea9abf86 100644 --- a/src/util/elf2efi.c +++ b/src/util/elf2efi.c @@ -81,6 +81,9 @@ #ifndef EM_AARCH64 #define EM_AARCH64 183 #endif +#ifndef EM_LOONGARCH +#define EM_LOONGARCH 258 +#endif #ifndef R_AARCH64_NONE #define R_AARCH64_NONE 0 #endif @@ -126,6 +129,27 @@ #ifndef R_ARM_V4BX #define R_ARM_V4BX 40 #endif +#ifndef R_LARCH_NONE +#define R_LARCH_NONE 0 +#endif +#ifndef R_LARCH_64 +#define R_LARCH_64 2 +#endif +#ifndef R_LARCH_B26 +#define R_LARCH_B26 66 +#endif +#ifndef R_LARCH_PCALA_HI20 +#define R_LARCH_PCALA_HI20 71 +#endif +#ifndef R_LARCH_PCALA_LO12 +#define R_LARCH_PCALA_LO12 72 +#endif +#ifndef R_LARCH_GOT_PC_HI20 +#define R_LARCH_GOT_PC_HI20 75 +#endif +#ifndef R_LARCH_GOT_PC_LO12 +#define R_LARCH_GOT_PC_LO12 76 +#endif /** * Alignment of raw data of sections in the image file @@ -486,6 +510,9 @@ static void set_machine ( struct elf_file *elf, struct pe_header *pe_header ) { case EM_AARCH64: machine = EFI_IMAGE_MACHINE_AARCH64; break; + case EM_LOONGARCH: + machine = EFI_IMAGE_MACHINE_LOONGARCH64; + break; default: eprintf ( "Unknown ELF architecture %d\n", ehdr->e_machine ); exit ( 1 ); @@ -671,6 +698,7 @@ static void process_reloc ( struct elf_file *elf, const Elf_Shdr *shdr, case ELF_MREL ( EM_X86_64, R_X86_64_NONE ) : case ELF_MREL ( EM_AARCH64, R_AARCH64_NONE ) : case ELF_MREL ( EM_AARCH64, R_AARCH64_NULL ) : + case ELF_MREL ( EM_LOONGARCH, R_LARCH_NONE ) : /* Ignore dummy relocations used by REQUIRE_SYMBOL() */ break; case ELF_MREL ( EM_386, R_386_32 ) : @@ -680,6 +708,7 @@ static void process_reloc ( struct elf_file *elf, const Elf_Shdr *shdr, break; case ELF_MREL ( EM_X86_64, R_X86_64_64 ) : case ELF_MREL ( EM_AARCH64, R_AARCH64_ABS64 ) : + case ELF_MREL ( EM_LOONGARCH, R_LARCH_64 ) : /* Generate an 8-byte PE relocation */ generate_pe_reloc ( pe_reltab, offset, 8 ); break; @@ -700,6 +729,11 @@ static void process_reloc ( struct elf_file *elf, const Elf_Shdr *shdr, case ELF_MREL ( EM_AARCH64, R_AARCH64_LDST16_ABS_LO12_NC ) : case ELF_MREL ( EM_AARCH64, R_AARCH64_LDST32_ABS_LO12_NC ) : case ELF_MREL ( EM_AARCH64, R_AARCH64_LDST64_ABS_LO12_NC ) : + case ELF_MREL ( EM_LOONGARCH, R_LARCH_B26): + case ELF_MREL ( EM_LOONGARCH, R_LARCH_PCALA_HI20 ): + case ELF_MREL ( EM_LOONGARCH, R_LARCH_PCALA_LO12 ): + case ELF_MREL ( EM_LOONGARCH, R_LARCH_GOT_PC_HI20 ): + case ELF_MREL ( EM_LOONGARCH, R_LARCH_GOT_PC_LO12 ): /* Skip PC-relative relocations; all relative * offsets remain unaltered when the object is * loaded. diff --git a/src/util/genfsimg b/src/util/genfsimg index 731fa6ce0..0c0692793 100755 --- a/src/util/genfsimg +++ b/src/util/genfsimg @@ -72,6 +72,9 @@ efi_boot_name() { "c201" ) echo "BOOTARM.EFI" ;; + "6462" ) + echo "BOOTLOONGARCH64.EFI" + ;; "64aa" ) echo "BOOTAA64.EFI" ;; |