[util] Add support for LoongArch64 binaries

Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/util/efirom.c b/src/util/efirom.c
index 8ac7966..b0334bd 100644
--- a/src/util/efirom.c
+++ b/src/util/efirom.c
@@ -95,6 +95,7 @@
 		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 9523ccc..cea9abf 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 @@
 	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 @@
 		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 @@
 			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 @@
 		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 731fa6c..0c06927 100755
--- a/src/util/genfsimg
+++ b/src/util/genfsimg
@@ -72,6 +72,9 @@
 	"c201" )
 	    echo "BOOTARM.EFI"
 	    ;;
+	"6462" )
+	    echo "BOOTLOONGARCH64.EFI"
+	    ;;
 	"64aa" )
 	    echo "BOOTAA64.EFI"
 	    ;;