From: Alexander Graf <agraf@suse.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 06/14] efi_loader: Add runtime services
Date: Tue, 2 Feb 2016 00:57:07 +0100 [thread overview]
Message-ID: <56AFF0D3.7000906@suse.de> (raw)
In-Reply-To: <CAPnjgZ1zxdfOZn9fMR-O38FiEQYjgYdXrr7Zquuuvr9Pwo2Kzg@mail.gmail.com>
On 01/31/2016 04:20 PM, Simon Glass wrote:
> Hi Alexander,
>
> On 14 January 2016 at 22:06, Alexander Graf <agraf@suse.de> wrote:
>> After booting has finished, EFI allows firmware to still interact with the OS
>> using the "runtime services". These callbacks live in a separate address space,
>> since they are available long after U-Boot has been overwritten by the OS.
>>
>> This patch adds enough framework for arbitrary code inside of U-Boot to become
>> a runtime service with the right section attributes set. For now, we don't make
>> use of it yet though.
>>
>> We could maybe in the future map U-boot environment variables to EFI variables
>> here.
>>
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>>
>> ---
>>
>> v1 -> v2:
>>
>> - Fix runtime service sections
>> - Add runtime detach
>> - Enable runtime relocations
>> - Add get_time
>> - Fix relocation
>> - Fix 32bit
>> - Add am335x support
>> - Move section definition to header
>> - Add systab to runtime section
>> - Add self-relocation hook table
>> - Fix self-relocation
>> - Relocate efi_runtime section early during bootup
>> - Fix return values for a number of callbacks to be more UEFI compliant
>> - Move to GPLv2+
>> ---
>> arch/arm/config.mk | 4 +
>> arch/arm/cpu/armv8/u-boot.lds | 16 +++
>> arch/arm/cpu/u-boot.lds | 30 +++++
>> arch/arm/lib/sections.c | 4 +
>> board/ti/am335x/u-boot.lds | 30 +++++
>> common/board_r.c | 4 +
>> include/efi_loader.h | 10 ++
>> lib/efi_loader/efi_boottime.c | 6 +-
>> lib/efi_loader/efi_runtime.c | 300 ++++++++++++++++++++++++++++++++++++++++++
>> 9 files changed, 401 insertions(+), 3 deletions(-)
>> create mode 100644 lib/efi_loader/efi_runtime.c
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> A few nits.
>
>> diff --git a/arch/arm/config.mk b/arch/arm/config.mk
>> index 0550225..ecb956d 100644
>> --- a/arch/arm/config.mk
>> +++ b/arch/arm/config.mk
>> @@ -120,6 +120,10 @@ ifdef CONFIG_OF_EMBED
>> OBJCOPYFLAGS += -j .dtb.init.rodata
>> endif
>>
>> +ifdef CONFIG_EFI_LOADER
>> +OBJCOPYFLAGS += -j .efi_runtime -j .efi_runtime_rel
>> +endif
>> +
>> ifneq ($(CONFIG_IMX_CONFIG),)
>> ifdef CONFIG_SPL
>> ifndef CONFIG_SPL_BUILD
>> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
>> index 4c12222..fd15ad5 100644
>> --- a/arch/arm/cpu/armv8/u-boot.lds
>> +++ b/arch/arm/cpu/armv8/u-boot.lds
>> @@ -42,6 +42,22 @@ SECTIONS
>>
>> . = ALIGN(8);
>>
>> + .efi_runtime : {
>> + __efi_runtime_start = .;
>> + *(efi_runtime_text)
>> + *(efi_runtime_data)
>> + __efi_runtime_stop = .;
>> + }
>> +
>> + .efi_runtime_rel : {
>> + __efi_runtime_rel_start = .;
>> + *(.relaefi_runtime_text)
>> + *(.relaefi_runtime_data)
>> + __efi_runtime_rel_stop = .;
>> + }
>> +
>> + . = ALIGN(8);
>> +
>> .image_copy_end :
>> {
>> *(.__image_copy_end)
>> diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds
>> index d48a905..596a17d 100644
>> --- a/arch/arm/cpu/u-boot.lds
>> +++ b/arch/arm/cpu/u-boot.lds
>> @@ -89,6 +89,36 @@ SECTIONS
>>
>> . = ALIGN(4);
>>
>> + .__efi_runtime_start : {
>> + *(.__efi_runtime_start)
>> + }
>> +
>> + .efi_runtime : {
>> + *(efi_runtime_text)
>> + *(efi_runtime_data)
>> + }
>> +
>> + .__efi_runtime_stop : {
>> + *(.__efi_runtime_stop)
>> + }
>> +
>> + .efi_runtime_rel_start :
>> + {
>> + *(.__efi_runtime_rel_start)
>> + }
>> +
>> + .efi_runtime_rel : {
>> + *(.relefi_runtime_text)
>> + *(.relefi_runtime_data)
>> + }
>> +
>> + .efi_runtime_rel_stop :
>> + {
>> + *(.__efi_runtime_rel_stop)
>> + }
>> +
>> + . = ALIGN(4);
>> +
>> .image_copy_end :
>> {
>> *(.__image_copy_end)
>> diff --git a/arch/arm/lib/sections.c b/arch/arm/lib/sections.c
>> index a1205c3..6a94522 100644
>> --- a/arch/arm/lib/sections.c
>> +++ b/arch/arm/lib/sections.c
>> @@ -27,4 +27,8 @@ char __rel_dyn_start[0] __attribute__((section(".__rel_dyn_start")));
>> char __rel_dyn_end[0] __attribute__((section(".__rel_dyn_end")));
>> char __secure_start[0] __attribute__((section(".__secure_start")));
>> char __secure_end[0] __attribute__((section(".__secure_end")));
>> +char __efi_runtime_start[0] __attribute__((section(".__efi_runtime_start")));
>> +char __efi_runtime_stop[0] __attribute__((section(".__efi_runtime_stop")));
>> +char __efi_runtime_rel_start[0] __attribute__((section(".__efi_runtime_rel_start")));
>> +char __efi_runtime_rel_stop[0] __attribute__((section(".__efi_runtime_rel_stop")));
>> char _end[0] __attribute__((section(".__end")));
>> diff --git a/board/ti/am335x/u-boot.lds b/board/ti/am335x/u-boot.lds
>> index 78f294a..a56cc82 100644
>> --- a/board/ti/am335x/u-boot.lds
>> +++ b/board/ti/am335x/u-boot.lds
>> @@ -59,6 +59,36 @@ SECTIONS
>>
>> . = ALIGN(4);
>>
>> + .__efi_runtime_start : {
>> + *(.__efi_runtime_start)
>> + }
>> +
>> + .efi_runtime : {
>> + *(efi_runtime_text)
>> + *(efi_runtime_data)
>> + }
>> +
>> + .__efi_runtime_stop : {
>> + *(.__efi_runtime_stop)
>> + }
>> +
>> + .efi_runtime_rel_start :
>> + {
>> + *(.__efi_runtime_rel_start)
>> + }
>> +
>> + .efi_runtime_rel : {
>> + *(.relefi_runtime_text)
>> + *(.relefi_runtime_data)
>> + }
>> +
>> + .efi_runtime_rel_stop :
>> + {
>> + *(.__efi_runtime_rel_stop)
>> + }
>> +
>> + . = ALIGN(4);
>> +
>> .image_copy_end :
>> {
>> *(.__image_copy_end)
>> diff --git a/common/board_r.c b/common/board_r.c
>> index 75ee43e..420e2c8 100644
>> --- a/common/board_r.c
>> +++ b/common/board_r.c
>> @@ -64,6 +64,7 @@
>> #ifdef CONFIG_AVR32
>> #include <asm/arch/mmu.h>
>> #endif
>> +#include <efi_loader.h>
>>
>> DECLARE_GLOBAL_DATA_PTR;
>>
>> @@ -176,6 +177,9 @@ static int initr_reloc_global_data(void)
>> */
>> gd->fdt_blob += gd->reloc_off;
>> #endif
>> +#ifdef CONFIG_EFI_LOADER
>> + efi_runtime_relocate(gd->relocaddr, NULL);
>> +#endif
>>
>> return 0;
>> }
>> diff --git a/include/efi_loader.h b/include/efi_loader.h
>> index d314002..0f821ff 100644
>> --- a/include/efi_loader.h
>> +++ b/include/efi_loader.h
>> @@ -29,6 +29,7 @@
>>
>> #define EFI_EXIT(ret) efi_exit_func(ret);
>>
>> +extern struct efi_runtime_services efi_runtime_services;
>> extern struct efi_system_table systab;
>>
>> extern const struct efi_simple_text_output_protocol efi_con_out;
>> @@ -39,6 +40,9 @@ extern const efi_guid_t efi_guid_console_control;
>> extern const efi_guid_t efi_guid_device_path;
>> extern const efi_guid_t efi_guid_loaded_image;
>>
>> +extern unsigned int __efi_runtime_start, __efi_runtime_stop;
>> +extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
>> +
>> struct efi_class_map {
>> const efi_guid_t *guid;
>> const void *interface;
>> @@ -68,12 +72,18 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info);
>> void efi_save_gd(void);
>> void efi_restore_gd(void);
>> efi_status_t efi_exit_func(efi_status_t ret);
>> +void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
> Function comment please.
>
>> #define EFI_LOADER_POOL_SIZE (128 * 1024 * 1024)
>> void *efi_loader_alloc(uint64_t len);
>>
>> +#define EFI_RUNTIME_DATA __attribute__ ((section ("efi_runtime_data")))
>> +#define EFI_RUNTIME_TEXT __attribute__ ((section ("efi_runtime_text")))
>> +
>> #else /* defined(EFI_LOADER) */
>>
>> +#define EFI_RUNTIME_DATA
>> +#define EFI_RUNTIME_TEXT
>> static inline void efi_restore_gd(void) { }
>>
>> #endif
>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
>> index 5756c9c..45217ef 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -36,7 +36,7 @@ static bool efi_is_direct_boot = true;
>> * In most cases we want to pass an FDT to the payload, so reserve one slot of
>> * config table space for it. The pointer gets populated by do_bootefi_exec().
>> */
>> -static struct efi_configuration_table efi_conf_table[] = {
>> +static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[] = {
>> {
>> .guid = EFI_FDT_GUID,
>> },
>> @@ -741,10 +741,10 @@ static const struct efi_boot_services efi_boot_services = {
>> };
>>
>>
>> -static uint16_t firmware_vendor[] =
>> +static uint16_t EFI_RUNTIME_DATA firmware_vendor[] =
>> { 'D','a','s',' ','U','-','b','o','o','t',0 };
>>
>> -struct efi_system_table systab = {
>> +struct efi_system_table EFI_RUNTIME_DATA systab = {
>> .hdr = {
>> .signature = EFI_SYSTEM_TABLE_SIGNATURE,
>> .revision = 0x20005, /* 2.5 */
>> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
>> new file mode 100644
>> index 0000000..b7aa1e9
>> --- /dev/null
>> +++ b/lib/efi_loader/efi_runtime.c
>> @@ -0,0 +1,300 @@
>> +/*
>> + * EFI application runtime services
>> + *
>> + * Copyright (c) 2016 Alexander Graf
>> + *
>> + * SPDX-License-Identifier: GPL-2.0+
>> + */
>> +
>> +#include <common.h>
> You use driver model so need <dm.h> too.
>
>> +#include <efi_loader.h>
>> +#include <command.h>
>> +#include <asm/global_data.h>
>> +#include <rtc.h>
>> +
>> +/* For manual relocation support */
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static efi_status_t EFI_RUNTIME_TEXT efi_unimplemented(void);
>> +static efi_status_t EFI_RUNTIME_TEXT efi_device_error(void);
>> +static efi_status_t EFI_RUNTIME_TEXT efi_invalid_parameter(void);
>> +
>> +#if defined(CONFIG_ARM64)
>> +#define R_RELATIVE 1027
>> +#define R_MASK 0xffffffffULL
>> +#define IS_RELA 1
>> +#elif defined(CONFIG_ARM)
>> +#define R_RELATIVE 23
>> +#define R_MASK 0xffULL
>> +#else
>> +#error Need to add relocation awareness
>> +#endif
>> +
>> +struct elf_rel {
>> + ulong *offset;
>> + ulong info;
>> +};
>> +
>> +struct elf_rela {
>> + ulong *offset;
>> + ulong info;
>> + long addend;
>> +};
> Can you use elf.h?
I could, but elf.h has a hard distinction between 32bit and 64bit
binaries while I really just want the one the binary is actually using
at this specific moment.
So I could add #ifdefs on 32bit vs 64bit and then use the elf.h defines
instead, but I'm not sure the code would look any more readable than it
is now after that ;).
>
>> +
>> +/*
>> + * EFI Runtime code lives in 2 stages. In the first stage, U-Boot and an EFI
>> + * payload are running concurrently at the same time. In this mode, we can
>> + * handle a good number of runtime callbacks
>> + */
>> +
>> +static void efi_reset_system(enum efi_reset_type reset_type,
>> + efi_status_t reset_status, unsigned long data_size,
>> + void *reset_data)
>> +{
>> + EFI_ENTRY("%d %lx %lx %p", reset_type, reset_status, data_size, reset_data);
>> +
>> + switch (reset_type) {
>> + case EFI_RESET_COLD:
>> + case EFI_RESET_WARM:
>> + do_reset(NULL, 0, 0, NULL);
>> + break;
>> + case EFI_RESET_SHUTDOWN:
>> + /* We don't have anything to map this to */
>> + break;
>> + }
>> +
>> + EFI_EXIT(EFI_SUCCESS);
>> +}
>> +
>> +static efi_status_t efi_get_time(struct efi_time *time,
>> + struct efi_time_cap *capabilities)
>> +{
>> +#ifdef CONFIG_CMD_DATE
>> +
>> + struct rtc_time tm;
>> + int r;
>> +#ifdef CONFIG_DM_RTC
> Since this is a new service I don't think you need to support the old RTC API.
ok
Alex
next prev parent reply other threads:[~2016-02-01 23:57 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-15 5:06 [U-Boot] [PATCH 00/14] EFI payload / application support v2 Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 01/14] disk/part.c: Expose list of available block drivers Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 02/14] include/efi_api.h: Add more detailed API definitions Alexander Graf
2016-01-31 15:17 ` Simon Glass
2016-02-01 22:46 ` Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 03/14] efi_loader: Add PE image loader Alexander Graf
2016-01-31 15:18 ` Simon Glass
2016-02-01 22:58 ` Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 04/14] efi_loader: Add boot time services Alexander Graf
2016-01-20 0:16 ` Leif Lindholm
2016-02-02 1:52 ` Alexander Graf
2016-01-31 15:19 ` Simon Glass
2016-02-01 23:45 ` Alexander Graf
2016-02-01 23:54 ` Simon Glass
2016-02-02 0:02 ` Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 05/14] efi_loader: Add console interface Alexander Graf
2016-01-31 15:19 ` Simon Glass
2016-01-15 5:06 ` [U-Boot] [PATCH 06/14] efi_loader: Add runtime services Alexander Graf
2016-01-21 17:20 ` Leif Lindholm
2016-01-31 15:20 ` Simon Glass
2016-02-01 23:57 ` Alexander Graf [this message]
2016-01-15 5:06 ` [U-Boot] [PATCH 07/14] efi_loader: Add disk interfaces Alexander Graf
2016-01-31 15:23 ` Simon Glass
2016-02-02 0:32 ` Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 08/14] efi_loader: Add "bootefi" command Alexander Graf
2016-01-31 15:23 ` Simon Glass
2016-01-15 5:06 ` [U-Boot] [PATCH 09/14] efi_loader: Implement memory allocation and map Alexander Graf
2016-01-31 15:23 ` Simon Glass
2016-02-02 0:59 ` Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 10/14] arm64: Allow exceptions to return Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 11/14] arm64: Allow EFI payload code to take exceptions Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 12/14] efi_loader: Add DCACHE_OFF support for arm64 Alexander Graf
2016-01-15 5:06 ` [U-Boot] [PATCH 13/14] efi_loader: hook up in build environment Alexander Graf
2016-01-31 15:24 ` Simon Glass
2016-01-15 5:06 ` [U-Boot] [PATCH 14/14] efi_loader: Add distro boot script for removable media Alexander Graf
2016-01-31 15:24 ` Simon Glass
2016-02-02 1:05 ` Alexander Graf
2016-01-31 15:17 ` [U-Boot] [PATCH 00/14] EFI payload / application support v2 Simon Glass
2016-01-31 21:43 ` Alexander Graf
2016-02-01 2:52 ` Simon Glass
2016-02-01 3:25 ` Simon Glass
2016-02-01 21:38 ` Alexander Graf
2016-02-02 0:02 ` Simon Glass
2016-02-02 0:16 ` Alexander Graf
2016-02-02 0:28 ` 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=56AFF0D3.7000906@suse.de \
--to=agraf@suse.de \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox