aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/boot
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2009-07-11 12:37:30 -0400
committerPaul Mundt <lethal@linux-sh.org>2009-07-11 12:37:30 -0400
commitdf8ce2595fbac8b046322fce9df61ce1cf8ddf62 (patch)
tree46c5d6a316deab58f4cb482e72de56b1be0fc202 /arch/sh/boot
parentf686d8c11c61143b9705ed38d8cd26b0643902a4 (diff)
sh: Tidy up gzip-based zImage decompression.
This brings the zImage handling in to the current century, in preparation for handling the other compression types. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/boot')
-rw-r--r--arch/sh/boot/compressed/misc_32.c106
-rw-r--r--arch/sh/boot/compressed/misc_64.c127
2 files changed, 18 insertions, 215 deletions
diff --git a/arch/sh/boot/compressed/misc_32.c b/arch/sh/boot/compressed/misc_32.c
index efdba6b29572..1ab4f49153be 100644
--- a/arch/sh/boot/compressed/misc_32.c
+++ b/arch/sh/boot/compressed/misc_32.c
@@ -14,73 +14,23 @@
14#include <asm/uaccess.h> 14#include <asm/uaccess.h>
15#include <asm/addrspace.h> 15#include <asm/addrspace.h>
16#include <asm/page.h> 16#include <asm/page.h>
17#ifdef CONFIG_SH_STANDARD_BIOS
18#include <asm/sh_bios.h> 17#include <asm/sh_bios.h>
19#endif
20 18
21/* 19/*
22 * gzip declarations 20 * gzip declarations
23 */ 21 */
24 22
25#define OF(args) args
26#define STATIC static 23#define STATIC static
27 24
28#undef memset 25#undef memset
29#undef memcpy 26#undef memcpy
30#define memzero(s, n) memset ((s), 0, (n)) 27#define memzero(s, n) memset ((s), 0, (n))
31 28
32typedef unsigned char uch;
33typedef unsigned short ush;
34typedef unsigned long ulg;
35
36#define WSIZE 0x8000 /* Window size must be at least 32k, */
37 /* and a power of two */
38
39static uch *inbuf; /* input buffer */
40static uch window[WSIZE]; /* Sliding window buffer */
41
42static unsigned insize = 0; /* valid bytes in inbuf */
43static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
44static unsigned outcnt = 0; /* bytes in output buffer */
45
46/* gzip flag byte */
47#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
48#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
49#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
50#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
51#define COMMENT 0x10 /* bit 4 set: file comment present */
52#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
53#define RESERVED 0xC0 /* bit 6,7: reserved */
54
55#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
56
57/* Diagnostic functions */
58#ifdef DEBUG
59# define Assert(cond,msg) {if(!(cond)) error(msg);}
60# define Trace(x) fprintf x
61# define Tracev(x) {if (verbose) fprintf x ;}
62# define Tracevv(x) {if (verbose>1) fprintf x ;}
63# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
64# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
65#else
66# define Assert(cond,msg)
67# define Trace(x)
68# define Tracev(x)
69# define Tracevv(x)
70# define Tracec(c,x)
71# define Tracecv(c,x)
72#endif
73
74static int fill_inbuf(void);
75static void flush_window(void);
76static void error(char *m); 29static void error(char *m);
77 30
78extern char input_data[]; 31extern char input_data[];
79extern int input_len; 32extern int input_len;
80 33static unsigned char *output;
81static long bytes_out = 0;
82static uch *output_data;
83static unsigned long output_ptr = 0;
84 34
85static void error(char *m); 35static void error(char *m);
86 36
@@ -93,7 +43,9 @@ static unsigned long free_mem_end_ptr;
93 43
94#define HEAP_SIZE 0x10000 44#define HEAP_SIZE 0x10000
95 45
96#include "../../../../lib/inflate.c" 46#ifdef CONFIG_KERNEL_GZIP
47#include "../../../../lib/decompress_inflate.c"
48#endif
97 49
98#ifdef CONFIG_SH_STANDARD_BIOS 50#ifdef CONFIG_SH_STANDARD_BIOS
99size_t strlen(const char *s) 51size_t strlen(const char *s)
@@ -138,44 +90,6 @@ void* memcpy(void* __dest, __const void* __src,
138 return __dest; 90 return __dest;
139} 91}
140 92
141/* ===========================================================================
142 * Fill the input buffer. This is called only when the buffer is empty
143 * and at least one byte is really needed.
144 */
145static int fill_inbuf(void)
146{
147 if (insize != 0) {
148 error("ran out of input data");
149 }
150
151 inbuf = input_data;
152 insize = input_len;
153 inptr = 1;
154 return inbuf[0];
155}
156
157/* ===========================================================================
158 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
159 * (Used for the decompressed data only.)
160 */
161static void flush_window(void)
162{
163 ulg c = crc; /* temporary variable */
164 unsigned n;
165 uch *in, *out, ch;
166
167 in = window;
168 out = &output_data[output_ptr];
169 for (n = 0; n < outcnt; n++) {
170 ch = *out++ = *in++;
171 c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
172 }
173 crc = c;
174 bytes_out += (ulg)outcnt;
175 output_ptr += (ulg)outcnt;
176 outcnt = 0;
177}
178
179static void error(char *x) 93static void error(char *x)
180{ 94{
181 puts("\n\n"); 95 puts("\n\n");
@@ -191,16 +105,18 @@ long* stack_start = &user_stack[STACK_SIZE];
191 105
192void decompress_kernel(void) 106void decompress_kernel(void)
193{ 107{
194 output_data = NULL; 108 unsigned long output_addr;
195 output_ptr = PHYSADDR((unsigned long)&_text+PAGE_SIZE); 109
110 output_addr = PHYSADDR((unsigned long)&_text+PAGE_SIZE);
196#ifdef CONFIG_29BIT 111#ifdef CONFIG_29BIT
197 output_ptr |= P2SEG; 112 output_addr |= P2SEG;
198#endif 113#endif
114
115 output = (unsigned char *)output_addr;
199 free_mem_ptr = (unsigned long)&_end; 116 free_mem_ptr = (unsigned long)&_end;
200 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; 117 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
201 118
202 makecrc();
203 puts("Uncompressing Linux... "); 119 puts("Uncompressing Linux... ");
204 gunzip(); 120 decompress(input_data, input_len, NULL, NULL, output, NULL, error);
205 puts("Ok, booting the kernel.\n"); 121 puts("Ok, booting the kernel.\n");
206} 122}
diff --git a/arch/sh/boot/compressed/misc_64.c b/arch/sh/boot/compressed/misc_64.c
index 2941657e18aa..0c6894e37115 100644
--- a/arch/sh/boot/compressed/misc_64.c
+++ b/arch/sh/boot/compressed/misc_64.c
@@ -20,67 +20,18 @@ int cache_control(unsigned int command);
20 * gzip declarations 20 * gzip declarations
21 */ 21 */
22 22
23#define OF(args) args
24#define STATIC static 23#define STATIC static
25 24
26#undef memset 25#undef memset
27#undef memcpy 26#undef memcpy
28#define memzero(s, n) memset ((s), 0, (n)) 27#define memzero(s, n) memset ((s), 0, (n))
29 28
30typedef unsigned char uch;
31typedef unsigned short ush;
32typedef unsigned long ulg;
33
34#define WSIZE 0x8000 /* Window size must be at least 32k, */
35 /* and a power of two */
36
37static uch *inbuf; /* input buffer */
38static uch window[WSIZE]; /* Sliding window buffer */
39
40static unsigned insize = 0; /* valid bytes in inbuf */
41static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
42static unsigned outcnt = 0; /* bytes in output buffer */
43
44/* gzip flag byte */
45#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
46#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
47#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
48#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
49#define COMMENT 0x10 /* bit 4 set: file comment present */
50#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
51#define RESERVED 0xC0 /* bit 6,7: reserved */
52
53#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
54
55/* Diagnostic functions */
56#ifdef DEBUG
57# define Assert(cond,msg) {if(!(cond)) error(msg);}
58# define Trace(x) fprintf x
59# define Tracev(x) {if (verbose) fprintf x ;}
60# define Tracevv(x) {if (verbose>1) fprintf x ;}
61# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
62# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
63#else
64# define Assert(cond,msg)
65# define Trace(x)
66# define Tracev(x)
67# define Tracevv(x)
68# define Tracec(c,x)
69# define Tracecv(c,x)
70#endif
71
72static int fill_inbuf(void);
73static void flush_window(void);
74static void error(char *m); 29static void error(char *m);
75 30
76extern char input_data[]; 31extern char input_data[];
77extern int input_len; 32extern int input_len;
78 33
79static long bytes_out = 0; 34static unsigned char *output_data;
80static uch *output_data;
81static unsigned long output_ptr = 0;
82
83static void error(char *m);
84 35
85static void puts(const char *); 36static void puts(const char *);
86 37
@@ -91,7 +42,9 @@ static unsigned long free_mem_end_ptr;
91 42
92#define HEAP_SIZE 0x10000 43#define HEAP_SIZE 0x10000
93 44
94#include "../../../../lib/inflate.c" 45#ifdef CONFIG_KERNEL_GZIP
46#include "../../../../lib/decompress_inflate.c"
47#endif
95 48
96void puts(const char *s) 49void puts(const char *s)
97{ 50{
@@ -117,45 +70,6 @@ void *memcpy(void *__dest, __const void *__src, size_t __n)
117 return __dest; 70 return __dest;
118} 71}
119 72
120/* ===========================================================================
121 * Fill the input buffer. This is called only when the buffer is empty
122 * and at least one byte is really needed.
123 */
124static int fill_inbuf(void)
125{
126 if (insize != 0) {
127 error("ran out of input data\n");
128 }
129
130 inbuf = input_data;
131 insize = input_len;
132 inptr = 1;
133 return inbuf[0];
134}
135
136/* ===========================================================================
137 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
138 * (Used for the decompressed data only.)
139 */
140static void flush_window(void)
141{
142 ulg c = crc; /* temporary variable */
143 unsigned n;
144 uch *in, *out, ch;
145
146 in = window;
147 out = &output_data[output_ptr];
148 for (n = 0; n < outcnt; n++) {
149 ch = *out++ = *in++;
150 c = crc_32_tab[((int) c ^ ch) & 0xff] ^ (c >> 8);
151 }
152 crc = c;
153 bytes_out += (ulg) outcnt;
154 output_ptr += (ulg) outcnt;
155 outcnt = 0;
156 puts(".");
157}
158
159static void error(char *x) 73static void error(char *x)
160{ 74{
161 puts("\n\n"); 75 puts("\n\n");
@@ -171,40 +85,13 @@ long *stack_start = &user_stack[STACK_SIZE];
171 85
172void decompress_kernel(void) 86void decompress_kernel(void)
173{ 87{
174 output_data = (uch *) (CONFIG_MEMORY_START + 0x2000); 88 output_data = (unsigned char *) (CONFIG_MEMORY_START + 0x2000);
175 free_mem_ptr = (unsigned long) &_end; 89 free_mem_ptr = (unsigned long) &_end;
176 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; 90 free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
177 91
178 makecrc();
179 puts("Uncompressing Linux... "); 92 puts("Uncompressing Linux... ");
180 cache_control(CACHE_ENABLE); 93 cache_control(CACHE_ENABLE);
181 gunzip(); 94 decompress(input_data, input_len, NULL, NULL, output_data, NULL, error);
182 puts("\n");
183
184#if 0
185 /* When booting from ROM may want to do something like this if the
186 * boot loader doesn't.
187 */
188
189 /* Set up the parameters and command line */
190 {
191 volatile unsigned int *parambase =
192 (int *) (CONFIG_MEMORY_START + 0x1000);
193
194 parambase[0] = 0x1; /* MOUNT_ROOT_RDONLY */
195 parambase[1] = 0x0; /* RAMDISK_FLAGS */
196 parambase[2] = 0x0200; /* ORIG_ROOT_DEV */
197 parambase[3] = 0x0; /* LOADER_TYPE */
198 parambase[4] = 0x0; /* INITRD_START */
199 parambase[5] = 0x0; /* INITRD_SIZE */
200 parambase[6] = 0;
201
202 strcpy((char *) ((int) parambase + 0x100),
203 "console=ttySC0,38400");
204 }
205#endif
206
207 puts("Ok, booting the kernel.\n");
208
209 cache_control(CACHE_DISABLE); 95 cache_control(CACHE_DISABLE);
96 puts("Ok, booting the kernel.\n");
210} 97}