rev |
line source |
pascal@3908
|
1 --- linux-2.6.30.4/init/initramfs.c
|
pascal@3908
|
2 +++ linux-2.6.30.4/init/initramfs.c
|
pascal@3908
|
3 @@ -425,7 +425,8 @@
|
pascal@3908
|
4 return len - count;
|
pascal@3908
|
5 }
|
pascal@3908
|
6
|
pascal@3908
|
7 -static int __init flush_buffer(void *bufv, unsigned len)
|
pascal@3909
|
8 +#define flush_buffer cpio_flush_buffer
|
pascal@3908
|
9 +int __init flush_buffer(void *bufv, unsigned len)
|
pascal@3908
|
10 {
|
pascal@3908
|
11 char *buf = (char *) bufv;
|
pascal@3908
|
12 int written;
|
pascal@3908
|
13
|
pascal@3908
|
14 --- linux-2.6.30.4/lib/decompress_unlzma.c
|
pascal@3908
|
15 +++ linux-2.6.30.4/lib/decompress_unlzma.c
|
pascal@3908
|
16 @@ -278,6 +278,10 @@
|
pascal@3908
|
17 size_t global_pos;
|
pascal@3908
|
18 int(*flush)(void*, unsigned int);
|
pascal@3908
|
19 struct lzma_header *header;
|
pascal@3908
|
20 + int is_cpio_flush;
|
pascal@3908
|
21 + uint8_t **buffer_index;
|
pascal@3908
|
22 + int next_index;
|
pascal@3908
|
23 + int max_index;
|
pascal@3908
|
24 };
|
pascal@3908
|
25
|
pascal@3908
|
26 struct cstate {
|
pascal@3908
|
27 @@ -294,6 +298,14 @@
|
pascal@3908
|
28 static inline uint8_t INIT peek_old_byte(struct writer *wr,
|
pascal@3908
|
29 uint32_t offs)
|
pascal@3908
|
30 {
|
pascal@3908
|
31 + if (wr->is_cpio_flush) {
|
pascal@3908
|
32 + int32_t pos;
|
pascal@3908
|
33 + while (offs > wr->header->dict_size)
|
pascal@3908
|
34 + offs -= wr->header->dict_size;
|
pascal@3908
|
35 + pos = wr->buffer_pos - offs;
|
pascal@3908
|
36 + return wr->buffer_index[pos / LZMA_IOBUF_SIZE]
|
pascal@3908
|
37 + [pos % LZMA_IOBUF_SIZE];
|
pascal@3908
|
38 + }
|
pascal@3908
|
39 if (!wr->flush) {
|
pascal@3908
|
40 int32_t pos;
|
pascal@3908
|
41 while (offs > wr->header->dict_size)
|
pascal@3908
|
42 @@ -311,6 +323,34 @@
|
pascal@3908
|
43
|
pascal@3908
|
44 static inline void INIT write_byte(struct writer *wr, uint8_t byte)
|
pascal@3908
|
45 {
|
pascal@3908
|
46 + if (wr->is_cpio_flush) {
|
pascal@3908
|
47 + if (wr->buffer_pos % LZMA_IOBUF_SIZE == 0) {
|
pascal@3908
|
48 + // if the following large_malloc fails, the initramfs
|
pascal@3908
|
49 + // whould not be load with is_cpio_flush forced 0 too.
|
pascal@3908
|
50 + // Remember we do not allocate historic buffer.
|
pascal@3908
|
51 + // Let's assume it will never fail !
|
pascal@3908
|
52 + if (wr->next_index >= wr->max_index) {
|
pascal@3908
|
53 + // realloc wr->buffer_index
|
pascal@3908
|
54 + uint8_t **p = wr->buffer_index;
|
pascal@3908
|
55 + wr->buffer_index = (uint8_t **)
|
pascal@3908
|
56 + large_malloc(LZMA_IOBUF_SIZE +
|
pascal@3908
|
57 + sizeof(*p) * wr->max_index);
|
pascal@3908
|
58 + if (wr->max_index) {
|
pascal@3908
|
59 + memcpy(wr->buffer_index, p,
|
pascal@3908
|
60 + sizeof(*p) * wr->max_index);
|
pascal@3908
|
61 + free(p);
|
pascal@3908
|
62 + }
|
pascal@3908
|
63 + wr->max_index += LZMA_IOBUF_SIZE / sizeof(*p);
|
pascal@3908
|
64 + }
|
pascal@3908
|
65 + wr->buffer_index[wr->next_index++] =
|
pascal@3908
|
66 + (uint8_t *) large_malloc(LZMA_IOBUF_SIZE);
|
pascal@3908
|
67 + }
|
pascal@3908
|
68 + wr->buffer_index[wr->buffer_pos / LZMA_IOBUF_SIZE]
|
pascal@3908
|
69 + [wr->buffer_pos % LZMA_IOBUF_SIZE] =
|
pascal@3908
|
70 + wr->previous_byte = byte;
|
pascal@3908
|
71 + wr->buffer_pos++;
|
pascal@3908
|
72 + return;
|
pascal@3908
|
73 + }
|
pascal@3908
|
74 wr->buffer[wr->buffer_pos++] = wr->previous_byte = byte;
|
pascal@3908
|
75 if (wr->flush && wr->buffer_pos == wr->header->dict_size) {
|
pascal@3908
|
76 wr->buffer_pos = 0;
|
pascal@3908
|
77 @@ -339,6 +379,9 @@
|
pascal@3908
|
78 int pos_state, uint16_t *prob,
|
pascal@3908
|
79 int lc, uint32_t literal_pos_mask) {
|
pascal@3908
|
80 int mi = 1;
|
pascal@3908
|
81 + static const int state[LZMA_NUM_STATES] =
|
pascal@3908
|
82 + { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5 };
|
pascal@3908
|
83 +
|
pascal@3908
|
84 rc_update_bit_0(rc, prob);
|
pascal@3908
|
85 prob = (p + LZMA_LITERAL +
|
pascal@3908
|
86 (LZMA_LIT_SIZE
|
pascal@3908
|
87 @@ -369,18 +412,13 @@
|
pascal@3908
|
88 rc_get_bit(rc, prob_lit, &mi);
|
pascal@3908
|
89 }
|
pascal@3908
|
90 write_byte(wr, mi);
|
pascal@3908
|
91 - if (cst->state < 4)
|
pascal@3908
|
92 - cst->state = 0;
|
pascal@3908
|
93 - else if (cst->state < 10)
|
pascal@3908
|
94 - cst->state -= 3;
|
pascal@3908
|
95 - else
|
pascal@3908
|
96 - cst->state -= 6;
|
pascal@3908
|
97 + cst->state = state[cst->state];
|
pascal@3908
|
98 }
|
pascal@3908
|
99
|
pascal@3908
|
100 static inline void INIT process_bit1(struct writer *wr, struct rc *rc,
|
pascal@3908
|
101 struct cstate *cst, uint16_t *p,
|
pascal@3908
|
102 int pos_state, uint16_t *prob) {
|
pascal@3908
|
103 - int offset;
|
pascal@3908
|
104 + int offset;
|
pascal@3908
|
105 uint16_t *prob_len;
|
pascal@3908
|
106 int num_bits;
|
pascal@3908
|
107 int len;
|
pascal@3908
|
108 @@ -396,7 +434,7 @@
|
pascal@3908
|
109 prob = p + LZMA_LEN_CODER;
|
pascal@3908
|
110 } else {
|
pascal@3908
|
111 rc_update_bit_1(rc, prob);
|
pascal@3908
|
112 - prob = p + LZMA_IS_REP_G0 + cst->state;
|
pascal@3908
|
113 + prob += LZMA_IS_REP_G0 - LZMA_IS_REP;
|
pascal@3908
|
114 if (rc_is_bit_0(rc, prob)) {
|
pascal@3908
|
115 rc_update_bit_0(rc, prob);
|
pascal@3908
|
116 prob = (p + LZMA_IS_REP_0_LONG
|
pascal@3908
|
117 @@ -417,13 +455,13 @@
|
pascal@3908
|
118 uint32_t distance;
|
pascal@3908
|
119
|
pascal@3908
|
120 rc_update_bit_1(rc, prob);
|
pascal@3908
|
121 - prob = p + LZMA_IS_REP_G1 + cst->state;
|
pascal@3908
|
122 + prob += LZMA_IS_REP_G1 - LZMA_IS_REP_G0;
|
pascal@3908
|
123 if (rc_is_bit_0(rc, prob)) {
|
pascal@3908
|
124 rc_update_bit_0(rc, prob);
|
pascal@3908
|
125 distance = cst->rep1;
|
pascal@3908
|
126 } else {
|
pascal@3908
|
127 rc_update_bit_1(rc, prob);
|
pascal@3908
|
128 - prob = p + LZMA_IS_REP_G2 + cst->state;
|
pascal@3908
|
129 + prob += LZMA_IS_REP_G2 - LZMA_IS_REP_G1;
|
pascal@3908
|
130 if (rc_is_bit_0(rc, prob)) {
|
pascal@3908
|
131 rc_update_bit_0(rc, prob);
|
pascal@3908
|
132 distance = cst->rep2;
|
pascal@3911
|
133 @@ -444,24 +482,24 @@
|
pascal@3911
|
134 prob_len = prob + LZMA_LEN_CHOICE;
|
pascal@3911
|
135 if (rc_is_bit_0(rc, prob_len)) {
|
pascal@3911
|
136 rc_update_bit_0(rc, prob_len);
|
pascal@3911
|
137 - prob_len = (prob + LZMA_LEN_LOW
|
pascal@3911
|
138 + prob_len += LZMA_LEN_LOW - LZMA_LEN_CHOICE
|
pascal@3911
|
139 + (pos_state <<
|
pascal@3911
|
140 LZMA_LEN_NUM_LOW_BITS));
|
pascal@3911
|
141 offset = 0;
|
pascal@3908
|
142 num_bits = LZMA_LEN_NUM_LOW_BITS;
|
pascal@3908
|
143 } else {
|
pascal@3908
|
144 rc_update_bit_1(rc, prob_len);
|
pascal@3908
|
145 - prob_len = prob + LZMA_LEN_CHOICE_2;
|
pascal@3908
|
146 + prob_len += LZMA_LEN_CHOICE_2 - LZMA_LEN_CHOICE;
|
pascal@3908
|
147 if (rc_is_bit_0(rc, prob_len)) {
|
pascal@3908
|
148 rc_update_bit_0(rc, prob_len);
|
pascal@3911
|
149 - prob_len = (prob + LZMA_LEN_MID
|
pascal@3911
|
150 + prob_len += LZMA_LEN_MID - LZMA_LEN_CHOICE_2
|
pascal@3911
|
151 + (pos_state <<
|
pascal@3911
|
152 LZMA_LEN_NUM_MID_BITS));
|
pascal@3911
|
153 offset = 1 << LZMA_LEN_NUM_LOW_BITS;
|
pascal@3908
|
154 num_bits = LZMA_LEN_NUM_MID_BITS;
|
pascal@3908
|
155 } else {
|
pascal@3908
|
156 rc_update_bit_1(rc, prob_len);
|
pascal@3908
|
157 - prob_len = prob + LZMA_LEN_HIGH;
|
pascal@3908
|
158 + prob_len += LZMA_LEN_HIGH - LZMA_LEN_CHOICE_2;
|
pascal@3908
|
159 offset = ((1 << LZMA_LEN_NUM_LOW_BITS)
|
pascal@3908
|
160 + (1 << LZMA_LEN_NUM_MID_BITS));
|
pascal@3908
|
161 num_bits = LZMA_LEN_NUM_HIGH_BITS;
|
pascal@3908
|
162 @@ -529,6 +567,7 @@
|
pascal@3908
|
163 void(*error_fn)(char *x)
|
pascal@3908
|
164 )
|
pascal@3908
|
165 {
|
pascal@3908
|
166 + extern int cpio_flush_buffer(void*, unsigned int);
|
pascal@3908
|
167 struct lzma_header header;
|
pascal@3908
|
168 int lc, pb, lp;
|
pascal@3908
|
169 uint32_t pos_state_mask;
|
pascal@3908
|
170 @@ -563,6 +602,10 @@
|
pascal@3908
|
171 wr.global_pos = 0;
|
pascal@3908
|
172 wr.previous_byte = 0;
|
pascal@3908
|
173 wr.buffer_pos = 0;
|
pascal@3908
|
174 + wr.is_cpio_flush = 0;
|
pascal@3908
|
175 + if (flush == cpio_flush_buffer)
|
pascal@3908
|
176 + wr.is_cpio_flush = 1;
|
pascal@3908
|
177 + wr.buffer_index = NULL;
|
pascal@3908
|
178
|
pascal@3908
|
179 rc_init(&rc, fill, inbuf, in_len);
|
pascal@3908
|
180
|
pascal@3911
|
181 @@ -596,23 +639,23 @@
|
pascal@3908
|
182 if (header.dict_size == 0)
|
pascal@3908
|
183 header.dict_size = 1;
|
pascal@3908
|
184
|
pascal@3908
|
185 - if (output)
|
pascal@3908
|
186 + if (output || wr.is_cpio_flush)
|
pascal@3908
|
187 wr.buffer = output;
|
pascal@3908
|
188 else {
|
pascal@3908
|
189 wr.bufsize = MIN(header.dst_size, header.dict_size);
|
pascal@3908
|
190 wr.buffer = large_malloc(wr.bufsize);
|
pascal@3908
|
191 }
|
pascal@3908
|
192 - if (wr.buffer == NULL)
|
pascal@3908
|
193 + if (wr.buffer == NULL && !wr.is_cpio_flush)
|
pascal@3908
|
194 goto exit_1;
|
pascal@3908
|
195
|
pascal@3908
|
196 num_probs = LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp));
|
pascal@3911
|
197 p = (uint16_t *) large_malloc(num_probs * sizeof(*p));
|
pascal@3911
|
198 if (p == 0)
|
pascal@3911
|
199 goto exit_2;
|
pascal@3911
|
200 - num_probs = LZMA_LITERAL + (LZMA_LIT_SIZE << (lc + lp));
|
pascal@3911
|
201 + num_probs += LZMA_LITERAL - LZMA_BASE_SIZE;
|
pascal@3908
|
202 for (i = 0; i < num_probs; i++)
|
pascal@3908
|
203 p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1;
|
pascal@3908
|
204 -
|
pascal@3908
|
205 + wr.max_index = wr.next_index = 0;
|
pascal@3908
|
206 rc_init_code(&rc);
|
pascal@3908
|
207
|
pascal@3908
|
208 while (get_pos(&wr) < header.dst_size) {
|
pascal@3908
|
209 @@ -631,12 +674,25 @@
|
pascal@3908
|
210
|
pascal@3908
|
211 if (posp)
|
pascal@3908
|
212 *posp = rc.ptr-rc.buffer;
|
pascal@3908
|
213 - if (wr.flush)
|
pascal@3908
|
214 + if (wr.is_cpio_flush) {
|
pascal@3908
|
215 + int i;
|
pascal@3908
|
216 + for (i = 0; i < wr.next_index -1; i++) {
|
pascal@3908
|
217 + wr.flush(wr.buffer_index[i], LZMA_IOBUF_SIZE);
|
pascal@3908
|
218 + large_free(wr.buffer_index[i]);
|
pascal@3908
|
219 + }
|
pascal@3908
|
220 + if (i < wr.next_index) {
|
pascal@3908
|
221 + wr.flush(wr.buffer_index[i],
|
pascal@3908
|
222 + wr.buffer_pos % LZMA_IOBUF_SIZE);
|
pascal@3908
|
223 + large_free(wr.buffer_index[i]);
|
pascal@3908
|
224 + }
|
pascal@3908
|
225 + large_free(wr.buffer_index);
|
pascal@3908
|
226 + }
|
pascal@3908
|
227 + else if (wr.flush)
|
pascal@3908
|
228 wr.flush(wr.buffer, wr.buffer_pos);
|
pascal@3908
|
229 ret = 0;
|
pascal@3908
|
230 large_free(p);
|
pascal@3908
|
231 exit_2:
|
pascal@3908
|
232 - if (!output)
|
pascal@3908
|
233 + if (!output && !wr.is_cpio_flush)
|
pascal@3908
|
234 large_free(wr.buffer);
|
pascal@3908
|
235 exit_1:
|
pascal@3908
|
236 if (!buf)
|