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