[PATCH 9/9] ARM: add UEFI stub support
Ard Biesheuvel
ard.biesheuvel at linaro.org
Mon Oct 5 05:56:12 PDT 2015
On 5 October 2015 at 12:39, Ryan Harkin <ryan.harkin at linaro.org> wrote:
>
>
> On 2 October 2015 at 20:33, Ard Biesheuvel <ard.biesheuvel at linaro.org>
> wrote:
>>
>> 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?
>
>
> Sorry about that. As you suggested, I had spaces instead of tabs in your
> Makefile fix.
>
Well, it was probably the copy/paste at my end that caused the problem
in the first place.
> I compiles just fine now.
>
> And it also works when booting to busybox. So with your fix in place, you
> add a:
>
> Tested-by: Ryan Harkin <ryan.harkin at linaro.org>
>
Thanks a lot.
Which platform did you test btw?
--
Ard.
More information about the linux-arm-kernel
mailing list