Skip to content

Commit

Permalink
efi_loader: support building UEFI binaries on sandbox
Browse files Browse the repository at this point in the history
On the sandbox the UEFI binaries must match the host architectures.

Adjust the Makefiles. Provide the PE/COFF header and relocation files.

Allow building helloworld.efi on the sandbox.

Signed-off-by: Heinrich Schuchardt <[email protected]>
  • Loading branch information
xypron committed Nov 12, 2019
1 parent 7264e21 commit 3b4847c
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 1 deletion.
19 changes: 19 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,25 @@ NAME =
# o Look for make include files relative to root of kernel src
MAKEFLAGS += -rR --include-dir=$(CURDIR)

# Determine host architecture
include include/host_arch.h
MK_ARCH="${shell uname -m}"
unexport HOST_ARCH
ifeq ("x86_64", $(MK_ARCH))
export HOST_ARCH=$(HOST_ARCH_X86_64)
else ifneq (,$(findstring $(MK_ARCH), "i386" "i486" "i586" "i686"))
export HOST_ARCH=$(HOST_ARCH_X86)
else ifneq (,$(findstring $(MK_ARCH), "aarch64" "armv8l"))
export HOST_ARCH=$(HOST_ARCH_AARCH64)
else ifeq ("armv7l", $(MK_ARCH))
export HOST_ARCH=$(HOST_ARCH_ARM)
else ifeq ("riscv32", $(MK_ARCH))
export HOST_ARCH=$(HOST_ARCH_RISCV32)
else ifeq ("riscv64", $(MK_ARCH))
export HOST_ARCH=$(HOST_ARCH_RISCV64)
endif
undefine MK_ARCH

# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
Expand Down
28 changes: 28 additions & 0 deletions arch/sandbox/config.mk
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,31 @@ cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot-spl.map -Wl,--gc-sections)

CONFIG_ARCH_DEVICE_TREE := sandbox

ifeq ($(HOST_ARCH),$(HOST_ARCH_X86_64))
EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/elf_x86_64_efi.lds
EFI_TARGET := --target=efi-app-x86_64
else ifeq ($(HOST_ARCH),$(HOST_ARCH_X86))
EFI_LDS := ${SRCDIR}/../../../arch/x86/lib/elf_ia32_efi.lds
EFI_TARGET := --target=efi-app-ia32
else ifeq ($(HOST_ARCH),$(HOST_ARCH_AARCH64))
EFI_LDS := ${SRCDIR}/../../../arch/arm/lib/elf_aarch64_efi.lds
OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .data \
-j .u_boot_list -j .rela.dyn -j .got -j .got.plt \
-j .binman_sym_table -j .text_rest \
-j .efi_runtime -j .efi_runtime_rel
else ifeq ($(HOST_ARCH),$(HOST_ARCH_ARM))
EFI_LDS := ${SRCDIR}/../../../arch/arm/lib/elf_arm_efi.lds
OBJCOPYFLAGS += -j .text -j .secure_text -j .secure_data -j .rodata -j .hash \
-j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn \
-j .binman_sym_table -j .text_rest \
-j .efi_runtime -j .efi_runtime_rel
else ifeq ($(HOST_ARCH),$(HOST_ARCH_RISCV32))
EFI_LDS := ${SRCDIR}/../../../arch/riscv/lib/elf_riscv32_efi.lds
else ifeq ($(HOST_ARCH),$(HOST_ARCH_RISCV64))
EFI_LDS := ${SRCDIR}/../../../arch/riscv/lib/elf_riscv64_efi.lds
endif
EFI_CRT0 := crt0_sandbox_efi.o
EFI_RELOC := reloc_sandbox_efi.o
AFLAGS_crt0_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)"
CFLAGS_reloc_sandbox_efi.o += -DHOST_ARCH="$(HOST_ARCH)"
32 changes: 32 additions & 0 deletions arch/sandbox/lib/crt0_sandbox_efi.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* PE/COFF header for EFI applications
*
* Copyright (c) 2019 Heinrich Schuchardt
*/

