From: Jiaxun Yang <[email protected]> They are all coming from UEFI specification, PE-COFF specification, or IANA websites.
Signed-off-by: Jiaxun Yang <[email protected]> Signed-off-by: Yao Zi <[email protected]> --- - Reword commit message, replacing "PE spec" with "PE-COFF specification" - Replace obsolete __loongarch64 macro with __loongarch__ and __loongarch_grlen - Use a true undefined instruction in efi_selftest_miniapp_exception.c - Define HOST_BOOTEFI_NAME and HOST_PXE_ARCH - Introduce definition for IMAGE_REL_BASEd_LOONGARCH64_MARK_LA include/asm-generic/pe.h | 2 ++ include/config_distro_bootcmd.h | 5 +++++ include/pe.h | 1 + lib/efi_loader/efi_helper.c | 4 ++++ lib/efi_loader/efi_image_loader.c | 7 +++++++ lib/efi_loader/efi_runtime.c | 4 ++++ lib/efi_selftest/efi_selftest_miniapp_exception.c | 3 +++ 7 files changed, 26 insertions(+) diff --git a/include/asm-generic/pe.h b/include/asm-generic/pe.h index cd5b6ad62bf0..fb93f2621715 100644 --- a/include/asm-generic/pe.h +++ b/include/asm-generic/pe.h @@ -38,6 +38,8 @@ #define IMAGE_FILE_MACHINE_ARM64 0xaa64 #define IMAGE_FILE_MACHINE_RISCV32 0x5032 #define IMAGE_FILE_MACHINE_RISCV64 0x5064 +#define IMAGE_FILE_MACHINE_LOONGARCH32 0x6232 +#define IMAGE_FILE_MACHINE_LOONGARCH64 0x6264 /* Header magic constants */ #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h index 8d6f80a0ce5c..7722ba7627fc 100644 --- a/include/config_distro_bootcmd.h +++ b/include/config_distro_bootcmd.h @@ -118,6 +118,8 @@ #define BOOTEFI_NAME "bootriscv32.efi" #elif defined(CONFIG_ARCH_RV64I) #define BOOTEFI_NAME "bootriscv64.efi" +#elif defined(CONFIG_ARCH_LA64) +#define BOOTEFI_NAME "bootloongarch64.efi" #endif #endif @@ -371,6 +373,9 @@ #elif defined(CONFIG_ARCH_RV64I) || ((defined(__riscv) && __riscv_xlen == 64)) #define BOOTENV_EFI_PXE_ARCH "0x1b" #define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000" +#elif defined(CONFIG_ARCH_LA64) || (defined(__loongarch__) && __loongarch_grlen == 64)) +#define BOOTENV_EFI_PXE_ARCH "0x27" +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00039:UNDI:003000" #elif defined(CONFIG_SANDBOX) # error "sandbox EFI support is only supported on ARM and x86" #else diff --git a/include/pe.h b/include/pe.h index 086f2b860e99..2340631f82fe 100644 --- a/include/pe.h +++ b/include/pe.h @@ -194,6 +194,7 @@ typedef struct _IMAGE_RELOCATION #define IMAGE_REL_BASED_THUMB_MOV32 7 /* yes, 7 too */ #define IMAGE_REL_BASED_RISCV_LOW12I 7 /* yes, 7 too */ #define IMAGE_REL_BASED_RISCV_LOW12S 8 +#define IMAGE_REL_BASED_LOONGARCH64_MARK_LA 8 /* yes, 8 too */ #define IMAGE_REL_BASED_MIPS_JMPADDR16 9 #define IMAGE_REL_BASED_IA64_IMM64 9 /* yes, 9 too */ #define IMAGE_REL_BASED_DIR64 10 diff --git a/lib/efi_loader/efi_helper.c b/lib/efi_loader/efi_helper.c index 44b806aadc4f..bc48e265b901 100644 --- a/lib/efi_loader/efi_helper.c +++ b/lib/efi_loader/efi_helper.c @@ -62,6 +62,8 @@ #define BOOTEFI_NAME "BOOTRISCV32.EFI" #elif defined(CONFIG_ARCH_RV64I) #define BOOTEFI_NAME "BOOTRISCV64.EFI" +#elif defined(CONFIG_ARCH_LA64) +#define BOOTEFI_NAME "BOOTLOONGARCH64.EFI" #else #error Unsupported UEFI architecture #endif @@ -94,6 +96,8 @@ int efi_get_pxe_arch(void) return 0x19; else if (IS_ENABLED(CONFIG_ARCH_RV64I)) return 0x1b; + else if (IS_ENABLED(CONFIG_ARCH_LA64)) + return 0x27; return -EINVAL; } diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c index f9a2d2df405d..bed5f1817266 100644 --- a/lib/efi_loader/efi_image_loader.c +++ b/lib/efi_loader/efi_image_loader.c @@ -51,6 +51,13 @@ static int machines[] = { #if defined(__riscv) && (__riscv_xlen == 64) IMAGE_FILE_MACHINE_RISCV64, #endif + +#if defined(__loongarch__) && __loongarch_grlen == 64 + IMAGE_FILE_MACHINE_LOONGARCH64, +#endif +#if defined(__loongarch__) && __loongarch_grlen == 32 + IMAGE_FILE_MACHINE_LOONGARCH32, +#endif 0 }; /** diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 73d4097464c0..de50d72d634a 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -78,6 +78,10 @@ struct dyn_sym { #else #error unknown riscv target #endif +#elif defined(__loongarch__) +#define R_RELATIVE R_LARCH_RELATIVE +#define R_MASK 0xffffffffULL +#define IS_RELA 1 #else #error Need to add relocation awareness #endif diff --git a/lib/efi_selftest/efi_selftest_miniapp_exception.c b/lib/efi_selftest/efi_selftest_miniapp_exception.c index f668cdac4ab2..648206c17098 100644 --- a/lib/efi_selftest/efi_selftest_miniapp_exception.c +++ b/lib/efi_selftest/efi_selftest_miniapp_exception.c @@ -35,6 +35,9 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle, asm volatile (".word 0xffffffff\n"); #elif defined(CONFIG_X86) asm volatile (".word 0xffff\n"); +#elif defined(CONFIG_LOONGARCH) + /* ud 31 */ + asm volatile (".word 0x386007ff\n"); #elif defined(CONFIG_SANDBOX) #if (HOST_ARCH == HOST_ARCH_ARM || HOST_ARCH == HOST_ARCH_AARCH64) asm volatile (".word 0xe7f7defb\n"); -- 2.54.0

