]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[util] Add support for LoongArch64 binaries
authorXiaotian Wu <wuxiaotian@loongson.cn>
Fri, 3 Feb 2023 12:44:11 +0000 (12:44 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 3 Feb 2023 12:44:11 +0000 (12:44 +0000)
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/util/efirom.c
src/util/elf2efi.c
src/util/genfsimg

index 8ac7966efa07e6b1fd908a24adb47c47b1c031b7..b0334bdb1d4761e1ef9d1ad95c23bd610ac24379 100644 (file)
@@ -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:
index 9523ccc3183b0fc7bcab3283eeba83d5d11956c8..cea9abf867b047aad709f77690babf5e75a34197 100644 (file)
@@ -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
 #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.
index 731fa6ce0d93d5dde73bfc839de858b6bc7f9bc9..0c0692793a085b3426ae27c39a847917769ce743 100755 (executable)
@@ -72,6 +72,9 @@ efi_boot_name() {
        "c201" )
            echo "BOOTARM.EFI"
            ;;
+       "6462" )
+           echo "BOOTLOONGARCH64.EFI"
+           ;;
        "64aa" )
            echo "BOOTAA64.EFI"
            ;;