summary refs log tree commit diff
path: root/arch/s390/boot/compressed
diff options
context:
space:
mode:
authorVasily Gorbik <gor@linux.ibm.com>2018-07-25 13:27:27 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-10-09 11:21:03 +0200
commita2ac1bb1f3ddbad8388b0ba4edf28ff501009cea (patch)
tree46a34dd1a0414644a37d0590ab393bf5d00a8012 /arch/s390/boot/compressed
parent369f91c374514f9491d52fec12f7ee9ef6d44b23 (diff)
downloadlinux-a2ac1bb1f3ddbad8388b0ba4edf28ff501009cea.tar.gz
s390/decompressor: get rid of .bss usage
Using .bss in early code should be avoided. It might overlay initrd
image or not yet be initialized. Clean up the last couple of places in
the decompressor's code where .bss is used and enfore no .bss usage
check on boot/compressed/misc.c. In particular:
- initializing free_mem_ptr and free_mem_end_ptr with values guarantee
that these variables won't end up in the .bss section.
- define STATIC_RW_DATA to go into .data section.

Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/boot/compressed')
-rw-r--r--arch/s390/boot/compressed/Makefile2
-rw-r--r--arch/s390/boot/compressed/misc.c17
2 files changed, 6 insertions, 13 deletions
diff --git a/arch/s390/boot/compressed/Makefile b/arch/s390/boot/compressed/Makefile
index 8262984aa405..a69746cd83be 100644
--- a/arch/s390/boot/compressed/Makefile
+++ b/arch/s390/boot/compressed/Makefile
@@ -62,6 +62,6 @@ OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section
 $(obj)/piggy.o: $(obj)/vmlinux.bin$(suffix-y) FORCE
 	$(call if_changed,objcopy)
 
-chkbss := $(filter-out $(obj)/misc.o $(obj)/piggy.o $(obj)/info.o,$(OBJECTS))
+chkbss := $(filter-out $(obj)/piggy.o $(obj)/info.o,$(OBJECTS))
 chkbss-target := $(obj)/vmlinux.bin
 include $(srctree)/arch/s390/scripts/Makefile.chkbss
diff --git a/arch/s390/boot/compressed/misc.c b/arch/s390/boot/compressed/misc.c
index 8b35af625aff..5dcf34e31f8d 100644
--- a/arch/s390/boot/compressed/misc.c
+++ b/arch/s390/boot/compressed/misc.c
@@ -11,12 +11,14 @@
 #include <asm/page.h>
 #include <asm/sclp.h>
 #include <asm/ipl.h>
+#include <asm/sections.h>
 #include "decompressor.h"
 
 /*
  * gzip declarations
  */
 #define STATIC static
+#define STATIC_RW_DATA static __section(.data)
 
 #undef memset
 #undef memcpy
@@ -26,21 +28,20 @@
 
 /* Symbols defined by linker scripts */
 extern char _end[];
-extern char _bss[], _ebss[];
 extern unsigned char _compressed_start[];
 extern unsigned char _compressed_end[];
 
 static void error(char *m);
 
-static unsigned long free_mem_ptr;
-static unsigned long free_mem_end_ptr;
-
 #ifdef CONFIG_HAVE_KERNEL_BZIP2
 #define HEAP_SIZE	0x400000
 #else
 #define HEAP_SIZE	0x10000
 #endif
 
+static unsigned long free_mem_ptr = (unsigned long) _end;
+static unsigned long free_mem_end_ptr = (unsigned long) _end + HEAP_SIZE;
+
 #ifdef CONFIG_KERNEL_GZIP
 #include "../../../../lib/decompress_inflate.c"
 #endif
@@ -102,14 +103,6 @@ void *decompress_kernel(void)
 	}
 #endif
 
-	/*
-	 * Clear bss section. free_mem_ptr and free_mem_end_ptr need to be
-	 * initialized afterwards since they reside in bss.
-	 */
-	memset(_bss, 0, _ebss - _bss);
-	free_mem_ptr = (unsigned long) _end;
-	free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
-
 	__decompress(_compressed_start, _compressed_end - _compressed_start,
 		     NULL, NULL, output, 0, NULL, error);
 	return output;