aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/boot/startup.c
diff options
context:
space:
mode:
authorVasily Gorbik <gor@linux.ibm.com>2018-04-11 11:56:55 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-10-09 11:21:05 +0200
commit15426ca43d888e79f2dc4012bce0cbd6be96baf1 (patch)
treeb34165a772b355f7d73b7bc5eff4a7ba41575b33 /arch/s390/boot/startup.c
parents390/sclp: simplify early hsa_size detection (diff)
downloadlinux-dev-15426ca43d888e79f2dc4012bce0cbd6be96baf1.tar.xz
linux-dev-15426ca43d888e79f2dc4012bce0cbd6be96baf1.zip
s390: rescue initrd as early as possible
To avoid multi-stage initrd rescue operation and to simplify assumptions during early memory allocations move initrd at some final safe destination as early as possible. This would also allow us to drop .bss usage restrictions for some files. 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/startup.c')
-rw-r--r--arch/s390/boot/startup.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c
index 474dee84d8a8..5aeac7564e67 100644
--- a/arch/s390/boot/startup.c
+++ b/arch/s390/boot/startup.c
@@ -1,12 +1,36 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/string.h>
+#include <asm/setup.h>
#include "compressed/decompressor.h"
#include "boot.h"
+#ifdef CONFIG_KERNEL_UNCOMPRESSED
+unsigned long mem_safe_offset(void)
+{
+ return vmlinux.default_lma + vmlinux.image_size + vmlinux.bss_size;
+}
+#endif
+
+static void rescue_initrd(void)
+{
+ unsigned long min_initrd_addr;
+
+ if (!IS_ENABLED(CONFIG_BLK_DEV_INITRD))
+ return;
+ if (!INITRD_START || !INITRD_SIZE)
+ return;
+ min_initrd_addr = mem_safe_offset();
+ if (min_initrd_addr <= INITRD_START)
+ return;
+ memmove((void *)min_initrd_addr, (void *)INITRD_START, INITRD_SIZE);
+ INITRD_START = min_initrd_addr;
+}
+
void startup_kernel(void)
{
void *img;
+ rescue_initrd();
if (!IS_ENABLED(CONFIG_KERNEL_UNCOMPRESSED)) {
img = decompress_kernel();
memmove((void *)vmlinux.default_lma, img, vmlinux.image_size);