1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright 2001 MontaVista Software Inc. 4 * Author: Matt Porter <mporter@mvista.com> 5 * 6 * Copyright (C) 2009 Lemote, Inc. 7 * Author: Wu Zhangjin <wuzhangjin@gmail.com> 8 */ 9 10#define DISABLE_BRANCH_PROFILING 11 12#include <linux/types.h> 13#include <linux/kernel.h> 14#include <linux/string.h> 15#include <linux/libfdt.h> 16 17#include <asm/addrspace.h> 18#include <asm/unaligned.h> 19 20/* 21 * These two variables specify the free mem region 22 * that can be used for temporary malloc area 23 */ 24unsigned long free_mem_ptr; 25unsigned long free_mem_end_ptr; 26 27/* The linker tells us where the image is. */ 28extern unsigned char __image_begin, __image_end; 29 30/* debug interfaces */ 31#ifdef CONFIG_DEBUG_ZBOOT 32extern void puts(const char *s); 33extern void puthex(unsigned long long val); 34#else 35#define puts(s) do {} while (0) 36#define puthex(val) do {} while (0) 37#endif 38 39extern char __appended_dtb[]; 40 41void error(char *x) 42{ 43 puts("\n\n"); 44 puts(x); 45 puts("\n\n -- System halted"); 46 47 while (1) 48 ; /* Halt */ 49} 50 51/* activate the code for pre-boot environment */ 52#define STATIC static 53 54#ifdef CONFIG_KERNEL_GZIP 55#include "../../../../lib/decompress_inflate.c" 56#endif 57 58#ifdef CONFIG_KERNEL_BZIP2 59#include "../../../../lib/decompress_bunzip2.c" 60#endif 61 62#ifdef CONFIG_KERNEL_LZ4 63#include "../../../../lib/decompress_unlz4.c" 64#endif 65 66#ifdef CONFIG_KERNEL_LZMA 67#include "../../../../lib/decompress_unlzma.c" 68#endif 69 70#ifdef CONFIG_KERNEL_LZO 71#include "../../../../lib/decompress_unlzo.c" 72#endif 73 74#ifdef CONFIG_KERNEL_XZ 75#include "../../../../lib/decompress_unxz.c" 76#endif 77 78#ifdef CONFIG_KERNEL_ZSTD 79#include "../../../../lib/decompress_unzstd.c" 80#endif 81 82const unsigned long __stack_chk_guard = 0x000a0dff; 83 84void __stack_chk_fail(void) 85{ 86 error("stack-protector: Kernel stack is corrupted\n"); 87} 88 89void decompress_kernel(unsigned long boot_heap_start) 90{ 91 unsigned long zimage_start, zimage_size; 92 93 zimage_start = (unsigned long)(&__image_begin); 94 zimage_size = (unsigned long)(&__image_end) - 95 (unsigned long)(&__image_begin); 96 97 puts("zimage at: "); 98 puthex(zimage_start); 99 puts(" "); 100 puthex(zimage_size + zimage_start); 101 puts("\n"); 102 103 /* This area are prepared for mallocing when decompressing */ 104 free_mem_ptr = boot_heap_start; 105 free_mem_end_ptr = boot_heap_start + BOOT_HEAP_SIZE; 106 107 /* Display standard Linux/MIPS boot prompt */ 108 puts("Uncompressing Linux at load address "); 109 puthex(VMLINUX_LOAD_ADDRESS_ULL); 110 puts("\n"); 111 112 /* Decompress the kernel with according algorithm */ 113 __decompress((char *)zimage_start, zimage_size, 0, 0, 114 (void *)VMLINUX_LOAD_ADDRESS_ULL, 0, 0, error); 115 116 if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) && 117 fdt_magic((void *)&__appended_dtb) == FDT_MAGIC) { 118 unsigned int image_size, dtb_size; 119 120 dtb_size = fdt_totalsize((void *)&__appended_dtb); 121 122 /* last four bytes is always image size in little endian */ 123 image_size = get_unaligned_le32((void *)&__image_end - 4); 124 125 /* copy dtb to where the booted kernel will expect it */ 126 memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size, 127 __appended_dtb, dtb_size); 128 } 129 130 /* FIXME: should we flush cache here? */ 131 puts("Now, booting the kernel...\n"); 132} 133