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 <asm/uaccess.h> 15 #include <asm/addrspace.h> 16 #include <asm/page.h> 17 #include <asm/sh_bios.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 32 int cache_control(unsigned int command); 33 34 extern char input_data[]; 35 extern int input_len; 36 static unsigned char *output; 37 38 static void error(char *m); 39 40 int puts(const char *); 41 42 extern int _text; /* Defined in vmlinux.lds.S */ 43 extern int _end; 44 static unsigned long free_mem_ptr; 45 static 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_LZO 66 #include "../../../../lib/decompress_unlzo.c" 67 #endif 68 69 #ifdef CONFIG_SH_STANDARD_BIOS 70 size_t strlen(const char *s) 71 { 72 int i = 0; 73 74 while (*s++) 75 i++; 76 return i; 77 } 78 79 int puts(const char *s) 80 { 81 int len = strlen(s); 82 sh_bios_console_write(s, len); 83 return len; 84 } 85 #else 86 int puts(const char *s) 87 { 88 /* This should be updated to use the sh-sci routines */ 89 return 0; 90 } 91 #endif 92 93 void* memset(void* s, int c, size_t n) 94 { 95 int i; 96 char *ss = (char*)s; 97 98 for (i=0;i<n;i++) ss[i] = c; 99 return s; 100 } 101 102 void* memcpy(void* __dest, __const void* __src, 103 size_t __n) 104 { 105 int i; 106 char *d = (char *)__dest, *s = (char *)__src; 107 108 for (i=0;i<__n;i++) d[i] = s[i]; 109 return __dest; 110 } 111 112 static void error(char *x) 113 { 114 puts("\n\n"); 115 puts(x); 116 puts("\n\n -- System halted"); 117 118 while(1); /* Halt */ 119 } 120 121 #ifdef CONFIG_SUPERH64 122 #define stackalign 8 123 #else 124 #define stackalign 4 125 #endif 126 127 #define STACK_SIZE (4096) 128 long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE]; 129 long *stack_start = &user_stack[STACK_SIZE]; 130 131 void decompress_kernel(void) 132 { 133 unsigned long output_addr; 134 135 #ifdef CONFIG_SUPERH64 136 output_addr = (CONFIG_MEMORY_START + 0x2000); 137 #else 138 output_addr = __pa((unsigned long)&_text+PAGE_SIZE); 139 #ifdef CONFIG_29BIT 140 output_addr |= P2SEG; 141 #endif 142 #endif 143 144 output = (unsigned char *)output_addr; 145 free_mem_ptr = (unsigned long)&_end; 146 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; 147 148 puts("Uncompressing Linux... "); 149 cache_control(CACHE_ENABLE); 150 decompress(input_data, input_len, NULL, NULL, output, NULL, error); 151 cache_control(CACHE_DISABLE); 152 puts("Ok, booting the kernel.\n"); 153 } 154