diff options
Diffstat (limited to 'arch/sh/boot/compressed/misc.c')
-rw-r--r-- | arch/sh/boot/compressed/misc.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/arch/sh/boot/compressed/misc.c b/arch/sh/boot/compressed/misc.c new file mode 100644 index 000000000000..4eb27e61f8e3 --- /dev/null +++ b/arch/sh/boot/compressed/misc.c | |||
@@ -0,0 +1,145 @@ | |||
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_SH_STANDARD_BIOS | ||
66 | size_t strlen(const char *s) | ||
67 | { | ||
68 | int i = 0; | ||
69 | |||
70 | while (*s++) | ||
71 | i++; | ||
72 | return i; | ||
73 | } | ||
74 | |||
75 | int puts(const char *s) | ||
76 | { | ||
77 | int len = strlen(s); | ||
78 | sh_bios_console_write(s, len); | ||
79 | return len; | ||
80 | } | ||
81 | #else | ||
82 | int puts(const char *s) | ||
83 | { | ||
84 | /* This should be updated to use the sh-sci routines */ | ||
85 | return 0; | ||
86 | } | ||
87 | #endif | ||
88 | |||
89 | void* memset(void* s, int c, size_t n) | ||
90 | { | ||
91 | int i; | ||
92 | char *ss = (char*)s; | ||
93 | |||
94 | for (i=0;i<n;i++) ss[i] = c; | ||
95 | return s; | ||
96 | } | ||
97 | |||
98 | void* memcpy(void* __dest, __const void* __src, | ||
99 | size_t __n) | ||
100 | { | ||
101 | int i; | ||
102 | char *d = (char *)__dest, *s = (char *)__src; | ||
103 | |||
104 | for (i=0;i<__n;i++) d[i] = s[i]; | ||
105 | return __dest; | ||
106 | } | ||
107 | |||
108 | static void error(char *x) | ||
109 | { | ||
110 | puts("\n\n"); | ||
111 | puts(x); | ||
112 | puts("\n\n -- System halted"); | ||
113 | |||
114 | while(1); /* Halt */ | ||
115 | } | ||
116 | |||
117 | #ifdef CONFIG_SUPERH64 | ||
118 | #define stackalign 8 | ||
119 | #else | ||
120 | #define stackalign 4 | ||
121 | #endif | ||
122 | |||
123 | #define STACK_SIZE (4096) | ||
124 | long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE]; | ||
125 | long *stack_start = &user_stack[STACK_SIZE]; | ||
126 | |||
127 | void decompress_kernel(void) | ||
128 | { | ||
129 | unsigned long output_addr; | ||
130 | |||
131 | output_addr = PHYSADDR((unsigned long)&_text+PAGE_SIZE); | ||
132 | #ifdef CONFIG_29BIT | ||
133 | output_addr |= P2SEG; | ||
134 | #endif | ||
135 | |||
136 | output = (unsigned char *)output_addr; | ||
137 | free_mem_ptr = (unsigned long)&_end; | ||
138 | free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; | ||
139 | |||
140 | puts("Uncompressing Linux... "); | ||
141 | cache_control(CACHE_ENABLE); | ||
142 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | ||
143 | cache_control(CACHE_DISABLE); | ||
144 | puts("Ok, booting the kernel.\n"); | ||
145 | } | ||