summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--arch/arm/lib/crt0_aarch64_efi.S2
-rw-r--r--arch/arm/lib/crt0_arm_efi.S13
-rw-r--r--arch/arm/lib/elf_aarch64_efi.lds68
-rw-r--r--arch/arm/lib/elf_arm_efi.lds71
-rw-r--r--arch/riscv/lib/crt0_riscv_efi.S4
-rw-r--r--arch/riscv/lib/elf_riscv32_efi.lds68
-rw-r--r--arch/riscv/lib/elf_riscv64_efi.lds68
-rw-r--r--doc/board/coolpi/genbook_cm5_rk3588.rst2
-rw-r--r--lib/efi_loader/efi_bootbin.c87
-rw-r--r--lib/efi_loader/elf_efi.ldsi74
-rw-r--r--scripts/Makefile.lib4
12 files changed, 150 insertions, 313 deletions
diff --git a/Makefile b/Makefile
index bcb1fdd5148..5c6f467153c 100644
--- a/Makefile
+++ b/Makefile
@@ -2230,7 +2230,7 @@ CLEAN_FILES += include/autoconf.mk* include/bmp_logo.h include/bmp_logo_data.h \
itb.fit.fit itb.fit.itb itb.map spl.map mkimage-out.rom.mkimage \
mkimage.rom.mkimage mkimage-in-simple-bin* rom.map simple-bin* \
idbloader-spi.img lib/efi_loader/helloworld_efi.S *.itb \
- Test* capsule.*.efi-capsule capsule*.map
+ Test* capsule*.*.efi-capsule capsule*.map
# Directories & files removed with 'make mrproper'
MRPROPER_DIRS += include/config include/generated spl tpl vpl \
diff --git a/arch/arm/lib/crt0_aarch64_efi.S b/arch/arm/lib/crt0_aarch64_efi.S
index fe6eca576ec..e21b54fdbcb 100644
--- a/arch/arm/lib/crt0_aarch64_efi.S
+++ b/arch/arm/lib/crt0_aarch64_efi.S
@@ -41,7 +41,7 @@ optional_header:
.byte 0x02 /* MajorLinkerVersion */
.byte 0x14 /* MinorLinkerVersion */
.long _etext - _start /* SizeOfCode */
- .long 0 /* SizeOfInitializedData */
+ .long _data_size /* SizeOfInitializedData */
.long 0 /* SizeOfUninitializedData */
.long _start - ImageBase /* AddressOfEntryPoint */
.long _start - ImageBase /* BaseOfCode */
diff --git a/arch/arm/lib/crt0_arm_efi.S b/arch/arm/lib/crt0_arm_efi.S
index b5dfd4e3819..91b0fe12c51 100644
--- a/arch/arm/lib/crt0_arm_efi.S
+++ b/arch/arm/lib/crt0_arm_efi.S
@@ -38,16 +38,16 @@ optional_header:
.short IMAGE_NT_OPTIONAL_HDR32_MAGIC /* PE32 format */
.byte 0x02 /* MajorLinkerVersion */
.byte 0x14 /* MinorLinkerVersion */
- .long _edata - _start /* SizeOfCode */
- .long 0 /* SizeOfInitializedData */
+ .long _etext - _start /* SizeOfCode */
+ .long _data_size /* SizeOfInitializedData */
.long 0 /* SizeOfUninitializedData */
.long _start - image_base /* AddressOfEntryPoint */
.long _start - image_base /* BaseOfCode */
.long 0 /* BaseOfData */
extra_header_fields:
- .long 0 /* image_base */
- .long 0x200 /* SectionAlignment */
+ .long 0 /* ImageBase */
+ .long 0x1000 /* SectionAlignment */
.long 0x200 /* FileAlignment */
.short 0 /* MajorOperatingSystemVersion */
.short 0 /* MinorOperatingSystemVersion */
@@ -84,6 +84,7 @@ extra_header_fields:
.quad 0 /* CertificationTable */
.quad 0 /* BaseRelocationTable */
+ /* Section table */
section_table:
/*
@@ -111,9 +112,9 @@ section_table:
.byte 0
.byte 0
.byte 0 /* end of 0 padding of section name */
- .long _text_size /* VirtualSize */
+ .long _etext - _start /* VirtualSize */
.long _start - image_base /* VirtualAddress */
- .long _text_size /* SizeOfRawData */
+ .long _etext - _start /* SizeOfRawData */
.long _start - image_base /* PointerToRawData */
.long 0 /* PointerToRelocations */
.long 0 /* PointerToLineNumbers */
diff --git a/arch/arm/lib/elf_aarch64_efi.lds b/arch/arm/lib/elf_aarch64_efi.lds
index 5dd98091698..453d3511c28 100644
--- a/arch/arm/lib/elf_aarch64_efi.lds
+++ b/arch/arm/lib/elf_aarch64_efi.lds
@@ -8,70 +8,4 @@
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
-PHDRS
-{
- data PT_LOAD FLAGS(3); /* SHF_WRITE | SHF_ALLOC */
-}
-
-ENTRY(_start)
-SECTIONS
-{
- .text 0x0 : {
- _text = .;
- *(.text.head)
- *(.text)
- *(.text.*)
- *(.gnu.linkonce.t.*)
- *(.srodata)
- *(.rodata*)
- . = ALIGN(16);
- *(.dynamic);
- . = ALIGN(512);
- }
- .rela.dyn : { *(.rela.dyn) }
- .rela.plt : { *(.rela.plt) }
- .rela.got : { *(.rela.got) }
- .rela.data : { *(.rela.data) *(.rela.data*) }
- _etext = .;
- _text_size = . - _text;
- . = ALIGN(4096);
- .data : {
- _data = .;
- *(.sdata)
- *(.data)
- *(.data1)
- *(.data.*)
- *(.got.plt)
- *(.got)
-
- /*
- * The EFI loader doesn't seem to like a .bss section, so we
- * stick it all into .data:
- */
- . = ALIGN(16);
- _bss = .;
- *(.sbss)
- *(.scommon)
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(512);
- _bss_end = .;
- _edata = .;
- } :data
- _data_size = _edata - _data;
-
- . = ALIGN(4096);
- .dynsym : { *(.dynsym) }
- . = ALIGN(4096);
- .dynstr : { *(.dynstr) }
- . = ALIGN(4096);
- .note.gnu.build-id : { *(.note.gnu.build-id) }
- /DISCARD/ : {
- *(.rel.reloc)
- *(.eh_frame)
- *(.note.GNU-stack)
- }
- .comment 0 : { *(.comment) }
-}
+INCLUDE lib/efi_loader/elf_efi.ldsi
diff --git a/arch/arm/lib/elf_arm_efi.lds b/arch/arm/lib/elf_arm_efi.lds
index 41440594aa6..eb16fae74cf 100644
--- a/arch/arm/lib/elf_arm_efi.lds
+++ b/arch/arm/lib/elf_arm_efi.lds
@@ -8,73 +8,4 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
-PHDRS
-{
- data PT_LOAD FLAGS(3); /* PF_W | PF_X */
-}
-
-ENTRY(_start)
-SECTIONS
-{
- .text 0x0 : {
- _text = .;
- *(.text.head)
- *(.text)
- *(.text.*)
- *(.gnu.linkonce.t.*)
- *(.srodata)
- *(.rodata*)
- . = ALIGN(16);
- *(.dynamic);
- . = ALIGN(512);
- }
- _etext = .;
- _text_size = . - _text;
- . = ALIGN(4096);
- .data : {
- _data = .;
- *(.sdata)
- *(.data)
- *(.data1)
- *(.data.*)
- *(.got.plt)
- *(.got)
-
- /*
- * The EFI loader doesn't seem to like a .bss section, so we
- * stick it all into .data:
- */
- . = ALIGN(16);
- _bss = .;
- *(.sbss)
- *(.scommon)
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(512);
- _bss_end = .;
- _edata = .;
- } :data
- _data_size = . - _data;
-
- /DISCARD/ : {
- /*
- * We don't support relocations. These would have to be
- * translated from ELF to PE format and added to the .reloc
- * section.
- */
- *(.rel.dyn)
- *(.rel.plt)
- *(.rel.got)
- *(.rel.data)
- *(.rel.data*)
- *(.rel.reloc)
- *(.eh_frame)
- *(.note.GNU-stack)
- *(.dynsym)
- *(.dynstr)
- *(.note.gnu.build-id)
- *(.comment)
- }
-}
+INCLUDE lib/efi_loader/elf_efi.ldsi
diff --git a/arch/riscv/lib/crt0_riscv_efi.S b/arch/riscv/lib/crt0_riscv_efi.S
index c7a4559eac8..9eacbe4a859 100644
--- a/arch/riscv/lib/crt0_riscv_efi.S
+++ b/arch/riscv/lib/crt0_riscv_efi.S
@@ -63,8 +63,8 @@ optional_header:
.short PE_MAGIC /* PE32(+) format */
.byte 0x02 /* MajorLinkerVersion */
.byte 0x14 /* MinorLinkerVersion */
- .long _edata - _start /* SizeOfCode */
- .long 0 /* SizeOfInitializedData */
+ .long _etext - _start /* SizeOfCode */
+ .long _data_size /* SizeOfInitializedData */
.long 0 /* SizeOfUninitializedData */
.long _start - ImageBase /* AddressOfEntryPoint */
.long _start - ImageBase /* BaseOfCode */
diff --git a/arch/riscv/lib/elf_riscv32_efi.lds b/arch/riscv/lib/elf_riscv32_efi.lds
index 7b9bd7b7f15..e23521c4931 100644
--- a/arch/riscv/lib/elf_riscv32_efi.lds
+++ b/arch/riscv/lib/elf_riscv32_efi.lds
@@ -8,70 +8,4 @@
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
OUTPUT_ARCH(riscv)
-PHDRS
-{
- data PT_LOAD FLAGS(3); /* SHF_WRITE | SHF_ALLOC */
-}
-
-ENTRY(_start)
-SECTIONS
-{
- .text 0x0 : {
- _text = .;
- *(.text.head)
- *(.text)
- *(.text.*)
- *(.gnu.linkonce.t.*)
- *(.srodata)
- *(.rodata*)
- . = ALIGN(16);
- *(.dynamic);
- . = ALIGN(512);
- }
- .rela.dyn : { *(.rela.dyn) }
- .rela.plt : { *(.rela.plt) }
- .rela.got : { *(.rela.got) }
- .rela.data : { *(.rela.data) *(.rela.data*) }
- _etext = .;
- _text_size = . - _text;
- . = ALIGN(4096);
- .data : {
- _data = .;
- *(.sdata)
- *(.data)
- *(.data1)
- *(.data.*)
- *(.got.plt)
- *(.got)
-
- /*
- * The EFI loader doesn't seem to like a .bss section, so we
- * stick it all into .data:
- */
- . = ALIGN(16);
- _bss = .;
- *(.sbss)
- *(.scommon)
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(512);
- _bss_end = .;
- _edata = .;
- } :data
- _data_size = _edata - _data;
-
- . = ALIGN(4096);
- .dynsym : { *(.dynsym) }
- . = ALIGN(4096);
- .dynstr : { *(.dynstr) }
- . = ALIGN(4096);
- .note.gnu.build-id : { *(.note.gnu.build-id) }
- /DISCARD/ : {
- *(.rel.reloc)
- *(.eh_frame)
- *(.note.GNU-stack)
- }
- .comment 0 : { *(.comment) }
-}
+INCLUDE lib/efi_loader/elf_efi.ldsi
diff --git a/arch/riscv/lib/elf_riscv64_efi.lds b/arch/riscv/lib/elf_riscv64_efi.lds
index d0b4f3d1d64..8e4844c2eea 100644
--- a/arch/riscv/lib/elf_riscv64_efi.lds
+++ b/arch/riscv/lib/elf_riscv64_efi.lds
@@ -8,70 +8,4 @@
OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv")
OUTPUT_ARCH(riscv)
-PHDRS
-{
- data PT_LOAD FLAGS(3); /* SHF_WRITE | SHF_ALLOC */
-}
-
-ENTRY(_start)
-SECTIONS
-{
- .text 0x0 : {
- _text = .;
- *(.text.head)
- *(.text)
- *(.text.*)
- *(.gnu.linkonce.t.*)
- *(.srodata)
- *(.rodata*)
- . = ALIGN(16);
- *(.dynamic);
- . = ALIGN(512);
- }
- .rela.dyn : { *(.rela.dyn) }
- .rela.plt : { *(.rela.plt) }
- .rela.got : { *(.rela.got) }
- .rela.data : { *(.rela.data) *(.rela.data*) }
- _etext = .;
- _text_size = . - _text;
- . = ALIGN(4096);
- .data : {
- _data = .;
- *(.sdata)
- *(.data)
- *(.data1)
- *(.data.*)
- *(.got.plt)
- *(.got)
-
- /*
- * The EFI loader doesn't seem to like a .bss section, so we
- * stick it all into .data:
- */
- . = ALIGN(16);
- _bss = .;
- *(.sbss)
- *(.scommon)
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(512);
- _bss_end = .;
- _edata = .;
- } :data
- _data_size = _edata - _data;
-
- . = ALIGN(4096);
- .dynsym : { *(.dynsym) }
- . = ALIGN(4096);
- .dynstr : { *(.dynstr) }
- . = ALIGN(4096);
- .note.gnu.build-id : { *(.note.gnu.build-id) }
- /DISCARD/ : {
- *(.rel.reloc)
- *(.eh_frame)
- *(.note.GNU-stack)
- }
- .comment 0 : { *(.comment) }
-}
+INCLUDE lib/efi_loader/elf_efi.ldsi
diff --git a/doc/board/coolpi/genbook_cm5_rk3588.rst b/doc/board/coolpi/genbook_cm5_rk3588.rst
index cad2a28acbd..26cddac9207 100644
--- a/doc/board/coolpi/genbook_cm5_rk3588.rst
+++ b/doc/board/coolpi/genbook_cm5_rk3588.rst
@@ -28,7 +28,7 @@ Get the TF-A and DDR init (TPL) binaries
cd u-boot
export ROCKCHIP_TPL=../rkbin/bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.17.bin
export BL31=../rkbin/bin/rk35/rk3588_bl31_v1.46.elf
- make coolpi-genbook-cm5-rk3588_defconfig
+ make coolpi-cm5-genbook-rk3588_defconfig
make CROSS_COMPILE=aarch64-linux-gnu-
This will build ``u-boot-rockchip.bin`` for eMMC and ``u-boot-rockchip-spi.bin`` for SPI Nor.
diff --git a/lib/efi_loader/efi_bootbin.c b/lib/efi_loader/efi_bootbin.c
index b677bbc3124..428991df88f 100644
--- a/lib/efi_loader/efi_bootbin.c
+++ b/lib/efi_loader/efi_bootbin.c
@@ -45,11 +45,63 @@ void efi_clear_bootdev(void)
}
/**
+ * calculate_paths() - Calculate the device and image patch from strings
+ *
+ * @dev: device, e.g. "MMC"
+ * @devnr: number of the device, e.g. "1:2"
+ * @path: path to file loaded
+ * @device_pathp: returns EFI device path
+ * @image_pathp: returns EFI image path
+ * Return: EFI_SUCCESS on success, else error code
+ */
+static efi_status_t calculate_paths(const char *dev, const char *devnr,
+ const char *path,
+ struct efi_device_path **device_pathp,
+ struct efi_device_path **image_pathp)
+{
+ struct efi_device_path *image, *device;
+ efi_status_t ret;
+
+#if IS_ENABLED(CONFIG_NETDEVICES)
+ if (!strcmp(dev, "Net") || !strcmp(dev, "Http")) {
+ ret = efi_net_set_dp(dev, devnr);
+ if (ret != EFI_SUCCESS)
+ return ret;
+ }
+#endif
+
+ ret = efi_dp_from_name(dev, devnr, path, &device, &image);
+ if (ret != EFI_SUCCESS)
+ return ret;
+
+ *device_pathp = device;
+ if (image) {
+ /* FIXME: image should not contain device */
+ struct efi_device_path *image_tmp = image;
+
+ efi_dp_split_file_path(image, &device, &image);
+ efi_free_pool(image_tmp);
+ }
+ *image_pathp = image;
+ log_debug("- boot device %pD\n", device);
+ if (image)
+ log_debug("- image %pD\n", image);
+
+ return EFI_SUCCESS;
+}
+
+/**
* efi_set_bootdev() - set boot device
*
* This function is called when a file is loaded, e.g. via the 'load' command.
* We use the path to this file to inform the UEFI binary about the boot device.
*
+ * For a valid image, it sets:
+ * - image_addr to the provided buffer
+ * - image_size to the provided buffer_size
+ * - bootefi_device_path to the EFI device-path
+ * - bootefi_image_path to the EFI image-path
+ *
* @dev: device, e.g. "MMC"
* @devnr: number of the device, e.g. "1:2"
* @path: path to file loaded
@@ -59,7 +111,6 @@ void efi_clear_bootdev(void)
void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
void *buffer, size_t buffer_size)
{
- struct efi_device_path *device, *image;
efi_status_t ret;
log_debug("dev=%s, devnr=%s, path=%s, buffer=%p, size=%zx\n", dev,
@@ -93,34 +144,12 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
image_addr = buffer;
image_size = buffer_size;
-#if IS_ENABLED(CONFIG_NETDEVICES)
- if (!strcmp(dev, "Net") || !strcmp(dev, "Http")) {
- ret = efi_net_set_dp(dev, devnr);
- if (ret != EFI_SUCCESS)
- goto error;
- }
-#endif
-
- ret = efi_dp_from_name(dev, devnr, path, &device, &image);
- if (ret != EFI_SUCCESS)
- goto error;
-
- bootefi_device_path = device;
- if (image) {
- /* FIXME: image should not contain device */
- struct efi_device_path *image_tmp = image;
-
- efi_dp_split_file_path(image, &device, &image);
- efi_free_pool(image_tmp);
+ ret = calculate_paths(dev, devnr, path, &bootefi_device_path,
+ &bootefi_image_path);
+ if (ret) {
+ log_debug("- efi_dp_from_name() failed, err=%lx\n", ret);
+ efi_clear_bootdev();
}
- bootefi_image_path = image;
- log_debug("- boot device %pD\n", device);
- if (image)
- log_debug("- image %pD\n", image);
- return;
-error:
- log_debug("- efi_dp_from_name() failed, err=%lx\n", ret);
- efi_clear_bootdev();
}
/**
@@ -130,7 +159,7 @@ error:
* @source_size: size of the UEFI image
* Return: status code
*/
-efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
+static efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
{
efi_handle_t mem_handle = NULL, handle;
struct efi_device_path *file_path = NULL;
diff --git a/lib/efi_loader/elf_efi.ldsi b/lib/efi_loader/elf_efi.ldsi
new file mode 100644
index 00000000000..190a88fb69e
--- /dev/null
+++ b/lib/efi_loader/elf_efi.ldsi
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * U-Boot EFI linker script include
+ *
+ * Modified from elf_aarch64_efi.lds in gnu-efi
+ */
+
+PHDRS
+{
+ data PT_LOAD FLAGS(3); /* SHF_WRITE | SHF_ALLOC */
+}
+
+ENTRY(_start)
+SECTIONS
+{
+ .text 0x0 : {
+ _text = .;
+ *(.text.head)
+ *(.text)
+ *(.text.*)
+ *(.gnu.linkonce.t.*)
+ *(.srodata)
+ *(.rodata*)
+ . = ALIGN(16);
+ *(.dynamic);
+ . = ALIGN(512);
+ }
+ .rela.dyn : { *(.rela.dyn) }
+ .rela.plt : { *(.rela.plt) }
+ .rela.got : { *(.rela.got) }
+ .rela.data : { *(.rela.data) *(.rela.data*) }
+ . = ALIGN(4096);
+ _etext = .;
+ _text_size = . - _text;
+ .data : {
+ _data = .;
+ *(.sdata)
+ *(.data)
+ *(.data1)
+ *(.data.*)
+ *(.got.plt)
+ *(.got)
+
+ /*
+ * The EFI loader doesn't seem to like a .bss section, so we
+ * stick it all into .data:
+ */
+ . = ALIGN(16);
+ _bss = .;
+ *(.sbss)
+ *(.scommon)
+ *(.dynbss)
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(512);
+ _bss_end = .;
+ _edata = .;
+ } :data
+ _data_size = _edata - _data;
+
+ . = ALIGN(4096);
+ .dynsym : { *(.dynsym) }
+ . = ALIGN(4096);
+ .dynstr : { *(.dynstr) }
+ . = ALIGN(4096);
+ .note.gnu.build-id : { *(.note.gnu.build-id) }
+ /DISCARD/ : {
+ *(.rel.reloc)
+ *(.eh_frame)
+ *(.note.GNU-stack)
+ }
+ .comment 0 : { *(.comment) }
+}
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 54403040f00..18993435eae 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -523,10 +523,10 @@ $(obj)/%.efi: $(obj)/%_efi.so
KBUILD_EFILDFLAGS = -nostdlib -zexecstack -znocombreloc -znorelro
KBUILD_EFILDFLAGS += $(call ld-option,--no-warn-rwx-segments)
quiet_cmd_efi_ld = LD $@
-cmd_efi_ld = $(LD) $(KBUILD_EFILDFLAGS) -T $(EFI_LDS_PATH) \
+cmd_efi_ld = $(LD) $(KBUILD_EFILDFLAGS) -L $(srctree) -T $(EFI_LDS_PATH) \
-shared -Bsymbolic -s $^ -o $@
-EFI_LDS_PATH = $(srctree)/arch/$(ARCH)/lib/$(EFI_LDS)
+EFI_LDS_PATH = arch/$(ARCH)/lib/$(EFI_LDS)
$(obj)/efi_crt0.o: $(srctree)/arch/$(ARCH)/lib/$(EFI_CRT0:.o=.S) FORCE
$(call if_changed_dep,as_o_S)