linux: add broken flag to targets which are using 2.6.30
[openwrt.git] / target / linux / generic / patches-2.6.30 / 960-arm_lzma_loader.patch
1 --- a/arch/arm/boot/compressed/Makefile
2 +++ b/arch/arm/boot/compressed/Makefile
3 @@ -63,7 +63,7 @@ endif
4  
5  SEDFLAGS       = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
6  
7 -targets       := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
8 +targets       := vmlinux vmlinux.lds piggy.lzma piggy.o font.o font.c \
9                  head.o misc.o $(OBJS)
10  
11  ifeq ($(CONFIG_FUNCTION_TRACER),y)
12 @@ -96,10 +96,10 @@ $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj
13         $(call if_changed,ld)
14         @:
15  
16 -$(obj)/piggy.gz: $(obj)/../Image FORCE
17 -       $(call if_changed,gzip)
18 +$(obj)/piggy.lzma: $(obj)/../Image FORCE
19 +       $(call if_changed,lzma)
20  
21 -$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
22 +$(obj)/piggy.o:  $(obj)/piggy.lzma FORCE
23  
24  CFLAGS_font.o := -Dstatic=
25  
26 --- a/arch/arm/boot/compressed/misc.c
27 +++ b/arch/arm/boot/compressed/misc.c
28 @@ -186,36 +186,10 @@ static inline __ptr_t memcpy(__ptr_t __d
29         return __dest;
30  }
31  
32 -/*
33 - * gzip delarations
34 - */
35 -#define OF(args)  args
36 -#define STATIC static
37 -
38 -typedef unsigned char  uch;
39 -typedef unsigned short ush;
40 -typedef unsigned long  ulg;
41 -
42 -#define WSIZE 0x8000           /* Window size must be at least 32k, */
43 +#define WSIZE 0x20000          /* Window size must be at least 128k, */
44                                 /* and a power of two */
45  
46 -static uch *inbuf;             /* input buffer */
47 -static uch window[WSIZE];      /* Sliding window buffer */
48 -
49 -static unsigned insize;                /* valid bytes in inbuf */
50 -static unsigned inptr;         /* index of next byte to be processed in inbuf */
51 -static unsigned outcnt;                /* bytes in output buffer */
52 -
53 -/* gzip flag byte */
54 -#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
55 -#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
56 -#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
57 -#define ORIG_NAME    0x08 /* bit 3 set: original file name present */
58 -#define COMMENT      0x10 /* bit 4 set: file comment present */
59 -#define ENCRYPTED    0x20 /* bit 5 set: file is encrypted */
60 -#define RESERVED     0xC0 /* bit 6,7:   reserved */
61 -
62 -#define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
63 +static u8 window[WSIZE];       /* Sliding window buffer */
64  
65  /* Diagnostic functions */
66  #ifdef DEBUG
67 @@ -234,24 +208,21 @@ static unsigned outcnt;           /* bytes in out
68  #  define Tracecv(c,x)
69  #endif
70  
71 -static int  fill_inbuf(void);
72 -static void flush_window(void);
73  static void error(char *m);
74  
75  extern char input_data[];
76  extern char input_data_end[];
77  
78 -static uch *output_data;
79 -static ulg output_ptr;
80 -static ulg bytes_out;
81 +static unsigned long output_ptr;
82 +static unsigned long bytes_out;
83  
84  static void error(char *m);
85  
86  static void putstr(const char *);
87  
88  extern int end;
89 -static ulg free_mem_ptr;
90 -static ulg free_mem_end_ptr;
91 +static unsigned long free_mem_ptr;
92 +static unsigned long free_mem_end_ptr;
93  
94  #ifdef STANDALONE_DEBUG
95  #define NO_INFLATE_MALLOC
96 @@ -259,50 +230,10 @@ static ulg free_mem_end_ptr;
97  
98  #define ARCH_HAS_DECOMP_WDOG
99  
100 -#include "../../../../lib/inflate.c"
101 -
102 -/* ===========================================================================
103 - * Fill the input buffer. This is called only when the buffer is empty
104 - * and at least one byte is really needed.
105 - */
106 -int fill_inbuf(void)
107 -{
108 -       if (insize != 0)
109 -               error("ran out of input data");
110 -
111 -       inbuf = input_data;
112 -       insize = &input_data_end[0] - &input_data[0];
113 -
114 -       inptr = 1;
115 -       return inbuf[0];
116 -}
117 -
118 -/* ===========================================================================
119 - * Write the output window window[0..outcnt-1] and update crc and bytes_out.
120 - * (Used for the decompressed data only.)
121 - */
122 -void flush_window(void)
123 -{
124 -       ulg c = crc;
125 -       unsigned n;
126 -       uch *in, *out, ch;
127 -
128 -       in = window;
129 -       out = &output_data[output_ptr];
130 -       for (n = 0; n < outcnt; n++) {
131 -               ch = *out++ = *in++;
132 -               c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
133 -       }
134 -       crc = c;
135 -       bytes_out += (ulg)outcnt;
136 -       output_ptr += (ulg)outcnt;
137 -       outcnt = 0;
138 -       putstr(".");
139 -}
140 -
141  #ifndef arch_error
142  #define arch_error(x)
143  #endif
144 +#include "unlzma.c"
145  
146  static void error(char *x)
147  {
148 @@ -317,20 +248,16 @@ static void error(char *x)
149  
150  #ifndef STANDALONE_DEBUG
151  
152 -ulg
153 -decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
154 +unsigned long
155 +decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p, unsigned long free_mem_ptr_end_p,
156                   int arch_id)
157  {
158 -       output_data             = (uch *)output_start;  /* Points to kernel start */
159 -       free_mem_ptr            = free_mem_ptr_p;
160 -       free_mem_end_ptr        = free_mem_ptr_end_p;
161         __machine_arch_type     = arch_id;
162  
163         arch_decomp_setup();
164  
165 -       makecrc();
166         putstr("Uncompressing Linux...");
167 -       gunzip();
168 +       output_ptr += unlzma((u8 *) output_start, input_data, window);
169         putstr(" done, booting the kernel.\n");
170         return output_ptr;
171  }
172 @@ -340,11 +267,8 @@ char output_buffer[1500*1024];
173  
174  int main()
175  {
176 -       output_data = output_buffer;
177 -
178 -       makecrc();
179         putstr("Uncompressing Linux...");
180 -       gunzip();
181 +       unlzma((u8 *) output_buffer, input_data, window);
182         putstr("done.\n");
183         return 0;
184  }
185 --- a/arch/arm/boot/compressed/piggy.S
186 +++ b/arch/arm/boot/compressed/piggy.S
187 @@ -1,6 +1,6 @@
188         .section .piggydata,#alloc
189         .globl  input_data
190  input_data:
191 -       .incbin "arch/arm/boot/compressed/piggy.gz"
192 +       .incbin "arch/arm/boot/compressed/piggy.lzma"
193         .globl  input_data_end
194  input_data_end:
195 --- /dev/null
196 +++ b/arch/arm/boot/compressed/unlzma.c
197 @@ -0,0 +1,429 @@
198 +/*
199 + * Copyright (c) 2009  Felix Fietkau <nbd@openwrt.org>
200 + *
201 + * This program is free software; you can redistribute it and/or
202 + * modify it under the terms of the GNU General Public License
203 + * as published by the Free Software Foundation; either version 2,
204 + * or (at your option) any later version.
205 + *
206 + * This program is distributed in the hope that it will be useful,
207 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
208 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
209 + * GNU General Public License for more details.
210 + *
211 + * You should have received a copy of the GNU General Public License
212 + * along with this program; if not, write to the Free Software
213 + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
214 + *
215 + * uncompress.c
216 + */
217 +
218 +#include <linux/types.h>
219 +#include <asm/byteorder.h>
220 +#include "unlzma.h"
221 +
222 +struct unlzma_ctx {
223 +       const u8 *next_in;
224 +       u8 *next_out;
225 +       u8 *outbuf;
226 +
227 +       /* reader state */
228 +       u32 code;
229 +       u32 range;
230 +       u32 bound;
231 +
232 +       /* writer state */
233 +       u8 previous_byte;
234 +       ssize_t pos;
235 +
236 +       /* cstate */
237 +       int state;
238 +       u32 rep0, rep1, rep2, rep3;
239 +
240 +       void *workspace;
241 +} ctx;
242 +
243 +static int inbs = 0;
244 +static inline u8
245 +rc_read(void)
246 +{
247 +#if 0
248 +       if (unlikely(++inbs > 16 * 1024)) {
249 +               putstr(".");
250 +               inbs = 0;
251 +       }
252 +#endif
253 +       return *(ctx.next_in++);
254 +}
255 +
256 +
257 +static inline void
258 +rc_get_code(void)
259 +{
260 +       ctx.code = (ctx.code << 8) | rc_read();
261 +}
262 +
263 +static inline void
264 +rc_normalize(void)
265 +{
266 +       if (ctx.range < (1 << RC_TOP_BITS)) {
267 +               ctx.range <<= 8;
268 +               rc_get_code();
269 +       }
270 +}
271 +
272 +static inline int
273 +rc_is_bit_0(u16 *p)
274 +{
275 +       rc_normalize();
276 +       ctx.bound = *p * (ctx.range >> RC_MODEL_TOTAL_BITS);
277 +       return ctx.code < ctx.bound;
278 +}
279 +
280 +static inline void
281 +rc_update_bit_0(u16 *p)
282 +{
283 +       ctx.range = ctx.bound;
284 +       *p += ((1 << RC_MODEL_TOTAL_BITS) - *p) >> RC_MOVE_BITS;
285 +}
286 +
287 +static inline void
288 +rc_update_bit_1(u16 *p)
289 +{
290 +       ctx.range -= ctx.bound;
291 +       ctx.code -= ctx.bound;
292 +       *p -= *p >> RC_MOVE_BITS;
293 +}
294 +
295 +static inline bool
296 +rc_get_bit(u16 *p, int *symbol)
297 +{
298 +       if (rc_is_bit_0(p)) {
299 +               rc_update_bit_0(p);
300 +               *symbol *= 2;
301 +               return 0;
302 +       } else {
303 +               rc_update_bit_1(p);
304 +               *symbol = *symbol * 2 + 1;
305 +               return 1;
306 +       }
307 +}
308 +
309 +static inline int
310 +rc_direct_bit(void)
311 +{
312 +       rc_normalize();
313 +       ctx.range >>= 1;
314 +       if (ctx.code >= ctx.range) {
315 +               ctx.code -= ctx.range;
316 +               return 1;
317 +       }
318 +       return 0;
319 +}
320 +
321 +static inline void
322 +rc_bit_tree_decode(u16 *p, int num_levels, int *symbol)
323 +{
324 +       int i = num_levels;
325 +
326 +       *symbol = 1;
327 +       while (i--)
328 +               rc_get_bit(p + *symbol, symbol);
329 +       *symbol -= 1 << num_levels;
330 +}
331 +
332 +static inline u8
333 +peek_old_byte(u32 offs)
334 +{
335 +       u32 pos = ctx.pos - offs;
336 +       return ctx.outbuf[pos];
337 +}
338 +
339 +static inline void
340 +write_byte(u8 byte)
341 +{
342 +       ctx.previous_byte = byte;
343 +       *(ctx.next_out++) = byte;
344 +       ctx.pos++;
345 +}
346 +
347 +
348 +static inline void
349 +copy_byte(u32 offs)
350 +{
351 +       write_byte(peek_old_byte(offs));
352 +}
353 +
354 +static inline void
355 +copy_bytes(u32 rep0, int len)
356 +{
357 +       do {
358 +               copy_byte(rep0);
359 +               len--;
360 +       } while (len != 0);
361 +}
362 +
363 +static inline void
364 +process_bit0(u16 *p, int pos_state, u16 *prob,
365 +             int lc, u32 literal_pos_mask)
366 +{
367 +       int mi = 1;
368 +       rc_update_bit_0(prob);
369 +       prob = (p + LZMA_LITERAL +
370 +               (LZMA_LIT_SIZE
371 +                * (((ctx.pos & literal_pos_mask) << lc)
372 +                   + (ctx.previous_byte >> (8 - lc))))
373 +               );
374 +
375 +       if (ctx.state >= LZMA_NUM_LIT_STATES) {
376 +               int match_byte = peek_old_byte(ctx.rep0);
377 +               do {
378 +                       u16 bit;
379 +                       u16 *prob_lit;
380 +
381 +                       match_byte <<= 1;
382 +                       bit = match_byte & 0x100;
383 +                       prob_lit = prob + 0x100 + bit + mi;
384 +                       if (rc_get_bit(prob_lit, &mi) != !!bit)
385 +                               break;
386 +               } while (mi < 0x100);
387 +       }
388 +       while (mi < 0x100) {
389 +               u16 *prob_lit = prob + mi;
390 +               rc_get_bit(prob_lit, &mi);
391 +       }
392 +       write_byte(mi);
393 +       if (ctx.state < 4)
394 +               ctx.state = 0;
395 +       else if (ctx.state < 10)
396 +               ctx.state -= 3;
397 +       else
398 +               ctx.state -= 6;
399 +}
400 +
401 +static inline void
402 +process_bit1(u16 *p, int pos_state, u16 *prob)
403 +{
404 +       int offset;
405 +       u16 *prob_len;
406 +       int num_bits;
407 +       int len;
408 +
409 +       rc_update_bit_1(prob);
410 +       prob = p + LZMA_IS_REP + ctx.state;
411 +       if (rc_is_bit_0(prob)) {
412 +               rc_update_bit_0(prob);
413 +               ctx.rep3 = ctx.rep2;
414 +               ctx.rep2 = ctx.rep1;
415 +               ctx.rep1 = ctx.rep0;
416 +               ctx.state = ctx.state < LZMA_NUM_LIT_STATES ? 0 : 3;
417 +               prob = p + LZMA_LEN_CODER;
418 +       } else {
419 +               rc_update_bit_1(prob);
420 +               prob = p + LZMA_IS_REP_G0 + ctx.state;
421 +               if (rc_is_bit_0(prob)) {
422 +                       rc_update_bit_0(prob);
423 +                       prob = (p + LZMA_IS_REP_0_LONG
424 +                               + (ctx.state <<
425 +                                  LZMA_NUM_POS_BITS_MAX) +
426 +                               pos_state);
427 +                       if (rc_is_bit_0(prob)) {
428 +                               rc_update_bit_0(prob);
429 +
430 +                               ctx.state = ctx.state < LZMA_NUM_LIT_STATES ?
431 +                                       9 : 11;
432 +                               copy_byte(ctx.rep0);
433 +                               return;
434 +                       } else {
435 +                               rc_update_bit_1(prob);
436 +                       }
437 +               } else {
438 +                       u32 distance;
439 +
440 +                       rc_update_bit_1(prob);
441 +                       prob = p + LZMA_IS_REP_G1 + ctx.state;
442 +                       if (rc_is_bit_0(prob)) {
443 +                               rc_update_bit_0(prob);
444 +                               distance = ctx.rep1;
445 +                       } else {
446 +                               rc_update_bit_1(prob);
447 +                               prob = p + LZMA_IS_REP_G2 + ctx.state;
448 +                               if (rc_is_bit_0(prob)) {
449 +                                       rc_update_bit_0(prob);
450 +                                       distance = ctx.rep2;
451 +                               } else {
452 +                                       rc_update_bit_1(prob);
453 +                                       distance = ctx.rep3;
454 +                                       ctx.rep3 = ctx.rep2;
455 +                               }
456 +                               ctx.rep2 = ctx.rep1;
457 +                       }
458 +                       ctx.rep1 = ctx.rep0;
459 +                       ctx.rep0 = distance;
460 +               }
461 +               ctx.state = ctx.state < LZMA_NUM_LIT_STATES ? 8 : 11;
462 +               prob = p + LZMA_REP_LEN_CODER;
463 +       }
464 +
465 +       prob_len = prob + LZMA_LEN_CHOICE;
466 +       if (rc_is_bit_0(prob_len)) {
467 +               rc_update_bit_0(prob_len);
468 +               prob_len = (prob + LZMA_LEN_LOW
469 +                           + (pos_state <<
470 +                              LZMA_LEN_NUM_LOW_BITS));
471 +               offset = 0;
472 +               num_bits = LZMA_LEN_NUM_LOW_BITS;
473 +       } else {
474 +               rc_update_bit_1(prob_len);
475 +               prob_len = prob + LZMA_LEN_CHOICE_2;
476 +               if (rc_is_bit_0(prob_len)) {
477 +                       rc_update_bit_0(prob_len);
478 +                       prob_len = (prob + LZMA_LEN_MID
479 +                                   + (pos_state <<
480 +                                      LZMA_LEN_NUM_MID_BITS));
481 +                       offset = 1 << LZMA_LEN_NUM_LOW_BITS;
482 +                       num_bits = LZMA_LEN_NUM_MID_BITS;
483 +               } else {
484 +                       rc_update_bit_1(prob_len);
485 +                       prob_len = prob + LZMA_LEN_HIGH;
486 +                       offset = ((1 << LZMA_LEN_NUM_LOW_BITS)
487 +                                 + (1 << LZMA_LEN_NUM_MID_BITS));
488 +                       num_bits = LZMA_LEN_NUM_HIGH_BITS;
489 +               }
490 +       }
491 +
492 +       rc_bit_tree_decode(prob_len, num_bits, &len);
493 +       len += offset;
494 +
495 +       if (ctx.state < 4) {
496 +               int pos_slot;
497 +
498 +               ctx.state += LZMA_NUM_LIT_STATES;
499 +               prob =
500 +                       p + LZMA_POS_SLOT +
501 +                       ((len <
502 +                         LZMA_NUM_LEN_TO_POS_STATES ? len :
503 +                         LZMA_NUM_LEN_TO_POS_STATES - 1)
504 +                        << LZMA_NUM_POS_SLOT_BITS);
505 +               rc_bit_tree_decode(prob,
506 +                                  LZMA_NUM_POS_SLOT_BITS,
507 +                                  &pos_slot);
508 +               if (pos_slot >= LZMA_START_POS_MODEL_INDEX) {
509 +                       int i, mi;
510 +                       num_bits = (pos_slot >> 1) - 1;
511 +                       ctx.rep0 = 2 | (pos_slot & 1);
512 +                       if (pos_slot < LZMA_END_POS_MODEL_INDEX) {
513 +                               ctx.rep0 <<= num_bits;
514 +                               prob = p + LZMA_SPEC_POS +
515 +                                       ctx.rep0 - pos_slot - 1;
516 +                       } else {
517 +                               num_bits -= LZMA_NUM_ALIGN_BITS;
518 +                               while (num_bits--)
519 +                                       ctx.rep0 = (ctx.rep0 << 1) |
520 +                                               rc_direct_bit();
521 +                               prob = p + LZMA_ALIGN;
522 +                               ctx.rep0 <<= LZMA_NUM_ALIGN_BITS;
523 +                               num_bits = LZMA_NUM_ALIGN_BITS;
524 +                       }
525 +                       i = 1;
526 +                       mi = 1;
527 +                       while (num_bits--) {
528 +                               if (rc_get_bit(prob + mi, &mi))
529 +                                       ctx.rep0 |= i;
530 +                               i <<= 1;
531 +                       }
532 +               } else
533 +                       ctx.rep0 = pos_slot;
534 +               if (++(ctx.rep0) == 0)
535 +                       return;
536 +       }
537 +
538 +       len += LZMA_MATCH_MIN_LEN;
539 +
540 +       copy_bytes(ctx.rep0, len);
541 +}
542 +
543 +
544 +static int
545 +do_unlzma(void)
546 +{
547 +       u8 hdr_buf[sizeof(struct lzma_header)];
548 +       struct lzma_header *header = (struct lzma_header *)hdr_buf;
549 +       u32 pos_state_mask;
550 +       u32 literal_pos_mask;
551 +       int lc, pb, lp;
552 +       int num_probs;
553 +       int i, mi;
554 +       u16 *p;
555 +
556 +       for (i = 0; i < sizeof(struct lzma_header); i++) {
557 +               hdr_buf[i] = rc_read();
558 +       }
559 +
560 +       ctx.pos = 0;
561 +       ctx.state = 0;
562 +       ctx.rep0 = ctx.rep1 = ctx.rep2 = ctx.rep3 = 1;
563 +
564 +       ctx.previous_byte = 0;
565 +       ctx.code = 0;
566 +       ctx.range = 0xFFFFFFFF;
567 +
568 +       if (header->pos >= (9 * 5 * 5))
569 +               return -1;
570 +
571 +       mi = 0;
572 +       lc = header->pos;
573 +       while (lc >= 9) {
574 +               mi++;
575 +               lc -= 9;
576 +       }
577 +       pb = 0;
578 +       lp = mi;
579 +       while (lp >= 5) {
580 +               pb++;
581 +               lp -= 5;
582 +       }
583 +       pos_state_mask = (1 << pb) - 1;
584 +       literal_pos_mask = (1 << lp) - 1;
585 +
586 +       p = (u16 *) ctx.workspace;
587 +       if (!p)
588 +               return -1;
589 +
590 +       num_probs = LZMA_LITERAL + (LZMA_LIT_SIZE << (lc + lp));
591 +       for (i = 0; i < num_probs; i++)
592 +               p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1;
593 +
594 +       for (i = 0; i < 5; i++)
595 +               rc_get_code();
596 +
597 +       while (1) {
598 +               int pos_state = ctx.pos & pos_state_mask;
599 +               u16 *prob = p + LZMA_IS_MATCH +
600 +                       (ctx.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
601 +               if (rc_is_bit_0(prob))
602 +                       process_bit0(p, pos_state, prob,
603 +                                    lc, literal_pos_mask);
604 +               else {
605 +                       process_bit1(p, pos_state, prob);
606 +                       if (ctx.rep0 == 0)
607 +                               break;
608 +               }
609 +       }
610 +
611 +       return ctx.pos;
612 +}
613 +
614 +
615 +static int unlzma(unsigned char *dest, const unsigned char *src, unsigned char *workspace)
616 +{
617 +       memset(&ctx, 0, sizeof(ctx));
618 +       ctx.outbuf = dest;
619 +       ctx.next_in = src;
620 +       ctx.next_out = dest;
621 +       ctx.workspace = workspace;
622 +
623 +       return do_unlzma();
624 +}
625 +
626 +
627 --- /dev/null
628 +++ b/arch/arm/boot/compressed/unlzma.h
629 @@ -0,0 +1,81 @@
630 +/* LZMA uncompresion module for pcomp
631 + * Copyright (C) 2009  Felix Fietkau <nbd@openwrt.org>
632 + *
633 + * Based on:
634 + *  Initial Linux kernel adaptation
635 + *  Copyright (C) 2006  Alain < alain@knaff.lu >
636 + *
637 + *  Based on small lzma deflate implementation/Small range coder
638 + *  implementation for lzma.
639 + *  Copyright (C) 2006  Aurelien Jacobs < aurel@gnuage.org >
640 + *
641 + *  Based on LzmaDecode.c from the LZMA SDK 4.22 (http://www.7-zip.org/)
642 + *  Copyright (C) 1999-2005  Igor Pavlov
643 + *
644 + * This program is free software; you can redistribute it and/or modify it
645 + * under the terms of the GNU General Public License version 2 as published
646 + * by the Free Software Foundation.
647 + */
648 +#ifndef __UNLZMA_H
649 +#define __UNLZMA_H
650 +
651 +struct lzma_header {
652 +       __u8 pos;
653 +       __le32 dict_size;
654 +       __le64 uncompr_size;
655 +} __attribute__ ((packed));
656 +
657 +
658 +#define RC_TOP_BITS 24
659 +#define RC_MOVE_BITS 5
660 +#define RC_MODEL_TOTAL_BITS 11
661 +
662 +#define LZMA_BASE_SIZE 1846
663 +#define LZMA_LIT_SIZE 768
664 +
665 +#define LZMA_NUM_POS_BITS_MAX 4
666 +
667 +#define LZMA_LEN_NUM_LOW_BITS 3
668 +#define LZMA_LEN_NUM_MID_BITS 3
669 +#define LZMA_LEN_NUM_HIGH_BITS 8
670 +
671 +#define LZMA_LEN_CHOICE 0
672 +#define LZMA_LEN_CHOICE_2 (LZMA_LEN_CHOICE + 1)
673 +#define LZMA_LEN_LOW (LZMA_LEN_CHOICE_2 + 1)
674 +#define LZMA_LEN_MID (LZMA_LEN_LOW \
675 +                     + (1 << (LZMA_NUM_POS_BITS_MAX + LZMA_LEN_NUM_LOW_BITS)))
676 +#define LZMA_LEN_HIGH (LZMA_LEN_MID \
677 +                      +(1 << (LZMA_NUM_POS_BITS_MAX + LZMA_LEN_NUM_MID_BITS)))
678 +#define LZMA_NUM_LEN_PROBS (LZMA_LEN_HIGH + (1 << LZMA_LEN_NUM_HIGH_BITS))
679 +
680 +#define LZMA_NUM_STATES 12
681 +#define LZMA_NUM_LIT_STATES 7
682 +
683 +#define LZMA_START_POS_MODEL_INDEX 4
684 +#define LZMA_END_POS_MODEL_INDEX 14
685 +#define LZMA_NUM_FULL_DISTANCES (1 << (LZMA_END_POS_MODEL_INDEX >> 1))
686 +
687 +#define LZMA_NUM_POS_SLOT_BITS 6
688 +#define LZMA_NUM_LEN_TO_POS_STATES 4
689 +
690 +#define LZMA_NUM_ALIGN_BITS 4
691 +
692 +#define LZMA_MATCH_MIN_LEN 2
693 +
694 +#define LZMA_IS_MATCH 0
695 +#define LZMA_IS_REP (LZMA_IS_MATCH + (LZMA_NUM_STATES << LZMA_NUM_POS_BITS_MAX))
696 +#define LZMA_IS_REP_G0 (LZMA_IS_REP + LZMA_NUM_STATES)
697 +#define LZMA_IS_REP_G1 (LZMA_IS_REP_G0 + LZMA_NUM_STATES)
698 +#define LZMA_IS_REP_G2 (LZMA_IS_REP_G1 + LZMA_NUM_STATES)
699 +#define LZMA_IS_REP_0_LONG (LZMA_IS_REP_G2 + LZMA_NUM_STATES)
700 +#define LZMA_POS_SLOT (LZMA_IS_REP_0_LONG \
701 +                      + (LZMA_NUM_STATES << LZMA_NUM_POS_BITS_MAX))
702 +#define LZMA_SPEC_POS (LZMA_POS_SLOT \
703 +                      +(LZMA_NUM_LEN_TO_POS_STATES << LZMA_NUM_POS_SLOT_BITS))
704 +#define LZMA_ALIGN (LZMA_SPEC_POS \
705 +                   + LZMA_NUM_FULL_DISTANCES - LZMA_END_POS_MODEL_INDEX)
706 +#define LZMA_LEN_CODER (LZMA_ALIGN + (1 << LZMA_NUM_ALIGN_BITS))
707 +#define LZMA_REP_LEN_CODER (LZMA_LEN_CODER + LZMA_NUM_LEN_PROBS)
708 +#define LZMA_LITERAL (LZMA_REP_LEN_CODER + LZMA_NUM_LEN_PROBS)
709 +
710 +#endif