[PATCH 9/9] ARM: add UEFI stub support

Ard Biesheuvel ard.biesheuvel at linaro.org
Fri Oct 2 12:33:02 PDT 2015


On 2 October 2015 at 20:50, Ryan Harkin <ryan.harkin at linaro.org> wrote:
>
>
> On 2 October 2015 at 19:07, Ard Biesheuvel <ard.biesheuvel at linaro.org>
> wrote:
>>
>> On 2 October 2015 at 20:03, Ard Biesheuvel <ard.biesheuvel at linaro.org>
>> wrote:
>> > On 2 October 2015 at 18:29, Ryan Harkin <ryan.harkin at linaro.org> wrote:
>> >> Hi Ard/Roy,
>> >>
>> >> On 1 October 2015 at 18:04, Ard Biesheuvel <ard.biesheuvel at linaro.org>
>> >> wrote:
>> >>>
>> >>> From: Roy Franz <roy.franz at linaro.org>
>> >>>
>> >>> This patch adds EFI stub support for the ARM Linux kernel.
>> >>>
>> >>> The EFI stub operates similarly to the x86 and arm64 stubs: it is a
>> >>> shim between the EFI firmware and the normal zImage entry point, and
>> >>> sets up the environment that the zImage is expecting. This includes
>> >>> optionally loading the initrd and device tree from the system
>> >>> partition
>> >>> based on the kernel command line.
>> >>>
>> >>> Signed-off-by: Roy Franz <roy.franz at linaro.org>
>> >>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
>> >>> ---
>> >>>  arch/arm/Kconfig                       |  19 +++
>> >>>  arch/arm/boot/compressed/Makefile      |   5 +-
>> >>>  arch/arm/boot/compressed/efi-header.S  | 130 ++++++++++++++++++++
>> >>>  arch/arm/boot/compressed/efi-stub.c    |  89 ++++++++++++++
>> >>>  arch/arm/boot/compressed/head.S        |  54 +++++++-
>> >>>  arch/arm/boot/compressed/vmlinux.lds.S |   7 ++
>> >>>  arch/arm/include/asm/efi.h             |  23 ++++
>> >>>  drivers/firmware/efi/libstub/Makefile  |  12 ++
>> >>>  8 files changed, 336 insertions(+), 3 deletions(-)
>> >>>
>> >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> >>> index e4b7d6cfd8eb..6d7fd83c2ee4 100644
>> >>> --- a/arch/arm/Kconfig
>> >>> +++ b/arch/arm/Kconfig
>> >>> @@ -2061,6 +2061,25 @@ config AUTO_ZRELADDR
>> >>>           0xf8000000. This assumes the zImage being placed in the
>> >>> first
>> >>> 128MB
>> >>>           from start of memory.
>> >>>
>> >>> +config EFI_STUB
>> >>> +       bool
>> >>> +
>> >>> +config EFI
>> >>> +       bool "UEFI runtime support"
>> >>> +       depends on OF && !CPU_BIG_ENDIAN && MMU && AUTO_ZRELADDR &&
>> >>> !XIP_KERNEL
>> >>> +       select UCS2_STRING
>> >>> +       select EFI_PARAMS_FROM_FDT
>> >>> +       select EFI_STUB
>> >>> +       select EFI_ARMSTUB
>> >>> +       select EFI_RUNTIME_WRAPPERS
>> >>
>> >>
>> >> Should we make this "default y" like ARM64?  I think so.
>> >>
>> >>
>> >
>> > It is not necessarily something that should be enabled by default,
>> > imo. The distro kernels will probably enabled it, which is good enough
>> > for me.
>
>
> That's fair enough.  I think it is default for arm64, hence why I asked.
> But I can enable it myself in my own configs easily enough.
>
>> >
>> >>> +       ---help---
>> >>> +         This option provides support for runtime services provided
>> >>> +         by UEFI firmware (such as non-volatile variables, realtime
>> >>> +         clock, and platform reset). A UEFI stub is also provided to
>> >>> +         allow the kernel to be booted as an EFI application. This
>> >>> +         is only useful for kernels that may run on systems that have
>> >>> +         UEFI firmware.
>> >>> +
>> >>>  endmenu
>> >>>
>> >>>  menu "CPU Power Management"
>> >>> diff --git a/arch/arm/boot/compressed/Makefile
>> >>> b/arch/arm/boot/compressed/Makefile
>> >>> index 3f9a9ebc77c3..0e5624d6215d 100644
>> >>> --- a/arch/arm/boot/compressed/Makefile
>> >>> +++ b/arch/arm/boot/compressed/Makefile
>> >>> @@ -167,9 +167,12 @@ if [ $(words $(ZRELADDR)) -gt 1 -a
>> >>> "$(CONFIG_AUTO_ZRELADDR)" = "" ]; then \
>> >>>         false; \
>> >>>  fi
>> >>>
>> >>> +efi-obj-$(CONFIG_EFI_STUB) := $(obj)/efi-stub.o $(obj)/efi-banner.o \
>> >>
>> >>
>> >> When I try to compile the kernel from your branch, I get:
>> >>
>> >> make[2]: *** No rule to make target
>> >> 'arch/arm/boot/compressed/efi-banner.o',
>> >> needed by 'arch/arm/boot/compressed/vmlinux'. Stop.
>> >>
>> >> Did I miss something or is this a problem?
>> >>
>> >
>> > It was I who missed something: I have been reshuffling some bits, and
>> > this fell through the cracks. I didn't spot it since I apparently did
>> > not try to rebuild it cleanly.
>> >
>> > I would like to get rid of the linux_banner reference in the stub
>> > completely, and I posted a patch here
>> >
>>
>> Where? Here:
>> http://marc.info/?l=linux-arm-kernel&m=144313135923256
>>
>> > In the mean time, could you try with this folded in?
>> >
>> > -------------------8<--------------------
>> > diff --git a/arch/arm/boot/compressed/Makefile
>> > b/arch/arm/boot/compressed/Makefile
>> > index 0e5624d6215d..a6aa7f9123a2 100644
>> > --- a/arch/arm/boot/compressed/Makefile
>> > +++ b/arch/arm/boot/compressed/Makefile
>> > @@ -170,6 +170,10 @@ fi
>> >  efi-obj-$(CONFIG_EFI_STUB) := $(obj)/efi-stub.o $(obj)/efi-banner.o \
>> >
>> > $(objtree)/drivers/firmware/efi/libstub/lib.a
>> >
>> > +$(obj)/efi-banner.o: OBJCOPYFLAGS=-j .rodata
>> > +$(obj)/efi-banner.o: $(objtree)/init/version.o FORCE
>> > +       $(call if_changed,objcopy)
>> > +
>> >  $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD)
>> > $(obj)/piggy.$(suffix_y).o \
>> >                 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) \
>> >                 $(bswapsdi2) $(efi-obj-y) FORCE
>> > diff --git a/drivers/firmware/efi/libstub/fdt.c
>> > b/drivers/firmware/efi/libstub/fdt.c
>> > index a7e87cd582f2..f45a6f715e73 100644
>> > --- a/drivers/firmware/efi/libstub/fdt.c
>> > +++ b/drivers/firmware/efi/libstub/fdt.c
>> > @@ -16,6 +16,8 @@
>> >
>> >  #include "efistub.h"
>> >
>> > +extern __attribute__((__visibility__("hidden"))) const char
>> > linux_banner[];
>> > +
>> >  efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
>> >                         unsigned long orig_fdt_size,
>> >                         void *fdt, int new_fdt_size, char *cmdline_ptr,
>> > -------------------8<--------------------
>> >
>
> Now I get a slightly different error, but it amounts to the same thing:
>
> arm-linux-gnueabi-ld: cannot find arch/arm/boot/compressed/efi-banner.o: No
> such file or directory
>

Strange. So did it actually build efi-banner.o ?
Could you check if the leading tabs in the Makefile hunks got pasted ok?

-- 
Ard.



More information about the linux-arm-kernel mailing list