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