2
* GRUB -- GRand Unified Bootloader
3
* Copyright (C) 2008 Free Software Foundation, Inc.
5
* GRUB is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* GRUB is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
21
#define LZMA_BASE_SIZE 1846
22
#define LZMA_LIT_SIZE 768
24
#define LZMA_PROPERTIES_SIZE 5
26
#define kNumTopBits 24
27
#define kTopValue (1 << kNumTopBits)
29
#define kNumBitModelTotalBits 11
30
#define kBitModelTotal (1 << kNumBitModelTotalBits)
31
#define kNumMoveBits 5
34
#define kNumPosBitsMax 4
35
#define kNumPosStatesMax (1 << kNumPosBitsMax)
37
#define kLenNumLowBits 3
38
#define kLenNumLowSymbols (1 << kLenNumLowBits)
39
#define kLenNumMidBits 3
40
#define kLenNumMidSymbols (1 << kLenNumMidBits)
41
#define kLenNumHighBits 8
42
#define kLenNumHighSymbols (1 << kLenNumHighBits)
45
#define LenChoice2 (LenChoice + 1)
46
#define LenLow (LenChoice2 + 1)
47
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
48
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
49
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
53
#define kNumLitStates 7
55
#define kStartPosModelIndex 4
56
#define kEndPosModelIndex 14
57
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
59
#define kNumPosSlotBits 6
60
#define kNumLenToPosStates 4
62
#define kNumAlignBits 4
63
#define kAlignTableSize (1 << kNumAlignBits)
65
#define kMatchMinLen 2
68
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
69
#define IsRepG0 (IsRep + kNumStates)
70
#define IsRepG1 (IsRepG0 + kNumStates)
71
#define IsRepG2 (IsRepG1 + kNumStates)
72
#define IsRep0Long (IsRepG2 + kNumStates)
73
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
74
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
75
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
76
#define LenCoder (Align + kAlignTableSize)
77
#define RepLenCoder (LenCoder + kNumLenProbs)
78
#define Literal (RepLenCoder + kNumLenProbs)
80
#define out_size 8(%ebp)
82
#define now_pos -4(%ebp)
83
#define prev_byte -8(%ebp)
84
#define range -12(%ebp)
85
#define code -16(%ebp)
86
#define state -20(%ebp)
87
#define rep0 -24(%ebp)
88
#define rep1 -28(%ebp)
89
#define rep2 -32(%ebp)
90
#define rep3 -36(%ebp)
98
#define POS_STATE_MASK ((1 << (FIXED_PB)) - 1)
99
#define LIT_POS_MASK ((1 << (FIXED_LP)) - 1)
101
#define LOCAL_SIZE 36
108
#define probs 12(%ebx)
110
#define pos_state_mask -40(%ebp)
111
#define lit_pos_mask -44(%ebp)
113
#define LOCAL_SIZE 44
117
RangeDecoderBitDecode:
119
leal (%ebx, %eax, 4), %eax
129
shrl $kNumBitModelTotalBits, %edx
136
movl $kBitModelTotal, %edx
138
shrl $kNumMoveBits, %edx
143
cmpl $kTopValue, range
156
shrl $kNumMoveBits, %edx
161
RangeDecoderBitTreeDecode:
162
RangeDecoderReverseBitTreeDecode:
175
call RangeDecoderBitDecode
193
subl %ecx, %edx /* RangeDecoderBitTreeDecode */
194
popl %ecx /* RangeDecoderReverseBitTreeDecode */
199
addl $LenChoice, %eax
200
call RangeDecoderBitDecode
204
movb $kLenNumLowBits, %cl
212
call RangeDecoderBitTreeDecode
219
addl $LenChoice2, %eax
220
call RangeDecoderBitDecode
223
pushl $kLenNumLowSymbols
224
movb $kLenNumMidBits, %cl
229
pushl $(kLenNumLowSymbols + kLenNumMidSymbols)
231
movb $kLenNumHighBits, %cl
241
* int LzmaDecode(CLzmaDecoderState *vs,
242
* const unsigned char *inStream,
243
* unsigned char *outStream,
251
subl $LOCAL_SIZE, %esp
269
movl $(Literal + (LZMA_LIT_SIZE << (FIXED_LC + FIXED_LP))), %ecx
271
movl $LZMA_LIT_SIZE, %eax
280
movl $(kBitModelTotal >> 1), %eax
303
movl %edx, pos_state_mask
309
movl %edx, lit_pos_mask;
312
/* RangeDecoderInit */
346
andl $POS_STATE_MASK, %eax
348
andl pos_state_mask, %eax
350
pushl %eax /* posState */
352
shll $kNumPosBitsMax, %edx
354
pushl %eax /* (state << kNumPosBitsMax) + posState */
356
call RangeDecoderBitDecode
362
andl $LIT_POS_MASK, %eax
365
shrl $(8 - FIXED_LC), %edx
367
andl lit_pos_mask, %eax
377
movl $LZMA_LIT_SIZE, %edx
382
incl %edx /* edx = 1 */
386
pushl (%edi, %eax) /* matchByte */
388
cmpb $kNumLitStates, state
391
/* LzmaLiteralDecodeMatch */
405
leal 0x100(%edx, %eax), %eax
407
call RangeDecoderBitDecode
419
/* LzmaLiteralDecode */
427
call RangeDecoderBitDecode
455
call RangeDecoderBitDecode
460
call RangeDecoderBitDecode
464
addl $IsRep0Long, %eax
465
call RangeDecoderBitDecode
481
movb (%edi, %edx), %al
492
call RangeDecoderBitDecode
498
call RangeDecoderBitDecode
511
movl $RepLenCoder, %eax
537
movl $(kNumLenToPosStates - 1), %eax
542
movb $kNumPosSlotBits, %cl
544
leal PosSlot(%edx), %eax
545
call RangeDecoderBitTreeDecode
548
cmpl $kStartPosModelIndex, %edx
561
cmpl $kEndPosModelIndex, %edx
564
addl $(SpecPos - 1), %eax
569
subb $kNumAlignBits, %cl
571
/* RangeDecoderDecodeDirectBits */
585
cmpl $kTopValue, %eax
595
movb $kNumAlignBits, %cl
602
call RangeDecoderReverseBitTreeDecode
611
addl $kMatchMinLen, %edx