mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 15:24:02 -04:00
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: Ard Biesheuvel <ardb@kernel.org>
48 lines
1.9 KiB
Makefile
48 lines
1.9 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# to be include'd by arch/$(ARCH)/boot/Makefile after setting
|
|
# EFI_ZBOOT_PAYLOAD, EFI_ZBOOT_BFD_TARGET and EFI_ZBOOT_MACH_TYPE
|
|
|
|
comp-type-$(CONFIG_KERNEL_GZIP) := gzip
|
|
comp-type-$(CONFIG_KERNEL_LZ4) := lz4
|
|
comp-type-$(CONFIG_KERNEL_LZMA) := lzma
|
|
comp-type-$(CONFIG_KERNEL_LZO) := lzo
|
|
comp-type-$(CONFIG_KERNEL_XZ) := xzkern
|
|
comp-type-$(CONFIG_KERNEL_ZSTD) := zstd22
|
|
|
|
# Copy the SizeOfHeaders, SizeOfCode and SizeOfImage fields from the payload to
|
|
# the end of the compressed image. Note that this presupposes a PE header
|
|
# offset of 64 bytes, which is what arm64, RISC-V and LoongArch use.
|
|
quiet_cmd_compwithsize = $(quiet_cmd_$(comp-type-y))
|
|
cmd_compwithsize = $(cmd_$(comp-type-y)) && ( \
|
|
dd status=none if=$< bs=4 count=1 skip=37 ; \
|
|
dd status=none if=$< bs=4 count=1 skip=23 ; \
|
|
dd status=none if=$< bs=4 count=1 skip=36 ) >> $@
|
|
|
|
$(obj)/vmlinuz: $(obj)/$(EFI_ZBOOT_PAYLOAD) FORCE
|
|
$(call if_changed,compwithsize)
|
|
|
|
OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) \
|
|
--rename-section .data=.gzdata,load,alloc,readonly,contents
|
|
$(obj)/vmlinuz.o: $(obj)/vmlinuz FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
AFLAGS_zboot-header.o += -DMACHINE_TYPE=IMAGE_FILE_MACHINE_$(EFI_ZBOOT_MACH_TYPE) \
|
|
-DZBOOT_EFI_PATH="\"$(realpath $(obj)/vmlinuz.efi.elf)\"" \
|
|
-DCOMP_TYPE="\"$(comp-type-y)\""
|
|
|
|
$(obj)/zboot-header.o: $(srctree)/drivers/firmware/efi/libstub/zboot-header.S FORCE
|
|
$(call if_changed_rule,as_o_S)
|
|
|
|
ZBOOT_DEPS := $(obj)/zboot-header.o $(objtree)/drivers/firmware/efi/libstub/lib.a
|
|
|
|
LDFLAGS_vmlinuz.efi.elf := -T $(srctree)/drivers/firmware/efi/libstub/zboot.lds
|
|
$(obj)/vmlinuz.efi.elf: $(obj)/vmlinuz.o $(ZBOOT_DEPS) FORCE
|
|
$(call if_changed,ld)
|
|
|
|
OBJCOPYFLAGS_vmlinuz.efi := -O binary
|
|
$(obj)/vmlinuz.efi: $(obj)/vmlinuz.efi.elf FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
targets += zboot-header.o vmlinuz.o vmlinuz.efi.elf vmlinuz.efi
|