Root/arch/mips/boot/compressed/misc.c

Source at commit 9f03be916e6e871da7b0e5f3d30ca3f41a32259e created 11 years 2 months ago.
By xiangfu, 600-fix-compile-zImage.patch
1/*
2 * linux/arch/mips/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 JZSOC by Peter Wei, 2008
10 *
11 */
12
13#define size_t int
14#define NULL 0
15
16/*
17 * gzip declarations
18 */
19
20#define OF(args) args
21#define STATIC static
22
23#undef memset
24#undef memcpy
25#define memzero(s, n) memset ((s), 0, (n))
26
27typedef unsigned char uch;
28typedef unsigned short ush;
29typedef unsigned long ulg;
30
31#define WSIZE 0x8000 /* Window size must be at least 32k, */
32                /* and a power of two */
33
34static uch *inbuf; /* input buffer */
35static uch window[WSIZE]; /* Sliding window buffer */
36
37static unsigned insize = 0; /* valid bytes in inbuf */
38static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
39static unsigned outcnt = 0; /* bytes in output buffer */
40
41/* gzip flag byte */
42#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
43#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
44#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
45#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
46#define COMMENT 0x10 /* bit 4 set: file comment present */
47#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
48#define RESERVED 0xC0 /* bit 6,7: reserved */
49
50#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
51        
52/* Diagnostic functions */
53#ifdef DEBUG
54# define Assert(cond,msg) {if(!(cond)) error(msg);}
55# define Trace(x) fprintf x
56# define Tracev(x) {if (verbose) fprintf x ;}
57# define Tracevv(x) {if (verbose>1) fprintf x ;}
58# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
59# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
60#else
61# define Assert(cond,msg)
62# define Trace(x)
63# define Tracev(x)
64# define Tracevv(x)
65# define Tracec(c,x)
66# define Tracecv(c,x)
67#endif
68
69static int fill_inbuf(void);
70static void flush_window(void);
71static void error(char *m);
72static void gzip_mark(void **);
73static void gzip_release(void **);
74
75void* memset(void* s, int c, size_t n);
76void* memcpy(void* __dest, __const void* __src, size_t __n);
77
78extern void flushcaches(void); /* defined in head.S */
79
80char *input_data;
81int input_len;
82
83static long bytes_out = 0;
84static uch *output_data;
85static unsigned long output_ptr = 0;
86
87 
88static void *malloc(int size);
89static void free(void *where);
90static void error(char *m);
91static void gzip_mark(void **);
92static void gzip_release(void **);
93
94static void puts(const char *str)
95{
96}
97
98extern unsigned char _end[];
99static unsigned long free_mem_ptr;
100static unsigned long free_mem_end_ptr;
101 
102#define HEAP_SIZE 0x10000
103
104#include "../../../../lib/inflate.c"
105#if 0
106static void *malloc(int size)
107{
108    void *p;
109
110    if (size <0) error("Malloc error\n");
111    if (free_mem_ptr == 0) error("Memory error\n");
112
113    free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
114
115    p = (void *)free_mem_ptr;
116    free_mem_ptr += size;
117
118    if (free_mem_ptr >= free_mem_end_ptr)
119        error("\nOut of memory\n");
120
121    return p;
122}
123
124static void free(void *where)
125{ /* Don't care */
126}
127#endif
128
129static void gzip_mark(void **ptr)
130{
131    *ptr = (void *) free_mem_ptr;
132}
133
134static void gzip_release(void **ptr)
135{
136    free_mem_ptr = (long) *ptr;
137}
138
139void* memset(void* s, int c, size_t n)
140{
141    int i;
142    char *ss = (char*)s;
143
144    for (i=0;i<n;i++) ss[i] = c;
145    return s;
146}
147
148void* memcpy(void* __dest, __const void* __src, size_t __n)
149{
150    int i = 0;
151    unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src;
152
153    for (i = __n >> 3; i > 0; i--) {
154        *d++ = *s++;
155        *d++ = *s++;
156        *d++ = *s++;
157        *d++ = *s++;
158        *d++ = *s++;
159        *d++ = *s++;
160        *d++ = *s++;
161        *d++ = *s++;
162    }
163
164    if (__n & 1 << 2) {
165        *d++ = *s++;
166        *d++ = *s++;
167        *d++ = *s++;
168        *d++ = *s++;
169    }
170
171    if (__n & 1 << 1) {
172        *d++ = *s++;
173        *d++ = *s++;
174    }
175
176    if (__n & 1)
177        *d++ = *s++;
178
179    return __dest;
180}
181
182/* ===========================================================================
183 * Fill the input buffer. This is called only when the buffer is empty
184 * and at least one byte is really needed.
185 */
186static int fill_inbuf(void)
187{
188    if (insize != 0) {
189        error("ran out of input data\n");
190    }
191
192    inbuf = input_data;
193    insize = input_len;
194    inptr = 1;
195    return inbuf[0];
196}
197
198/* ===========================================================================
199 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
200 * (Used for the decompressed data only.)
201 */
202static void flush_window(void)
203{
204    ulg c = crc; /* temporary variable */
205    unsigned n;
206    uch *in, *out, ch;
207    
208    in = window;
209    out = &output_data[output_ptr];
210    for (n = 0; n < outcnt; n++) {
211        ch = *out++ = *in++;
212        c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
213    }
214    crc = c;
215    bytes_out += (ulg)outcnt;
216    output_ptr += (ulg)outcnt;
217    outcnt = 0;
218}
219
220static void error(char *x)
221{
222    puts("\n\n");
223    puts(x);
224    puts("\n\n -- System halted");
225
226    while(1); /* Halt */
227}
228
229void decompress_kernel(unsigned int imageaddr, unsigned int imagesize, unsigned int loadaddr)
230{
231    input_data = (char *)imageaddr;
232    input_len = imagesize;
233    output_ptr = 0;
234    output_data = (uch *)loadaddr;
235    free_mem_ptr = (unsigned long)_end;
236    free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
237
238    makecrc();
239    puts("Uncompressing Linux...");
240    gunzip();
241    flushcaches();
242    puts("Ok, booting the kernel.");
243}
244

Archive Download this file



interactive