From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v4 06/14] efi: Add support for a hello world test program
Date: Mon, 7 Nov 2016 08:47:08 -0700 [thread overview]
Message-ID: <1478533636-17577-7-git-send-email-sjg@chromium.org> (raw)
In-Reply-To: <1478533636-17577-1-git-send-email-sjg@chromium.org>
It is useful to have a basic sanity check for EFI loader support. Add a
'bootefi hello' command which loads HelloWord.efi and runs it under U-Boot.
Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v4:
- Move hello world test program into new patch
Changes in v3: None
Changes in v2: None
cmd/Kconfig | 9 +++++++++
cmd/bootefi.c | 27 +++++++++++++++++++++------
doc/README.efi | 22 ++++++++++++++++++++++
include/asm-generic/sections.h | 2 ++
lib/efi_loader/Makefile | 4 ++++
lib/efi_loader/helloworld.c | 24 ++++++++++++++++++++++++
scripts/Makefile.lib | 33 +++++++++++++++++++++++++++++++++
7 files changed, 115 insertions(+), 6 deletions(-)
create mode 100644 lib/efi_loader/helloworld.c
diff --git a/cmd/Kconfig b/cmd/Kconfig
index e339d86..a5d030b 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -181,6 +181,15 @@ config CMD_BOOTEFI
help
Boot an EFI image from memory.
+config CMD_BOOTEFI_HELLO
+ bool "Allow booting a standard EFI hello world for testing"
+ depends on CMD_BOOTEFI
+ help
+ This adds a standard EFI hello world application to U-Boot so that
+ it can be used with the 'bootefi hello' command. This is useful
+ for testing that EFI is working at a basic level, and for bringing
+ up EFI support on a new architecture.
+
config CMD_ELF
bool "bootelf, bootvx"
default y
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 3ab256e..ae1b713 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -239,13 +239,23 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if (argc < 2)
return CMD_RET_USAGE;
- saddr = argv[1];
+#ifdef CONFIG_CMD_BOOTEFI_HELLO
+ if (!strcmp(argv[1], "hello")) {
+ ulong size = __efi_hello_world_end - __efi_hello_world_begin;
- addr = simple_strtoul(saddr, NULL, 16);
+ addr = CONFIG_SYS_LOAD_ADDR;
+ memcpy((char *)addr, __efi_hello_world_begin, size);
+ } else
+#endif
+ {
+ saddr = argv[1];
- if (argc > 2) {
- sfdt = argv[2];
- fdt_addr = simple_strtoul(sfdt, NULL, 16);
+ addr = simple_strtoul(saddr, NULL, 16);
+
+ if (argc > 2) {
+ sfdt = argv[2];
+ fdt_addr = simple_strtoul(sfdt, NULL, 16);
+ }
}
printf("## Starting EFI application at %08lx ...\n", addr);
@@ -263,7 +273,12 @@ static char bootefi_help_text[] =
"<image address> [fdt address]\n"
" - boot EFI payload stored at address <image address>.\n"
" If specified, the device tree located at <fdt address> gets\n"
- " exposed as EFI configuration table.\n";
+ " exposed as EFI configuration table.\n"
+#ifdef CONFIG_CMD_BOOTEFI_HELLO
+ "hello\n"
+ " - boot a sample Hello World application stored within U-Boot"
+#endif
+ ;
#endif
U_BOOT_CMD(
diff --git a/doc/README.efi b/doc/README.efi
index 1fd3f00..6e76310 100644
--- a/doc/README.efi
+++ b/doc/README.efi
@@ -310,6 +310,28 @@ Removable media booting (search for /efi/boot/boota{a64,arm}.efi) is supported.
Simple use cases like "Plug this SD card into my ARM device and it just
boots into grub which boots into Linux", work very well.
+
+Running HelloWord.efi
+---------------------
+
+You can run a simple 'hello world' EFI program in U-Boot. This is not
+distributed in the U-Boot source, but you can download this patch:
+
+ https://goo.gl/vihiZS
+
+Then apply it, e.g.:
+
+ $ git am ~/Downloads/0001-efi-Add-test-program-binaries.patch
+
+and enable the option CONFIG_CMD_BOOTEFI_HELLO
+
+Then you can boot into U-Boot and type:
+
+ > bootefi hello
+
+The 'hello world EFI' program will then run, print a message and exit.
+
+
Future work
-----------
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index d69bc60..daf021b 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -22,6 +22,8 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
extern char __entry_text_start[], __entry_text_end[];
extern char __initdata_begin[], __initdata_end[];
extern char __start_rodata[], __end_rodata[];
+extern char __efi_hello_world_begin[];
+extern char __efi_hello_world_end[];
/* Start and end of .ctors section - used for constructor calls. */
extern char __ctors_start[], __ctors_end[];
diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile
index 12159dd..f466408 100644
--- a/lib/efi_loader/Makefile
+++ b/lib/efi_loader/Makefile
@@ -7,6 +7,10 @@
# This file only gets included with CONFIG_EFI_LOADER set, so all
# object inclusion implicitly depends on it
+CFLAGS_helloworld.o := $(CFLAGS_EFI)
+CFLAGS_REMOVE_helloworld.o := $(CFLAGS_NON_EFI)
+
+obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o
obj-y += efi_image_loader.o efi_boottime.o efi_runtime.o efi_console.o
obj-y += efi_memory.o
obj-$(CONFIG_LCD) += efi_gop.o
diff --git a/lib/efi_loader/helloworld.c b/lib/efi_loader/helloworld.c
new file mode 100644
index 0000000..03e65ab
--- /dev/null
+++ b/lib/efi_loader/helloworld.c
@@ -0,0 +1,24 @@
+/*
+ * EFI hello world
+ *
+ * Copyright (c) 2016 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <part_efi.h>
+#include <efi_api.h>
+
+efi_status_t EFIAPI efi_main(efi_handle_t handle,
+ struct efi_system_table *systable)
+{
+ struct efi_simple_text_output_protocol *con_out = systable->con_out;
+ struct efi_boot_services *boottime = systable->boottime;
+
+ con_out->output_string(con_out, L"Hello, world!\n");
+ boottime->exit(handle, 0, 0, NULL);
+
+ return EFI_SUCCESS;
+}
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 45a0e1d..956a8a9 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -321,6 +321,39 @@ cmd_S_ttf= \
$(obj)/%.S: $(src)/%.ttf
$(call cmd,S_ttf)
+# EFI Hello World application
+# ---------------------------------------------------------------------------
+
+# Generate an assembly file to wrap the EFI app
+cmd_S_efi= \
+( \
+ echo '.section .rodata.efi.init,"a"'; \
+ echo '.balign 16'; \
+ echo '.global __efi_hello_world_begin'; \
+ echo '__efi_hello_world_begin:'; \
+ echo '.incbin "$<" '; \
+ echo '__efi_hello_world_end:'; \
+ echo '.global __efi_hello_world_end'; \
+ echo '.balign 16'; \
+) > $@
+
+$(obj)/%_efi.S: $(obj)/%.efi
+ $(call cmd,S_efi)
+
+$(obj)/%.efi: $(obj)/%.so
+ $(OBJCOPY) -j .header -j .text -j .sdata -j .data -j .dynamic \
+ -j .dynsym -j .rel* -j .rela* -j .reloc \
+ $(if $(EFI_TARGET),$(EFI_TARGET),-O binary) $^ $@
+
+EFI_LDS_PATH = $(srctree)/arch/$(ARCH)/lib/$(EFI_LDS)
+
+$(obj)/helloworld.so: $(EFI_LDS_PATH)
+
+$(obj)/helloworld.so: $(obj)/helloworld.o arch/$(ARCH)/lib/$(EFI_CRT0) \
+ arch/$(ARCH)/lib/$(EFI_RELOC)
+ $(LD) -nostdlib -znocombreloc -T $(EFI_LDS_PATH) -shared -Bsymbolic \
+ $^ -o $@
+
# ACPI
# ---------------------------------------------------------------------------
quiet_cmd_acpi_c_asl= ASL $<
--
2.8.0.rc3.226.g39d4020
next prev parent reply other threads:[~2016-11-07 15:47 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-07 15:47 [U-Boot] [PATCH v4 00/14] efi: x86: Add EFI hello world and loader support for x86 Simon Glass
2016-11-07 15:47 ` [U-Boot] [PATCH v4 01/14] x86: Correct a build warning in x86 tables Simon Glass
2016-11-14 23:05 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 02/14] efi: Correct cache flush alignment Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot,v4,02/14] " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 03/14] efi: Fix debug message address format Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 04/14] x86: Tidy up selection of building the EFI stub Simon Glass
2016-11-14 23:05 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 05/14] efi: Makefile: Export variables for use with EFI Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` Simon Glass [this message]
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, 06/14] efi: Add support for a hello world test program Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 07/14] elf: arm: Add a few ARM relocation types Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 08/14] efi: arm: Add EFI app support Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot,v4,08/14] " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 09/14] efi: arm: Add aarch64 " Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 10/14] efi: arm: Enable the hello world test program Simon Glass
2016-11-07 15:47 ` [U-Boot] [PATCH v4 11/14] x86: Move efi .lds files into the 'lib' directory Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 12/14] x86: Move efi .S " Simon Glass
2016-11-14 23:05 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 13/14] efi: x86: Adjust EFI files support efi_loader Simon Glass
2016-11-14 23:06 ` [U-Boot] [U-Boot, v4, " Alexander Graf
2016-11-07 15:47 ` [U-Boot] [PATCH v4 14/14] x86: Enable EFI loader support Simon Glass
2016-11-14 23:05 ` [U-Boot] [U-Boot,v4,14/14] " Alexander Graf
2016-11-14 21:39 ` [U-Boot] [PATCH v4 00/14] efi: x86: Add EFI hello world and loader support for x86 Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1478533636-17577-7-git-send-email-sjg@chromium.org \
--to=sjg@chromium.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.