mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 50cfa79dcb
			
		
	
	
		50cfa79dcb
		
	
	
	
	
		
			
			Follow the x86 change and wire up support for the XZ decompressor. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
		
			
				
	
	
		
			139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * arch/sh/boot/compressed/misc.c
 | |
|  *
 | |
|  * This is a collection of several routines from gzip-1.0.3
 | |
|  * adapted for Linux.
 | |
|  *
 | |
|  * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
 | |
|  *
 | |
|  * Adapted for SH by Stuart Menefy, Aug 1999
 | |
|  *
 | |
|  * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000
 | |
|  */
 | |
| 
 | |
| #include <asm/uaccess.h>
 | |
| #include <asm/addrspace.h>
 | |
| #include <asm/page.h>
 | |
| 
 | |
| /*
 | |
|  * gzip declarations
 | |
|  */
 | |
| 
 | |
| #define STATIC static
 | |
| 
 | |
| #undef memset
 | |
| #undef memcpy
 | |
| #define memzero(s, n)     memset ((s), 0, (n))
 | |
| 
 | |
| /* cache.c */
 | |
| #define CACHE_ENABLE      0
 | |
| #define CACHE_DISABLE     1
 | |
| int cache_control(unsigned int command);
 | |
| 
 | |
| extern char input_data[];
 | |
| extern int input_len;
 | |
| static unsigned char *output;
 | |
| 
 | |
| static void error(char *m);
 | |
| 
 | |
| int puts(const char *);
 | |
| 
 | |
| extern int _text;		/* Defined in vmlinux.lds.S */
 | |
| extern int _end;
 | |
| static unsigned long free_mem_ptr;
 | |
| static unsigned long free_mem_end_ptr;
 | |
| 
 | |
| #ifdef CONFIG_HAVE_KERNEL_BZIP2
 | |
| #define HEAP_SIZE	0x400000
 | |
| #else
 | |
| #define HEAP_SIZE	0x10000
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_KERNEL_GZIP
 | |
| #include "../../../../lib/decompress_inflate.c"
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_KERNEL_BZIP2
 | |
| #include "../../../../lib/decompress_bunzip2.c"
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_KERNEL_LZMA
 | |
| #include "../../../../lib/decompress_unlzma.c"
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_KERNEL_XZ
 | |
| #include "../../../../lib/decompress_unxz.c"
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_KERNEL_LZO
 | |
| #include "../../../../lib/decompress_unlzo.c"
 | |
| #endif
 | |
| 
 | |
| int puts(const char *s)
 | |
| {
 | |
| 	/* This should be updated to use the sh-sci routines */
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| void* memset(void* s, int c, size_t n)
 | |
| {
 | |
| 	int i;
 | |
| 	char *ss = (char*)s;
 | |
| 
 | |
| 	for (i=0;i<n;i++) ss[i] = c;
 | |
| 	return s;
 | |
| }
 | |
| 
 | |
| void* memcpy(void* __dest, __const void* __src,
 | |
| 			    size_t __n)
 | |
| {
 | |
| 	int i;
 | |
| 	char *d = (char *)__dest, *s = (char *)__src;
 | |
| 
 | |
| 	for (i=0;i<__n;i++) d[i] = s[i];
 | |
| 	return __dest;
 | |
| }
 | |
| 
 | |
| static void error(char *x)
 | |
| {
 | |
| 	puts("\n\n");
 | |
| 	puts(x);
 | |
| 	puts("\n\n -- System halted");
 | |
| 
 | |
| 	while(1);	/* Halt */
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_SUPERH64
 | |
| #define stackalign	8
 | |
| #else
 | |
| #define stackalign	4
 | |
| #endif
 | |
| 
 | |
| #define STACK_SIZE (4096)
 | |
| long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE];
 | |
| long *stack_start = &user_stack[STACK_SIZE];
 | |
| 
 | |
| void decompress_kernel(void)
 | |
| {
 | |
| 	unsigned long output_addr;
 | |
| 
 | |
| #ifdef CONFIG_SUPERH64
 | |
| 	output_addr = (CONFIG_MEMORY_START + 0x2000);
 | |
| #else
 | |
| 	output_addr = __pa((unsigned long)&_text+PAGE_SIZE);
 | |
| #if defined(CONFIG_29BIT)
 | |
| 	output_addr |= P2SEG;
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| 	output = (unsigned char *)output_addr;
 | |
| 	free_mem_ptr = (unsigned long)&_end;
 | |
| 	free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 | |
| 
 | |
| 	puts("Uncompressing Linux... ");
 | |
| 	cache_control(CACHE_ENABLE);
 | |
| 	decompress(input_data, input_len, NULL, NULL, output, NULL, error);
 | |
| 	cache_control(CACHE_DISABLE);
 | |
| 	puts("Ok, booting the kernel.\n");
 | |
| }
 |