]> git.dujemihanovic.xyz Git - linux.git/commitdiff
efi/zboot: arm64: Inject kernel code size symbol into the zboot payload
authorArd Biesheuvel <ardb@kernel.org>
Tue, 18 Apr 2023 13:49:49 +0000 (15:49 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Wed, 26 Apr 2023 16:01:41 +0000 (18:01 +0200)
The EFI zboot code is not built as part of the kernel proper, like the
ordinary EFI stub, but still needs access to symbols that are defined
only internally in the kernel, and are left unexposed deliberately to
avoid creating ABI inadvertently that we're stuck with later.

So capture the kernel code size of the kernel image, and inject it as an
ELF symbol into the object that contains the compressed payload, where
it will be accessible to zboot code that needs it.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
arch/arm64/boot/Makefile
arch/arm64/kernel/image-vars.h
drivers/firmware/efi/libstub/Makefile.zboot
drivers/firmware/efi/libstub/zboot.lds

index ae645fda90bca5745d447b175929526f50a77367..1761f5972443fc5086b433464880e3eaf9ef52e5 100644 (file)
@@ -44,4 +44,7 @@ EFI_ZBOOT_BFD_TARGET  := elf64-littleaarch64
 EFI_ZBOOT_MACH_TYPE    := ARM64
 EFI_ZBOOT_FORWARD_CFI  := $(CONFIG_ARM64_BTI_KERNEL)
 
+EFI_ZBOOT_OBJCOPY_FLAGS        = --add-symbol zboot_code_size=0x$(shell \
+                               $(NM) vmlinux|grep _kernel_codesize|cut -d' ' -f1)
+
 include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot
index 8309197c0ebd4a8e88ef018f9d0986ee8a014808..35f3c795951373549faad3ed2d1bd30ad427eb78 100644 (file)
@@ -108,4 +108,8 @@ KVM_NVHE_ALIAS(kvm_protected_mode_initialized);
 
 #endif /* CONFIG_KVM */
 
+#ifdef CONFIG_EFI_ZBOOT
+_kernel_codesize = ABSOLUTE(__inittext_end - _text);
+#endif
+
 #endif /* __ARM64_KERNEL_IMAGE_VARS_H */
index 0a9dcc2b13736519eb01522093d6872b827d4cd8..1b101d9076fd49e549901aa9b15af3d2eeaa21cf 100644 (file)
@@ -40,7 +40,7 @@ quiet_cmd_compwithsize = $(quiet_cmd_$(zboot-method-y))
 $(obj)/vmlinuz: $(obj)/vmlinux.bin FORCE
        $(call if_changed,compwithsize)
 
-OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) \
+OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) $(EFI_ZBOOT_OBJCOPY_FLAGS) \
                          --rename-section .data=.gzdata,load,alloc,readonly,contents
 $(obj)/vmlinuz.o: $(obj)/vmlinuz FORCE
        $(call if_changed,objcopy)
index 93d33f68333b2b68b25eab27770921ae1d04834d..ac8c0ef851581f5d3eb51260ac1d2a6b92955bb6 100644 (file)
@@ -2,6 +2,8 @@
 
 ENTRY(__efistub_efi_zboot_header);
 
+PROVIDE(zboot_code_size = ABSOLUTE(0));
+
 SECTIONS
 {
        .head : ALIGN(4096) {
@@ -17,6 +19,11 @@ SECTIONS
                *(.gzdata)
                __efistub__gzdata_end = .;
                *(.rodata* .init.rodata* .srodata*)
+
+               . = ALIGN(4);
+               __efistub_code_size = .;
+               LONG(zboot_code_size);
+
                _etext = ALIGN(4096);
                . = _etext;
        }