Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
h8300
boot
compressed
misc.c
Go to the documentation of this file.
1
/*
2
* arch/h8300/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 h8300 by Yoshinori Sato 2006
10
*/
11
12
#include <asm/uaccess.h>
13
14
/*
15
* gzip declarations
16
*/
17
18
#define OF(args) args
19
#define STATIC static
20
21
#undef memset
22
#undef memcpy
23
#define memzero(s, n) memset ((s), 0, (n))
24
25
typedef
unsigned
char
uch
;
26
typedef
unsigned
short
ush
;
27
typedef
unsigned
long
ulg
;
28
29
#define WSIZE 0x8000
/* Window size must be at least 32k, */
30
/* and a power of two */
31
32
static
uch
*
inbuf
;
/* input buffer */
33
static
uch
window
[
WSIZE
];
/* Sliding window buffer */
34
35
static
unsigned
insize = 0;
/* valid bytes in inbuf */
36
static
unsigned
inptr
= 0;
/* index of next byte to be processed in inbuf */
37
static
unsigned
outcnt = 0;
/* bytes in output buffer */
38
39
/* gzip flag byte */
40
#define ASCII_FLAG 0x01
/* bit 0 set: file probably ASCII text */
41
#define CONTINUATION 0x02
/* bit 1 set: continuation of multi-part gzip file */
42
#define EXTRA_FIELD 0x04
/* bit 2 set: extra field present */
43
#define ORIG_NAME 0x08
/* bit 3 set: original file name present */
44
#define COMMENT 0x10
/* bit 4 set: file comment present */
45
#define ENCRYPTED 0x20
/* bit 5 set: file is encrypted */
46
#define RESERVED 0xC0
/* bit 6,7: reserved */
47
48
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
49
50
/* Diagnostic functions */
51
#ifdef DEBUG
52
# define Assert(cond,msg) {if(!(cond)) error(msg);}
53
# define Trace(x) fprintf x
54
# define Tracev(x) {if (verbose) fprintf x ;}
55
# define Tracevv(x) {if (verbose>1) fprintf x ;}
56
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
57
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
58
#else
59
# define Assert(cond,msg)
60
# define Trace(x)
61
# define Tracev(x)
62
# define Tracevv(x)
63
# define Tracec(c,x)
64
# define Tracecv(c,x)
65
#endif
66
67
static
int
fill_inbuf(
void
);
68
static
void
flush_window
(
void
);
69
static
void
error
(
char
*
m
);
70
71
extern
char
input_data
[];
72
extern
int
input_len
;
73
74
static
long
bytes_out = 0;
75
static
uch
*
output_data
;
76
static
unsigned
long
output_ptr
= 0;
77
78
static
void
error
(
char
*
m
);
79
80
int
puts
(
const
char
*);
81
82
extern
int
_text
;
/* Defined in vmlinux.lds.S */
83
extern
int
_end
;
84
static
unsigned
long
free_mem_ptr
;
85
static
unsigned
long
free_mem_end_ptr
;
86
87
#define HEAP_SIZE 0x10000
88
89
#include "../../../../lib/inflate.c"
90
91
#define SCR *((volatile unsigned char *)0xffff8a)
92
#define TDR *((volatile unsigned char *)0xffff8b)
93
#define SSR *((volatile unsigned char *)0xffff8c)
94
95
int
puts
(
const
char
*
s
)
96
{
97
return
0;
98
}
99
100
void
*
memset
(
void
*
s
,
int
c
,
size_t
n
)
101
{
102
int
i
;
103
char
*
ss
= (
char
*)s;
104
105
for
(i=0;i<
n
;i++) ss[i] = c;
106
return
s
;
107
}
108
109
void
*
memcpy
(
void
* __dest, __const
void
* __src,
110
size_t
__n)
111
{
112
int
i
;
113
char
*
d
= (
char
*)__dest, *
s
= (
char
*)__src;
114
115
for
(i=0;i<__n;i++) d[i] =
s
[i];
116
return
__dest;
117
}
118
119
/* ===========================================================================
120
* Fill the input buffer. This is called only when the buffer is empty
121
* and at least one byte is really needed.
122
*/
123
static
int
fill_inbuf(
void
)
124
{
125
if
(insize != 0) {
126
error
(
"ran out of input data"
);
127
}
128
129
inbuf
=
input_data
;
130
insize =
input_len
;
131
inptr
= 1;
132
return
inbuf
[0];
133
}
134
135
/* ===========================================================================
136
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
137
* (Used for the decompressed data only.)
138
*/
139
static
void
flush_window
(
void
)
140
{
141
ulg
c
=
crc
;
/* temporary variable */
142
unsigned
n
;
143
uch
*
in
, *
out
, ch;
144
145
in =
window
;
146
out = &
output_data
[
output_ptr
];
147
for
(n = 0; n < outcnt; n++) {
148
ch = *out++ = *in++;
149
c = crc_32_tab[((
int
)c ^ ch) & 0xff] ^ (c >> 8);
150
}
151
crc
=
c
;
152
bytes_out += (
ulg
)outcnt;
153
output_ptr
+= (
ulg
)outcnt;
154
outcnt = 0;
155
}
156
157
static
void
error
(
char
*
x
)
158
{
159
puts
(
"\n\n"
);
160
puts
(x);
161
puts
(
"\n\n -- System halted"
);
162
163
while
(1);
/* Halt */
164
}
165
166
#define STACK_SIZE (4096)
167
long
user_stack
[
STACK_SIZE
];
168
long
*
stack_start
= &user_stack[
STACK_SIZE
];
169
170
void
decompress_kernel
(
void
)
171
{
172
output_data
= 0;
173
output_ptr
= (
unsigned
long
)0x400000;
174
free_mem_ptr
= (
unsigned
long
)&
_end
;
175
free_mem_end_ptr
=
free_mem_ptr
+
HEAP_SIZE
;
176
177
makecrc();
178
puts
(
"Uncompressing Linux... "
);
179
gunzip
();
180
puts
(
"Ok, booting the kernel.\n"
);
181
}
Generated on Thu Jan 10 2013 12:48:57 for Linux Kernel by
1.8.2