2018-07-19 13:11:28 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <linux/string.h>
|
2018-04-11 11:56:55 +02:00
|
|
|
#include <asm/setup.h>
|
2018-07-25 15:01:11 +02:00
|
|
|
#include <asm/sclp.h>
|
2018-07-19 13:11:28 +02:00
|
|
|
#include "compressed/decompressor.h"
|
|
|
|
#include "boot.h"
|
|
|
|
|
2018-07-25 15:01:11 +02:00
|
|
|
void error(char *x)
|
|
|
|
{
|
|
|
|
sclp_early_printk("\n\n");
|
|
|
|
sclp_early_printk(x);
|
|
|
|
sclp_early_printk("\n\n -- System halted");
|
|
|
|
|
|
|
|
disabled_wait(0xdeadbeef);
|
|
|
|
}
|
|
|
|
|
2018-04-11 11:56:55 +02:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2018-07-19 13:11:28 +02:00
|
|
|
void startup_kernel(void)
|
|
|
|
{
|
2018-07-19 16:51:25 +02:00
|
|
|
void *img;
|
2018-07-19 13:11:28 +02:00
|
|
|
|
2018-04-11 11:56:55 +02:00
|
|
|
rescue_initrd();
|
2018-07-19 13:11:28 +02:00
|
|
|
if (!IS_ENABLED(CONFIG_KERNEL_UNCOMPRESSED)) {
|
2018-07-19 16:51:25 +02:00
|
|
|
img = decompress_kernel();
|
|
|
|
memmove((void *)vmlinux.default_lma, img, vmlinux.image_size);
|
2018-07-19 13:11:28 +02:00
|
|
|
}
|
2018-07-19 16:51:25 +02:00
|
|
|
vmlinux.entry();
|
2018-07-19 13:11:28 +02:00
|
|
|
}
|