misc.c (2864B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * arch/sh/boot/compressed/misc.c 4 * 5 * This is a collection of several routines from gzip-1.0.3 6 * adapted for Linux. 7 * 8 * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 9 * 10 * Adapted for SH by Stuart Menefy, Aug 1999 11 * 12 * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000 13 */ 14 15#include <linux/uaccess.h> 16#include <asm/addrspace.h> 17#include <asm/page.h> 18 19/* 20 * gzip declarations 21 */ 22 23#define STATIC static 24 25#undef memset 26#undef memcpy 27#define memzero(s, n) memset ((s), 0, (n)) 28 29/* cache.c */ 30#define CACHE_ENABLE 0 31#define CACHE_DISABLE 1 32int cache_control(unsigned int command); 33 34extern char input_data[]; 35extern int input_len; 36static unsigned char *output; 37 38static void error(char *m); 39 40int puts(const char *); 41 42extern int _text; /* Defined in vmlinux.lds.S */ 43extern int _end; 44static unsigned long free_mem_ptr; 45static unsigned long free_mem_end_ptr; 46 47#ifdef CONFIG_HAVE_KERNEL_BZIP2 48#define HEAP_SIZE 0x400000 49#else 50#define HEAP_SIZE 0x10000 51#endif 52 53#ifdef CONFIG_KERNEL_GZIP 54#include "../../../../lib/decompress_inflate.c" 55#endif 56 57#ifdef CONFIG_KERNEL_BZIP2 58#include "../../../../lib/decompress_bunzip2.c" 59#endif 60 61#ifdef CONFIG_KERNEL_LZMA 62#include "../../../../lib/decompress_unlzma.c" 63#endif 64 65#ifdef CONFIG_KERNEL_XZ 66#include "../../../../lib/decompress_unxz.c" 67#endif 68 69#ifdef CONFIG_KERNEL_LZO 70#include "../../../../lib/decompress_unlzo.c" 71#endif 72 73int puts(const char *s) 74{ 75 /* This should be updated to use the sh-sci routines */ 76 return 0; 77} 78 79void* memset(void* s, int c, size_t n) 80{ 81 int i; 82 char *ss = (char*)s; 83 84 for (i=0;i<n;i++) ss[i] = c; 85 return s; 86} 87 88void* memcpy(void* __dest, __const void* __src, 89 size_t __n) 90{ 91 int i; 92 char *d = (char *)__dest, *s = (char *)__src; 93 94 for (i=0;i<__n;i++) d[i] = s[i]; 95 return __dest; 96} 97 98static void error(char *x) 99{ 100 puts("\n\n"); 101 puts(x); 102 puts("\n\n -- System halted"); 103 104 while(1); /* Halt */ 105} 106 107const unsigned long __stack_chk_guard = 0x000a0dff; 108 109void __stack_chk_fail(void) 110{ 111 error("stack-protector: Kernel stack is corrupted\n"); 112} 113 114/* Needed because vmlinux.lds.h references this */ 115void ftrace_stub(void) 116{ 117} 118void arch_ftrace_ops_list_func(void) 119{ 120} 121 122#define stackalign 4 123 124#define STACK_SIZE (4096) 125long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE]; 126long *stack_start = &user_stack[STACK_SIZE]; 127 128void decompress_kernel(void) 129{ 130 unsigned long output_addr; 131 132 output_addr = __pa((unsigned long)&_text+PAGE_SIZE); 133#if defined(CONFIG_29BIT) 134 output_addr |= P2SEG; 135#endif 136 137 output = (unsigned char *)output_addr; 138 free_mem_ptr = (unsigned long)&_end; 139 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; 140 141 puts("Uncompressing Linux... "); 142 cache_control(CACHE_ENABLE); 143 __decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error); 144 cache_control(CACHE_DISABLE); 145 puts("Ok, booting the kernel.\n"); 146}