#include <host_arch.h>

#if HOST_ARCH == HOST_ARCH_X86_64
#include "../../../arch/x86/lib/crt0_x86_64_efi.S"
#endif

#if HOST_ARCH == HOST_ARCH_X86
#include "../../../arch/x86/lib/crt0_ia32_efi.S"
#endif

#if HOST_ARCH == HOST_ARCH_AARCH64
#include "../../../arch/arm/lib/crt0_aarch64_efi.S"
#endif

#if HOST_ARCH == HOST_ARCH_ARM
#include "../../../arch/arm/lib/crt0_arm_efi.S"
#endif

#if HOST_ARCH == HOST_ARCH_RISCV32
#include "../../../arch/riscv/lib/crt0_riscv_efi.S"
#endif

#if HOST_ARCH == HOST_ARCH_RISCV64
#include "../../../arch/riscv/lib/crt0_riscv_efi.S"
#endif
32 changes: 32 additions & 0 deletions arch/sandbox/lib/reloc_sandbox_efi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* position independent shared object relocator
*
* Copyright (c) 2019 Heinrich Schuchardt
*/

#include <host_arch.h>

#if HOST_ARCH == HOST_ARCH_X86_64
#include "../../../arch/x86/lib/reloc_x86_64_efi.c"
#endif

#if HOST_ARCH == HOST_ARCH_X86
#include "../../../arch/x86/lib/reloc_ia32_efi.c"
#endif

#if HOST_ARCH == HOST_ARCH_AARCH64
#include "../../../arch/arm/lib/reloc_aarch64_efi.c"
#endif

#if HOST_ARCH == HOST_ARCH_ARM
#include "../../../arch/arm/lib/reloc_arm_efi.c"
#endif

#if HOST_ARCH == HOST_ARCH_RISCV32
#include "../../../arch/riscv/lib/reloc_riscv_efi.c"
#endif

#if HOST_ARCH == HOST_ARCH_RISCV64
#include "../../../arch/riscv/lib/reloc_riscv_efi.c"
#endif
2 changes: 1 addition & 1 deletion cmd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ config CMD_BOOTEFI

config CMD_BOOTEFI_HELLO_COMPILE
bool "Compile a standard EFI hello world binary for testing"
depends on CMD_BOOTEFI && !CPU_V7M && !SANDBOX
depends on CMD_BOOTEFI && !CPU_V7M
default y
help
This compiles a standard EFI hello world application with U-Boot so
Expand Down
24 changes: 24 additions & 0 deletions include/host_arch.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#if 0
# SPDX SPDX-License-Identifier: GPL-2.0+
#
# Constants defining the host architecture in assembler, C, and make files.
# The values are arbitrary.
#
# Copyright 2019 Heinrich Schuchardt <[email protected]>
#endif

#if 0
export HOST_ARCH_AARCH64=0xaa64
export HOST_ARCH_ARM=0x00a7
export HOST_ARCH_RISCV32=0x5032
export HOST_ARCH_RISCV64=0x5064
export HOST_ARCH_X86=0x0386
export HOST_ARCH_X86_64=0x8664
#endif

#define HOST_ARCH_AARCH64 0xaa64
#define HOST_ARCH_ARM 0x00a7
#define HOST_ARCH_RISCV32 0x5032
#define HOST_ARCH_RISCV64 0x5064
#define HOST_ARCH_X86 0x0386
#define HOST_ARCH_X86_64 0x8664
3 changes: 3 additions & 0 deletions lib/efi_loader/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
# This file only gets included with CONFIG_EFI_LOADER set, so all
# object inclusion implicitly depends on it

asflags-y += -DHOST_ARCH="$(HOST_ARCH)"
ccflags-y += -DHOST_ARCH="$(HOST_ARCH)"

CFLAGS_efi_boottime.o += \
-DFW_VERSION="0x$(VERSION)" \
-DFW_PATCHLEVEL="0x$(PATCHLEVEL)"
Expand Down

0 comments on commit 3b4847c

Please sign in to comment.