[U-Boot] [PATCH 4/6] x86: efi: Add EFI loader support for x86

Simon Glass sjg at chromium.org
Wed Aug 10 14:56:15 CEST 2016


Hi Alex,

On 10 August 2016 at 05:49, Alexander Graf <agraf at suse.de> wrote:
> On 08/07/2016 01:23 AM, Simon Glass wrote:
>>
>> Add the required pieces to support the EFI loader on x86.
>>
>> Since U-Boot only builds for 32-bit on x86, only a 32-bit EFI application
>> is supported. If a 64-bit kernel must be booted, U-Boot supports this
>> directly using FIT (see doc/uImage.FIT/kernel.its). U-Boot can act as a
>> payload for both 32-bit and 64-bit EFI.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>>   arch/x86/cpu/u-boot.lds       | 36 +++++++++++++++++++++++++++++++++++-
>>   arch/x86/lib/Makefile         |  1 +
>>   arch/x86/lib/sections.c       | 12 ++++++++++++
>>   include/efi.h                 |  3 ++-
>>   lib/efi_loader/efi_boottime.c |  9 +++++++++
>>   lib/efi_loader/efi_runtime.c  |  4 ++++
>>   6 files changed, 63 insertions(+), 2 deletions(-)
>>   create mode 100644 arch/x86/lib/sections.c
>>
>> diff --git a/arch/x86/cpu/u-boot.lds b/arch/x86/cpu/u-boot.lds
>> index 36f59ea..cca536b 100644
>> --- a/arch/x86/cpu/u-boot.lds
>> +++ b/arch/x86/cpu/u-boot.lds
>> @@ -28,7 +28,10 @@ SECTIONS
>>         }
>>         . = ALIGN(4);
>> -       .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
>> +       .rodata : {
>> +               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
>> +               KEEP(*(.rodata.efi.init));
>> +       }
>>         . = ALIGN(4);
>>         .data : { *(.data*) }
>> @@ -40,6 +43,37 @@ SECTIONS
>>         .got : { *(.got*) }
>>         . = 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);
>> +
>>         __data_end = .;
>>         __init_end = .;
>>   diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
>> index e17f0bb..e46e7f1 100644
>> --- a/arch/x86/lib/Makefile
>> +++ b/arch/x86/lib/Makefile
>> @@ -28,6 +28,7 @@ obj-y += pirq_routing.o
>>   obj-y += relocate.o
>>   obj-y += physmem.o
>>   obj-$(CONFIG_X86_RAMTEST) += ramtest.o
>> +obj-y  += sections.o
>>   obj-y += sfi.o
>>   obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o
>>   obj-y += string.o
>> diff --git a/arch/x86/lib/sections.c b/arch/x86/lib/sections.c
>> new file mode 100644
>> index 0000000..6455e0f
>> --- /dev/null
>> +++ b/arch/x86/lib/sections.c
>> @@ -0,0 +1,12 @@
>> +/*
>> + * Copyright 2013 Albert ARIBAUD <albert.u.boot at aribaud.net>
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +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")));
>> diff --git a/include/efi.h b/include/efi.h
>> index 1dbc3b7..47b351f 100644
>> --- a/include/efi.h
>> +++ b/include/efi.h
>> @@ -15,6 +15,7 @@
>>   #ifndef _EFI_H
>>   #define _EFI_H
>>   +#include <linux/linkage.h>
>>   #include <linux/string.h>
>>   #include <linux/types.h>
>>   @@ -22,7 +23,7 @@
>>   /* EFI uses the Microsoft ABI which is not the default for GCC */
>>   #define EFIAPI __attribute__((ms_abi))
>>   #else
>> -#define EFIAPI
>> +#define EFIAPI asmlinkage
>
>
> Ah, this should trigger what I mentioned in my previous email. Since
> linkage.h is now included in efi.h, we no longer have to include the header
> in bootefi.c explicitly. How about you just move this part of the patch
> between patches 1/6 and 2/6?

OK will take a look.

>
>
>>   #endif
>>     struct efi_device_path;
>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
>> index 798b566..e027bd3 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -39,6 +39,7 @@ static bool efi_is_direct_boot = true;
>>    */
>>   static struct efi_configuration_table EFI_RUNTIME_DATA
>> efi_conf_table[1];
>>   +#ifdef CONFIG_ARM
>>   /*
>>    * The "gd" pointer lives in a register on ARM and AArch64 that we
>> declare
>>    * fixed when compiling U-Boot. However, the payload does not know about
>> that
>> @@ -46,16 +47,20 @@ static struct efi_configuration_table EFI_RUNTIME_DATA
>> efi_conf_table[1];
>>    * EFI callback entry/exit.
>>    */
>>   static volatile void *efi_gd, *app_gd;
>> +#endif
>
>
> So is fs reserved for firmware use on x86?

No I don't think so. The correct approach would be to save and restore
the FS register, but it seems to work this way, so I haven't taken it
any further.

This series was just an attempt to get the EFI loader working on x86.
Since we have the 32/64-bit limitation on x86 and U-Boot runs in
32-bit at present, it's not going to be very useful yet IMO. But it is
a start.

>
>
> Alex
>

Regards,
Simon


More information about the U-Boot mailing list