18f75582aSVasily Gorbik // SPDX-License-Identifier: GPL-2.0 28f75582aSVasily Gorbik #include <linux/string.h> 315426ca4SVasily Gorbik #include <asm/setup.h> 47516fc11SVasily Gorbik #include <asm/sclp.h> 58f75582aSVasily Gorbik #include "compressed/decompressor.h" 68f75582aSVasily Gorbik #include "boot.h" 78f75582aSVasily Gorbik 87516fc11SVasily Gorbik void error(char *x) 97516fc11SVasily Gorbik { 107516fc11SVasily Gorbik sclp_early_printk("\n\n"); 117516fc11SVasily Gorbik sclp_early_printk(x); 127516fc11SVasily Gorbik sclp_early_printk("\n\n -- System halted"); 137516fc11SVasily Gorbik 147516fc11SVasily Gorbik disabled_wait(0xdeadbeef); 157516fc11SVasily Gorbik } 167516fc11SVasily Gorbik 1715426ca4SVasily Gorbik #ifdef CONFIG_KERNEL_UNCOMPRESSED 1815426ca4SVasily Gorbik unsigned long mem_safe_offset(void) 1915426ca4SVasily Gorbik { 2015426ca4SVasily Gorbik return vmlinux.default_lma + vmlinux.image_size + vmlinux.bss_size; 2115426ca4SVasily Gorbik } 2215426ca4SVasily Gorbik #endif 2315426ca4SVasily Gorbik 2415426ca4SVasily Gorbik static void rescue_initrd(void) 2515426ca4SVasily Gorbik { 2615426ca4SVasily Gorbik unsigned long min_initrd_addr; 2715426ca4SVasily Gorbik 2815426ca4SVasily Gorbik if (!IS_ENABLED(CONFIG_BLK_DEV_INITRD)) 2915426ca4SVasily Gorbik return; 3015426ca4SVasily Gorbik if (!INITRD_START || !INITRD_SIZE) 3115426ca4SVasily Gorbik return; 3215426ca4SVasily Gorbik min_initrd_addr = mem_safe_offset(); 3315426ca4SVasily Gorbik if (min_initrd_addr <= INITRD_START) 3415426ca4SVasily Gorbik return; 3515426ca4SVasily Gorbik memmove((void *)min_initrd_addr, (void *)INITRD_START, INITRD_SIZE); 3615426ca4SVasily Gorbik INITRD_START = min_initrd_addr; 3715426ca4SVasily Gorbik } 3815426ca4SVasily Gorbik 398f75582aSVasily Gorbik void startup_kernel(void) 408f75582aSVasily Gorbik { 41369f91c3SVasily Gorbik void *img; 428f75582aSVasily Gorbik 4315426ca4SVasily Gorbik rescue_initrd(); 448f75582aSVasily Gorbik if (!IS_ENABLED(CONFIG_KERNEL_UNCOMPRESSED)) { 45369f91c3SVasily Gorbik img = decompress_kernel(); 46369f91c3SVasily Gorbik memmove((void *)vmlinux.default_lma, img, vmlinux.image_size); 478f75582aSVasily Gorbik } 48369f91c3SVasily Gorbik vmlinux.entry(); 498f75582aSVasily Gorbik } 50