]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
s390/decompressor: trim uncompressed image head during the build
authorVasily Gorbik <gor@linux.vnet.ibm.com>
Mon, 5 Mar 2018 08:58:00 +0000 (09:58 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 19 Mar 2018 06:02:07 +0000 (23:02 -0700)
It seems to be suboptimal to compress the entire image, so that we
could decompress and throw away the first 68k (0x11000) during the boot
process. This patch trims 0x11000 bytes during the build process and
adjusts symbols in size.h accordingly.

Besides making bzImage smaller, this change would also be a benefit
for kaslr. It allows to decompress the kernel right to desired offset,
without worrying about dead weight in front of the decompressed image.

Signed-off-by: Vasily Gorbik <gor@linux.vnet.ibm.com>
Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/boot/compressed/Makefile
arch/s390/boot/compressed/head.S

index 26d6a94f40f6987d95faf83d455c9a64389436ef..5766f7b9b2710e11c8676eb9dc13e3b2bd8969be 100644 (file)
@@ -29,11 +29,16 @@ LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
 $(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS)
        $(call if_changed,ld)
 
-sed-sizes := -e 's/^\([0-9a-fA-F]*\) . \(__bss_start\|_end\)$$/\#define SZ\2 0x\1/p'
+TRIM_HEAD_SIZE := 0x11000
 
-quiet_cmd_sizes = GEN $@
+sed-sizes := -e 's/^\([0-9a-fA-F]*\) . \(__bss_start\|_end\)$$/\#define SZ\2 (0x\1 - $(TRIM_HEAD_SIZE))/p'
+
+quiet_cmd_sizes = GEN     $@
       cmd_sizes = $(NM) $< | sed -n $(sed-sizes) > $@
 
+quiet_cmd_trim_head = TRIM    $@
+      cmd_trim_head = tail -c +$$(($(TRIM_HEAD_SIZE) + 1)) $< > $@
+
 $(obj)/sizes.h: vmlinux
        $(call if_changed,sizes)
 
@@ -43,10 +48,13 @@ $(obj)/head.o: $(obj)/sizes.h
 CFLAGS_misc.o += -I$(objtree)/$(obj)
 $(obj)/misc.o: $(obj)/sizes.h
 
-OBJCOPYFLAGS_vmlinux.bin :=  -R .comment -S
-$(obj)/vmlinux.bin: vmlinux
+OBJCOPYFLAGS_vmlinux.bin.full :=  -R .comment -S
+$(obj)/vmlinux.bin.full: vmlinux
        $(call if_changed,objcopy)
 
+$(obj)/vmlinux.bin: $(obj)/vmlinux.bin.full
+       $(call if_changed,trim_head)
+
 vmlinux.bin.all-y := $(obj)/vmlinux.bin
 
 suffix-$(CONFIG_KERNEL_GZIP)  := gz
index 231d1491d431919bcb49fa6034a683862c74b0fa..9f94eca0f467c8bd6aad88b9140e37b96ecb71a6 100644 (file)
@@ -23,12 +23,10 @@ ENTRY(startup_continue)
        aghi    %r15,-160
        brasl   %r14,decompress_kernel
        # Set up registers for memory mover. We move the decompressed image to
-       # 0x11000, starting at offset 0x11000 in the decompressed image so
-       # that code living at 0x11000 in the image will end up at 0x11000 in
-       # memory.
+       # 0x11000, where startup_continue of the decompressed image is supposed
+       # to be.
        lgr     %r4,%r2
        lg      %r2,.Loffset-.LPG1(%r13)
-       la      %r4,0(%r2,%r4)
        lg      %r3,.Lmvsize-.LPG1(%r13)
        lgr     %r5,%r3
        # Move the memory mover someplace safe so it doesn't overwrite itself.