s390/decompressor: support uncompressed kernel
authorVasily Gorbik <gor@linux.ibm.com>
Tue, 12 Jun 2018 22:00:25 +0000 (00:00 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 25 Jun 2018 08:14:40 +0000 (10:14 +0200)
Implement uncompressed kernel support (when "None" is picked in kernel
compression mode list). In that case an actual decompression code is
skipped and control is passed from boot/head.S to startup_continue in
kernel/head64.S. To achieve that uncompressed kernel payload is
conditionally put at 0x100000 in bzImage.

In reality this is very close to classic uncompressed kernel "image",
but the decompressor has its own build and link process,
kernel/head64.S lives at 0x100000 rather than at 0x11000, and .bss
section is reused for both stages.

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

index baed39772c845d74d91c292aba3b3ea4063aa130..3023fa00e4b501385e9e9884efdde413940ceaf9 100644 (file)
@@ -146,6 +146,7 @@ config S390
        select HAVE_KERNEL_LZ4
        select HAVE_KERNEL_LZMA
        select HAVE_KERNEL_LZO
+       select HAVE_KERNEL_UNCOMPRESSED
        select HAVE_KERNEL_XZ
        select HAVE_KPROBES
        select HAVE_KRETPROBES
index 438e1a50e0b5a6f6b434e65a10957196a9405972..9d3bd7d066e92bf073c367d56b37f4b3372b3dd2 100644 (file)
@@ -9,10 +9,10 @@ KCOV_INSTRUMENT := n
 GCOV_PROFILE := n
 UBSAN_SANITIZE := n
 
-obj-y  := head.o misc.o piggy.o
+obj-y  := $(if $(CONFIG_KERNEL_UNCOMPRESSED),,head.o misc.o) piggy.o
 targets        := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2
 targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4
-targets += vmlinux.scr.lds sizes.h $(obj-y)
+targets += vmlinux.scr.lds $(obj-y) $(if $(CONFIG_KERNEL_UNCOMPRESSED),,sizes.h)
 
 KBUILD_AFLAGS := $(KBUILD_AFLAGS_DECOMPRESSOR)
 KBUILD_CFLAGS := $(KBUILD_CFLAGS_DECOMPRESSOR)
index d43c2db12d306bd744eaa78df6405b3e0f905183..b8572a81be5f3ba7ae51042e65add51f50e704df 100644 (file)
@@ -23,13 +23,10 @@ SECTIONS
                *(.text.*)
                _etext = . ;
        }
-       .rodata.compressed : {
-               *(.rodata.compressed)
-       }
        .rodata : {
                _rodata = . ;
                *(.rodata)       /* read-only data */
-               *(.rodata.*)
+               EXCLUDE_FILE (*piggy.o) *(.rodata.*)
                _erodata = . ;
        }
        .data : {
@@ -38,6 +35,13 @@ SECTIONS
                *(.data.*)
                _edata = . ;
        }
+       startup_continue = 0x100000;
+#ifdef CONFIG_KERNEL_UNCOMPRESSED
+       . = 0x100000;
+#endif
+       .rodata.compressed : {
+               *(.rodata.compressed)
+       }
        . = ALIGN(256);
        .bss : {
                _bss = . ;
index 42a242597f346345c50d9be5422e74db79ad8496..ff01d18c922205d08e9f7afed0b0a66401b431f6 100644 (file)
@@ -2,10 +2,14 @@
 SECTIONS
 {
   .rodata.compressed : {
+#ifndef CONFIG_KERNEL_UNCOMPRESSED
        input_len = .;
        LONG(input_data_end - input_data) input_data = .;
+#endif
        *(.data)
+#ifndef CONFIG_KERNEL_UNCOMPRESSED
        output_len = . - 4;
        input_data_end = .;
+#endif
        }
 }
index 8d98463ca7d008b5de08c174d159bf98a69a1c4e..f09e792df495285ad069616479371eba07316e4e 100644 (file)
@@ -310,7 +310,11 @@ ENTRY(startup_kdump)
        l       %r15,.Lstack-.LPG0(%r13)
        ahi     %r15,-STACK_FRAME_OVERHEAD
        brasl   %r14,verify_facilities
+#ifdef CONFIG_KERNEL_UNCOMPRESSED
+       jg      startup_continue
+#else
        jg      startup_decompressor
+#endif
 
 .Lstack:
        .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_SIZE_ORDER))