forked from Minki/linux
15426ca43d
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>
40 lines
872 B
C
40 lines
872 B
C
// 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);
|
|
}
|
|
vmlinux.entry();
|
|
}
|