On Fri, 17 May 2024 at 19:33, Jiaxun Yang <jiaxun.y...@flygoat.com> wrote:
>
> Various file names, instruction defines, magic numbers
> related to MIPS's EFI implementation.
>
> PE magic numbers are from winnt.h, DHCP numbers are
> from IANA page, boot file names are from other
> implementations.
>
> Signed-off-by: Jiaxun Yang <jiaxun.y...@flygoat.com>
> ---
> include/asm-generic/pe.h | 5 +++++
> include/config_distro_bootcmd.h | 6 ++++++
> include/efi_default_filename.h | 8 ++++++++
> include/elf.h | 8 ++++++++
> lib/efi_loader/efi_image_loader.c | 17 +++++++++++++++++
> lib/efi_selftest/efi_selftest_miniapp_exception.c | 2 ++
> 6 files changed, 46 insertions(+)
>
> diff --git a/include/asm-generic/pe.h b/include/asm-generic/pe.h
> index cd5b6ad62bf0..42c4cbedbc95 100644
> --- a/include/asm-generic/pe.h
> +++ b/include/asm-generic/pe.h
> @@ -31,6 +31,11 @@
>
> /* Machine types */
> #define IMAGE_FILE_MACHINE_I386 0x014c
> +#define IMAGE_FILE_MACHINE_R3000_BE 0x0160
> +#define IMAGE_FILE_MACHINE_R3000 0x0162
> +#define IMAGE_FILE_MACHINE_R4000_BE 0x0164
> +#define IMAGE_FILE_MACHINE_R4000 0x0166
> +#define IMAGE_FILE_MACHINE_R10000 0x0168
> #define IMAGE_FILE_MACHINE_ARM 0x01c0
> #define IMAGE_FILE_MACHINE_THUMB 0x01c2
> #define IMAGE_FILE_MACHINE_ARMNT 0x01c4
> diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
> index 2a136b96a6d9..9e03d10acec5 100644
> --- a/include/config_distro_bootcmd.h
> +++ b/include/config_distro_bootcmd.h
> @@ -366,6 +366,12 @@
> #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_CPU_MIPS32) || ((defined(__mips) && __mips == 32))
> +#define BOOTENV_EFI_PXE_ARCH "0x21"
> +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00033:UNDI:003000"
> +#elif defined(CONFIG_CPU_MIPS64) || ((defined(__mips) && __mips == 64))
> +#define BOOTENV_EFI_PXE_ARCH "0x22"
> +#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00034:UNDI:003000"
> #elif defined(CONFIG_SANDBOX)
> # error "sandbox EFI support is only supported on ARM and x86"
> #else
> diff --git a/include/efi_default_filename.h b/include/efi_default_filename.h
> index 77932984b557..eb94a54514bc 100644
> --- a/include/efi_default_filename.h
> +++ b/include/efi_default_filename.h
> @@ -47,6 +47,14 @@
> #define BOOTEFI_NAME "BOOTRISCV32.EFI"
> #elif defined(CONFIG_ARCH_RV64I)
> #define BOOTEFI_NAME "BOOTRISCV64.EFI"
> +#elif defined(CONFIG_CPU_MIPS32) && defined(CONFIG_SYS_BIG_ENDIAN)
> +#define BOOTEFI_NAME "BOOTMIPS.EFI"
> +#elif defined(CONFIG_CPU_MIPS32) && defined(CONFIG_SYS_LITTLE_ENDIAN)
> +#define BOOTEFI_NAME "BOOTMIPSEL.EFI"
> +#elif defined(CONFIG_CPU_MIPS64) && defined(CONFIG_SYS_BIG_ENDIAN)
> +#define BOOTEFI_NAME "BOOTMIPS64.EFI"
> +#elif defined(CONFIG_CPU_MIPS64) && defined(CONFIG_SYS_LITTLE_ENDIAN)
> +#define BOOTEFI_NAME "BOOTMIPS64EL.EFI"
> #else
> #error Unsupported UEFI architecture
> #endif
> diff --git a/include/elf.h b/include/elf.h
> index a4ba74d8abeb..95de6ffbce31 100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -545,6 +545,9 @@ typedef struct {
> #define DT_LOPROC 0x70000000 /* reserved range for processor */
> #define DT_HIPROC 0x7fffffff /* specific dynamic array tags */
>
> +/* MIPS */
> +#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local got
> entries */
> +
> /* Dynamic Tag Flags - d_un.d_val */
> #define DF_ORIGIN 0x01 /* Object may use DF_ORIGIN */
> #define DF_SYMBOLIC 0x02 /* Symbol resolutions starts here */
> @@ -699,6 +702,11 @@ unsigned long elf_hash(const unsigned char *name);
> #define R_RISCV_64 2
> #define R_RISCV_RELATIVE 3
>
> +/* MIPS Relocations */
> +#define R_MIPS_NONE 0
> +#define R_MIPS_REL32 3
> +#define R_MIPS_64 18
> +
> #ifndef __ASSEMBLY__
> int valid_elf_image(unsigned long addr);
> unsigned long load_elf64_image_phdr(unsigned long addr);
> diff --git a/lib/efi_loader/efi_image_loader.c
> b/lib/efi_loader/efi_image_loader.c
> index cedc4d822fe7..8df469851851 100644
> --- a/lib/efi_loader/efi_image_loader.c
> +++ b/lib/efi_loader/efi_image_loader.c
> @@ -51,6 +51,23 @@ static int machines[] = {
> IMAGE_FILE_MACHINE_RISCV64,
> #endif
>
> +#if defined(__mips__) && (__mips == 32) && defined(__BIG_ENDIAN)
> + IMAGE_FILE_MACHINE_R3000_BE,
> +#endif
> +
> +#if defined(__mips__) && (__mips == 32) && defined(__LITTLE_ENDIAN)
> + IMAGE_FILE_MACHINE_R3000,
> +#endif
> +
> +#if defined(__mips__) && (__mips == 64) && defined(__BIG_ENDIAN)
> + IMAGE_FILE_MACHINE_R4000_BE,
> +#endif
> +
> +#if defined(__mips__) && (__mips == 64) && defined(__LITTLE_ENDIAN)
> + IMAGE_FILE_MACHINE_R4000,
> + IMAGE_FILE_MACHINE_R10000,
> +#endif
> +
> 0 };
>
> /**
> diff --git a/lib/efi_selftest/efi_selftest_miniapp_exception.c
> b/lib/efi_selftest/efi_selftest_miniapp_exception.c
> index f668cdac4ab2..f3b4ee926f8f 100644
> --- a/lib/efi_selftest/efi_selftest_miniapp_exception.c
> +++ b/lib/efi_selftest/efi_selftest_miniapp_exception.c
> @@ -33,6 +33,8 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
> asm volatile (".word 0xe7f7defb\n");
> #elif defined(CONFIG_RISCV)
> asm volatile (".word 0xffffffff\n");
> +#elif defined(CONFIG_MIPS)
> + asm volatile ("break 0xf\n");
> #elif defined(CONFIG_X86)
> asm volatile (".word 0xffff\n");
> #elif defined(CONFIG_SANDBOX)
>
> --
> 2.34.1
>
Acked-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>