Commit 1f1ba325 authored by Ard Biesheuvel's avatar Ard Biesheuvel

efi: libstub: Add image code and data size to the zimage metadata

In order to be able to switch from LoadImage() [which treats the
supplied PE/COFF image as file input only, and reconstructs the memory
image based on the section descriptors] to a mode where we allocate the
memory directly, and invoke the image in place, we need to now how much
memory to allocate beyond the end of the image. So copy this information
from the payload's PE/COFF header to the end of the compressed version
of the payload, so that the decompressor app can access it before
performing the decompression itself.

We'll also need to size of the code region once we switch arm64 to
jumping to the kernel proper with MMU and caches enabled, so let's
capture that information as well. Note that SizeOfCode does not account
for the header, so we need SizeOfHeaders as well.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 42c8ea3d
...@@ -10,18 +10,17 @@ comp-type-$(CONFIG_KERNEL_LZO) := lzo ...@@ -10,18 +10,17 @@ comp-type-$(CONFIG_KERNEL_LZO) := lzo
comp-type-$(CONFIG_KERNEL_XZ) := xzkern comp-type-$(CONFIG_KERNEL_XZ) := xzkern
comp-type-$(CONFIG_KERNEL_ZSTD) := zstd22 comp-type-$(CONFIG_KERNEL_ZSTD) := zstd22
# in GZIP, the appended le32 carrying the uncompressed size is part of the # Copy the SizeOfHeaders, SizeOfCode and SizeOfImage fields from the payload to
# format, but in other cases, we just append it at the end for convenience, # the end of the compressed image. Note that this presupposes a PE header
# causing the original tools to complain when checking image integrity. # offset of 64 bytes, which is what arm64, RISC-V and LoongArch use.
# So disregard it when calculating the payload size in the zimage header. quiet_cmd_compwithsize = $(quiet_cmd_$(comp-type-y))
zboot-method-y := $(comp-type-y)_with_size cmd_compwithsize = $(cmd_$(comp-type-y)) && ( \
zboot-size-len-y := 4 dd status=none if=$< bs=4 count=1 skip=37 ; \
dd status=none if=$< bs=4 count=1 skip=23 ; \
zboot-method-$(CONFIG_KERNEL_GZIP) := gzip dd status=none if=$< bs=4 count=1 skip=36 ) >> $@
zboot-size-len-$(CONFIG_KERNEL_GZIP) := 0
$(obj)/vmlinuz: $(obj)/$(EFI_ZBOOT_PAYLOAD) FORCE $(obj)/vmlinuz: $(obj)/$(EFI_ZBOOT_PAYLOAD) FORCE
$(call if_changed,$(zboot-method-y)) $(call if_changed,compwithsize)
OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) \ OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) \
--rename-section .data=.gzdata,load,alloc,readonly,contents --rename-section .data=.gzdata,load,alloc,readonly,contents
...@@ -30,7 +29,6 @@ $(obj)/vmlinuz.o: $(obj)/vmlinuz FORCE ...@@ -30,7 +29,6 @@ $(obj)/vmlinuz.o: $(obj)/vmlinuz FORCE
AFLAGS_zboot-header.o += -DMACHINE_TYPE=IMAGE_FILE_MACHINE_$(EFI_ZBOOT_MACH_TYPE) \ AFLAGS_zboot-header.o += -DMACHINE_TYPE=IMAGE_FILE_MACHINE_$(EFI_ZBOOT_MACH_TYPE) \
-DZBOOT_EFI_PATH="\"$(realpath $(obj)/vmlinuz.efi.elf)\"" \ -DZBOOT_EFI_PATH="\"$(realpath $(obj)/vmlinuz.efi.elf)\"" \
-DZBOOT_SIZE_LEN=$(zboot-size-len-y) \
-DCOMP_TYPE="\"$(comp-type-y)\"" -DCOMP_TYPE="\"$(comp-type-y)\""
$(obj)/zboot-header.o: $(srctree)/drivers/firmware/efi/libstub/zboot-header.S FORCE $(obj)/zboot-header.o: $(srctree)/drivers/firmware/efi/libstub/zboot-header.S FORCE
...@@ -46,4 +44,4 @@ OBJCOPYFLAGS_vmlinuz.efi := -O binary ...@@ -46,4 +44,4 @@ OBJCOPYFLAGS_vmlinuz.efi := -O binary
$(obj)/vmlinuz.efi: $(obj)/vmlinuz.efi.elf FORCE $(obj)/vmlinuz.efi: $(obj)/vmlinuz.efi.elf FORCE
$(call if_changed,objcopy) $(call if_changed,objcopy)
targets += zboot-header.o vmlinuz vmlinuz.o vmlinuz.efi.elf vmlinuz.efi targets += zboot-header.o vmlinuz.o vmlinuz.efi.elf vmlinuz.efi
...@@ -17,7 +17,7 @@ __efistub_efi_zboot_header: ...@@ -17,7 +17,7 @@ __efistub_efi_zboot_header:
.long MZ_MAGIC .long MZ_MAGIC
.ascii "zimg" // image type .ascii "zimg" // image type
.long __efistub__gzdata_start - .Ldoshdr // payload offset .long __efistub__gzdata_start - .Ldoshdr // payload offset
.long __efistub__gzdata_size - ZBOOT_SIZE_LEN // payload size .long __efistub__gzdata_size - 12 // payload size
.long 0, 0 // reserved .long 0, 0 // reserved
.asciz COMP_TYPE // compression type .asciz COMP_TYPE // compression type
.org .Ldoshdr + 0x3c .org .Ldoshdr + 0x3c
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment