2 * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL
);
31 #include <ipxe/uaccess.h>
32 #include <ipxe/deflate.h>
36 * DEFLATE decompression algorithm
38 * This file implements the decompression half of the DEFLATE
39 * algorithm specified in RFC 1951.
41 * Portions of this code are derived from wimboot's xca.c.
48 * For some insane reason, the DEFLATE format stores some values in
51 static uint8_t deflate_reverse
[256];
53 /** Literal/length base values
55 * We include entries only for literal/length codes 257-284. Code 285
56 * does not fit the pattern (it represents a length of 258; following
57 * the pattern from the earlier codes would give a length of 259), and
58 * has no extra bits. Codes 286-287 are invalid, but can occur. We
59 * treat any code greater than 284 as meaning "length 285, no extra
62 static uint8_t deflate_litlen_base
[28];
64 /** Distance base values
66 * We include entries for all possible codes 0-31, avoiding the need
67 * to check for undefined codes 30 and 31 before performing the
68 * lookup. Codes 30 and 31 are never initialised, and will therefore
69 * be treated as meaning "14 extra bits, base distance 0".
71 static uint16_t deflate_distance_base
[32];
73 /** Code length map */
74 static uint8_t deflate_codelen_map
[19] = {
75 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
78 /** Static Huffman alphabet length patterns */
79 static struct deflate_static_length_pattern deflate_static_length_patterns
[] = {
80 /* Literal/length code lengths */
81 { 0x88, ( ( ( 143 - 0 ) + 1 ) / 2 ) },
82 { 0x99, ( ( ( 255 - 144 ) + 1 ) / 2 ) },
83 { 0x77, ( ( ( 279 - 256 ) + 1 ) / 2 ) },
84 { 0x88, ( ( ( 287 - 280 ) + 1 ) / 2 ) },
85 /* Distance code lengths */
86 { 0x55, ( ( ( 31 - 0 ) + 1 ) / 2 ) },
92 * Transcribe binary value (for debugging)
95 * @v bits Length of value (in bits)
96 * @ret string Transcribed value
98 static const char * deflate_bin ( unsigned long value
, unsigned int bits
) {
99 static char buf
[ ( 8 * sizeof ( value
) ) + 1 /* NUL */ ];
103 assert ( bits
< sizeof ( buf
) );
105 /* Transcribe value */
107 *(out
++) = ( ( value
& ( 1 << bits
) ) ?
'1' : '0' );
114 * Set Huffman symbol length
116 * @v deflate Decompressor
117 * @v index Index within lengths
118 * @v bits Symbol length (in bits)
120 static void deflate_set_length ( struct deflate
*deflate
, unsigned int index
,
121 unsigned int bits
) {
123 deflate
->lengths
[ index
/ 2 ] |= ( bits
<< ( 4 * ( index
% 2 ) ) );
127 * Get Huffman symbol length
129 * @v deflate Decompressor
130 * @v index Index within lengths
131 * @ret bits Symbol length (in bits)
133 static unsigned int deflate_length ( struct deflate
*deflate
,
134 unsigned int index
) {
136 return ( ( deflate
->lengths
[ index
/ 2 ] >> ( 4 * ( index
% 2 ) ) )
141 * Determine Huffman alphabet name (for debugging)
143 * @v deflate Decompressor
144 * @v alphabet Huffman alphabet
145 * @ret name Alphabet name
147 static const char * deflate_alphabet_name ( struct deflate
*deflate
,
148 struct deflate_alphabet
*alphabet
){
150 if ( alphabet
== &deflate
->litlen
) {
152 } else if ( alphabet
== &deflate
->distance_codelen
) {
153 return "distance/codelen";
160 * Dump Huffman alphabet (for debugging)
162 * @v deflate Decompressor
163 * @v alphabet Huffman alphabet
165 static void deflate_dump_alphabet ( struct deflate
*deflate
,
166 struct deflate_alphabet
*alphabet
) {
167 struct deflate_huf_symbols
*huf_sym
;
172 /* Do nothing unless debugging is enabled */
176 /* Dump symbol table for each utilised length */
177 for ( bits
= 1 ; bits
<= ( sizeof ( alphabet
->huf
) /
178 sizeof ( alphabet
->huf
[0] ) ) ; bits
++ ) {
179 huf_sym
= &alphabet
->huf
[ bits
- 1 ];
180 if ( huf_sym
->freq
== 0 )
182 huf
= ( huf_sym
->start
>> huf_sym
->shift
);
183 DBGC2 ( alphabet
, "DEFLATE %p \"%s\" length %d start \"%s\" "
185 deflate_alphabet_name ( deflate
, alphabet
), bits
,
186 deflate_bin ( huf
, huf_sym
->bits
), huf_sym
->freq
);
187 for ( i
= 0 ; i
< huf_sym
->freq
; i
++ ) {
188 DBGC2 ( alphabet
, " %03x",
189 huf_sym
->raw
[ huf
+ i
] );
191 DBGC2 ( alphabet
, "\n" );
194 /* Dump quick lookup table */
195 DBGC2 ( alphabet
, "DEFLATE %p \"%s\" quick lookup:", deflate
,
196 deflate_alphabet_name ( deflate
, alphabet
) );
197 for ( i
= 0 ; i
< ( sizeof ( alphabet
->lookup
) /
198 sizeof ( alphabet
->lookup
[0] ) ) ; i
++ ) {
199 DBGC2 ( alphabet
, " %d", ( alphabet
->lookup
[i
] + 1 ) );
201 DBGC2 ( alphabet
, "\n" );
205 * Construct Huffman alphabet
207 * @v deflate Decompressor
208 * @v alphabet Huffman alphabet
209 * @v count Number of symbols
210 * @v offset Starting offset within length table
211 * @ret rc Return status code
213 static int deflate_alphabet ( struct deflate
*deflate
,
214 struct deflate_alphabet
*alphabet
,
215 unsigned int count
, unsigned int offset
) {
216 struct deflate_huf_symbols
*huf_sym
;
218 unsigned int cum_freq
;
221 unsigned int adjustment
;
225 /* Clear symbol table */
226 memset ( alphabet
->huf
, 0, sizeof ( alphabet
->huf
) );
228 /* Count number of symbols with each Huffman-coded length */
229 for ( raw
= 0 ; raw
< count
; raw
++ ) {
230 bits
= deflate_length ( deflate
, ( raw
+ offset
) );
232 alphabet
->huf
[ bits
- 1 ].freq
++;
235 /* Populate Huffman-coded symbol table */
238 for ( bits
= 1 ; bits
<= ( sizeof ( alphabet
->huf
) /
239 sizeof ( alphabet
->huf
[0] ) ) ; bits
++ ) {
240 huf_sym
= &alphabet
->huf
[ bits
- 1 ];
241 huf_sym
->bits
= bits
;
242 huf_sym
->shift
= ( 16 - bits
);
243 huf_sym
->start
= ( huf
<< huf_sym
->shift
);
244 huf_sym
->raw
= &alphabet
->raw
[cum_freq
];
245 huf
+= huf_sym
->freq
;
246 if ( huf
> ( 1U << bits
) ) {
247 DBGC ( alphabet
, "DEFLATE %p \"%s\" has too many "
248 "symbols with lengths <=%d\n", deflate
,
249 deflate_alphabet_name ( deflate
, alphabet
),
254 cum_freq
+= huf_sym
->freq
;
256 complete
= ( huf
== ( 1U << bits
) );
258 /* Populate raw symbol table */
259 for ( raw
= 0 ; raw
< count
; raw
++ ) {
260 bits
= deflate_length ( deflate
, ( raw
+ offset
) );
262 huf_sym
= &alphabet
->huf
[ bits
- 1 ];
263 *(huf_sym
->raw
++) = raw
;
267 /* Adjust Huffman-coded symbol table raw pointers and populate
268 * quick lookup table.
270 for ( bits
= 1 ; bits
<= ( sizeof ( alphabet
->huf
) /
271 sizeof ( alphabet
->huf
[0] ) ) ; bits
++ ) {
272 huf_sym
= &alphabet
->huf
[ bits
- 1 ];
274 /* Adjust raw pointer */
275 huf_sym
->raw
-= huf_sym
->freq
; /* Reset to first symbol */
276 adjustment
= ( huf_sym
->start
>> huf_sym
->shift
);
277 huf_sym
->raw
-= adjustment
; /* Adjust for quick indexing */
279 /* Populate quick lookup table */
280 for ( prefix
= ( huf_sym
->start
>> DEFLATE_HUFFMAN_QL_SHIFT
) ;
281 prefix
< ( 1 << DEFLATE_HUFFMAN_QL_BITS
) ; prefix
++ ) {
282 alphabet
->lookup
[prefix
] = ( bits
- 1 );
286 /* Dump alphabet (for debugging) */
287 deflate_dump_alphabet ( deflate
, alphabet
);
289 /* Check that there are no invalid codes */
291 DBGC ( alphabet
, "DEFLATE %p \"%s\" is incomplete\n", deflate
,
292 deflate_alphabet_name ( deflate
, alphabet
) );
300 * Attempt to accumulate bits from input stream
302 * @v deflate Decompressor
303 * @v in Compressed input data
304 * @v target Number of bits to accumulate
305 * @ret excess Number of excess bits accumulated (may be negative)
307 static int deflate_accumulate ( struct deflate
*deflate
,
308 struct deflate_chunk
*in
,
309 unsigned int target
) {
312 while ( deflate
->bits
< target
) {
314 /* Check for end of input */
315 if ( in
->offset
>= in
->len
)
318 /* Acquire byte from input */
319 copy_from_user ( &byte
, in
->data
, in
->offset
++,
321 deflate
->accumulator
= ( deflate
->accumulator
|
322 ( byte
<< deflate
->bits
) );
323 deflate
->rotalumucca
= ( deflate
->rotalumucca
|
324 ( deflate_reverse
[byte
] <<
325 ( 24 - deflate
->bits
) ) );
329 assert ( deflate
->bits
<=
330 ( 8 * sizeof ( deflate
->accumulator
) ) );
333 return ( deflate
->bits
- target
);
337 * Consume accumulated bits from the input stream
339 * @v deflate Decompressor
340 * @v count Number of accumulated bits to consume
341 * @ret data Consumed bits
343 static int deflate_consume ( struct deflate
*deflate
, unsigned int count
) {
347 assert ( count
<= deflate
->bits
);
349 /* Extract data and consume bits */
350 data
= ( deflate
->accumulator
& ( ( 1 << count
) - 1 ) );
351 deflate
->accumulator
>>= count
;
352 deflate
->rotalumucca
<<= count
;
353 deflate
->bits
-= count
;
359 * Attempt to extract a fixed number of bits from input stream
361 * @v deflate Decompressor
362 * @v in Compressed input data
363 * @v target Number of bits to extract
364 * @ret data Extracted bits (or negative if not yet accumulated)
366 static int deflate_extract ( struct deflate
*deflate
, struct deflate_chunk
*in
,
367 unsigned int target
) {
371 /* Return immediately if we are attempting to extract zero bits */
375 /* Attempt to accumulate bits */
376 excess
= deflate_accumulate ( deflate
, in
, target
);
380 /* Extract data and consume bits */
381 data
= deflate_consume ( deflate
, target
);
382 DBGCP ( deflate
, "DEFLATE %p extracted %s = %#x = %d\n", deflate
,
383 deflate_bin ( data
, target
), data
, data
);
389 * Attempt to decode a Huffman-coded symbol from input stream
391 * @v deflate Decompressor
392 * @v in Compressed input data
393 * @v alphabet Huffman alphabet
394 * @ret code Raw code (or negative if not yet accumulated)
396 static int deflate_decode ( struct deflate
*deflate
,
397 struct deflate_chunk
*in
,
398 struct deflate_alphabet
*alphabet
) {
399 struct deflate_huf_symbols
*huf_sym
;
401 unsigned int lookup_index
;
405 /* Attempt to accumulate maximum required number of bits.
406 * There may be fewer bits than this remaining in the stream,
407 * even if the stream still contains some complete
408 * Huffman-coded symbols.
410 deflate_accumulate ( deflate
, in
, DEFLATE_HUFFMAN_BITS
);
412 /* Normalise the bit-reversed accumulated value to 16 bits */
413 huf
= ( deflate
->rotalumucca
>> 16 );
415 /* Find symbol set for this length */
416 lookup_index
= ( huf
>> DEFLATE_HUFFMAN_QL_SHIFT
);
417 huf_sym
= &alphabet
->huf
[ alphabet
->lookup
[ lookup_index
] ];
418 while ( huf
< huf_sym
->start
)
421 /* Calculate number of excess bits, and return if not yet complete */
422 excess
= ( deflate
->bits
- huf_sym
->bits
);
427 deflate_consume ( deflate
, huf_sym
->bits
);
429 /* Look up raw symbol */
430 raw
= huf_sym
->raw
[ huf
>> huf_sym
->shift
];
431 DBGCP ( deflate
, "DEFLATE %p decoded %s = %#x = %d\n", deflate
,
432 deflate_bin ( ( huf
>> huf_sym
->shift
), huf_sym
->bits
),
439 * Discard bits up to the next byte boundary
441 * @v deflate Decompressor
443 static void deflate_discard_to_byte ( struct deflate
*deflate
) {
445 deflate_consume ( deflate
, ( deflate
->bits
& 7 ) );
449 * Copy data to output buffer (if available)
451 * @v out Output data buffer
452 * @v start Source data
453 * @v offset Starting offset within source data
454 * @v len Length to copy
456 static void deflate_copy ( struct deflate_chunk
*out
,
457 userptr_t start
, size_t offset
, size_t len
) {
458 size_t out_offset
= out
->offset
;
461 /* Copy data one byte at a time, to allow for overlap */
462 if ( out_offset
< out
->len
) {
463 copy_len
= ( out
->len
- out_offset
);
464 if ( copy_len
> len
)
466 while ( copy_len
-- ) {
467 memcpy_user ( out
->data
, out_offset
++,
468 start
, offset
++, 1 );
475 * Inflate compressed data
477 * @v deflate Decompressor
478 * @v in Compressed input data
479 * @v out Output data buffer
480 * @ret rc Return status code
482 * The caller can use deflate_finished() to determine whether a
483 * successful return indicates that the decompressor is merely waiting
486 * Data will not be written beyond the specified end of the output
487 * data buffer, but the offset within the output data buffer will be
488 * updated to reflect the amount that should have been written. The
489 * caller can use this to find the length of the decompressed data
490 * before allocating the output data buffer.
492 int deflate_inflate ( struct deflate
*deflate
,
493 struct deflate_chunk
*in
,
494 struct deflate_chunk
*out
) {
496 /* This could be implemented more neatly if gcc offered a
497 * means for enforcing tail recursion.
499 if ( deflate
->resume
) {
500 goto *(deflate
->resume
);
501 } else switch ( deflate
->format
) {
502 case DEFLATE_RAW
: goto block_header
;
503 case DEFLATE_ZLIB
: goto zlib_header
;
504 default: assert ( 0 );
512 header
= deflate_extract ( deflate
, in
, ZLIB_HEADER_BITS
);
514 deflate
->resume
= &&zlib_header
;
519 cm
= ( ( header
>> ZLIB_HEADER_CM_LSB
) & ZLIB_HEADER_CM_MASK
);
520 if ( cm
!= ZLIB_HEADER_CM_DEFLATE
) {
521 DBGC ( deflate
, "DEFLATE %p unsupported ZLIB "
522 "compression method %d\n", deflate
, cm
);
525 if ( header
& ( 1 << ZLIB_HEADER_FDICT_BIT
) ) {
526 DBGC ( deflate
, "DEFLATE %p unsupported ZLIB preset "
527 "dictionary\n", deflate
);
531 /* Process first block header */
540 /* Extract block header */
541 header
= deflate_extract ( deflate
, in
, DEFLATE_HEADER_BITS
);
543 deflate
->resume
= &&block_header
;
548 deflate
->header
= header
;
549 bfinal
= ( header
& ( 1 << DEFLATE_HEADER_BFINAL_BIT
) );
550 btype
= ( header
>> DEFLATE_HEADER_BTYPE_LSB
);
551 DBGC ( deflate
, "DEFLATE %p found %sblock type %#x\n",
552 deflate
, ( bfinal ?
"final " : "" ), btype
);
554 case DEFLATE_HEADER_BTYPE_LITERAL
:
556 case DEFLATE_HEADER_BTYPE_STATIC
:
558 case DEFLATE_HEADER_BTYPE_DYNAMIC
:
561 DBGC ( deflate
, "DEFLATE %p unsupported block type "
562 "%#x\n", deflate
, btype
);
569 /* Discard any bits up to the next byte boundary */
570 deflate_discard_to_byte ( deflate
);
576 /* Extract LEN field */
577 len
= deflate_extract ( deflate
, in
, DEFLATE_LITERAL_LEN_BITS
);
579 deflate
->resume
= &&literal_len
;
583 /* Record length of literal data */
584 deflate
->remaining
= len
;
585 DBGC2 ( deflate
, "DEFLATE %p literal block length %#04zx\n",
586 deflate
, deflate
->remaining
);
592 /* Extract NLEN field */
593 nlen
= deflate_extract ( deflate
, in
, DEFLATE_LITERAL_LEN_BITS
);
595 deflate
->resume
= &&literal_nlen
;
600 if ( ( ( deflate
->remaining
^ ~nlen
) &
601 ( ( 1 << DEFLATE_LITERAL_LEN_BITS
) - 1 ) ) != 0 ) {
602 DBGC ( deflate
, "DEFLATE %p invalid len/nlen "
603 "%#04zx/%#04x\n", deflate
,
604 deflate
->remaining
, nlen
);
613 /* Calculate available amount of literal data */
614 in_remaining
= ( in
->len
- in
->offset
);
615 len
= deflate
->remaining
;
616 if ( len
> in_remaining
)
619 /* Copy data to output buffer */
620 deflate_copy ( out
, in
->data
, in
->offset
, len
);
622 /* Consume data from input buffer */
624 deflate
->remaining
-= len
;
626 /* Finish processing if we are blocked */
627 if ( deflate
->remaining
) {
628 deflate
->resume
= &&literal_data
;
632 /* Otherwise, finish block */
637 struct deflate_static_length_pattern
*pattern
;
638 uint8_t *lengths
= deflate
->lengths
;
640 /* Construct static Huffman lengths as per RFC 1950 */
641 for ( pattern
= deflate_static_length_patterns
;
642 pattern
->count
; pattern
++ ) {
643 memset ( lengths
, pattern
->fill
, pattern
->count
);
644 lengths
+= pattern
->count
;
646 deflate
->litlen_count
= 288;
647 deflate
->distance_count
= 32;
648 goto construct_alphabets
;
659 /* Extract block header */
660 header
= deflate_extract ( deflate
, in
, DEFLATE_DYNAMIC_BITS
);
662 deflate
->resume
= &&dynamic_header
;
667 hlit
= ( ( header
>> DEFLATE_DYNAMIC_HLIT_LSB
) &
668 DEFLATE_DYNAMIC_HLIT_MASK
);
669 hdist
= ( ( header
>> DEFLATE_DYNAMIC_HDIST_LSB
) &
670 DEFLATE_DYNAMIC_HDIST_MASK
);
671 hclen
= ( ( header
>> DEFLATE_DYNAMIC_HCLEN_LSB
) &
672 DEFLATE_DYNAMIC_HCLEN_MASK
);
673 deflate
->litlen_count
= ( hlit
+ 257 );
674 deflate
->distance_count
= ( hdist
+ 1 );
675 deflate
->length_index
= 0;
676 deflate
->length_target
= ( hclen
+ 4 );
677 DBGC2 ( deflate
, "DEFLATE %p dynamic block %d codelen, %d "
678 "litlen, %d distance\n", deflate
,
679 deflate
->length_target
, deflate
->litlen_count
,
680 deflate
->distance_count
);
682 /* Prepare for decoding code length code lengths */
683 memset ( &deflate
->lengths
, 0, sizeof ( deflate
->lengths
) );
691 /* Extract all code lengths */
692 while ( deflate
->length_index
< deflate
->length_target
) {
694 /* Extract code length length */
695 len
= deflate_extract ( deflate
, in
,
696 DEFLATE_CODELEN_BITS
);
698 deflate
->resume
= &&dynamic_codelen
;
702 /* Store code length */
703 index
= deflate_codelen_map
[deflate
->length_index
++];
704 deflate_set_length ( deflate
, index
, len
);
705 DBGCP ( deflate
, "DEFLATE %p codelen for %d is %d\n",
706 deflate
, index
, len
);
709 /* Generate code length alphabet */
710 if ( ( rc
= deflate_alphabet ( deflate
,
711 &deflate
->distance_codelen
,
712 ( DEFLATE_CODELEN_MAX_CODE
+ 1 ),
716 /* Prepare for decoding literal/length/distance code lengths */
717 memset ( &deflate
->lengths
, 0, sizeof ( deflate
->lengths
) );
718 deflate
->length_index
= 0;
719 deflate
->length_target
= ( deflate
->litlen_count
+
720 deflate
->distance_count
);
724 dynamic_litlen_distance
: {
728 /* Decode literal/length/distance code length */
729 len
= deflate_decode ( deflate
, in
, &deflate
->distance_codelen
);
731 deflate
->resume
= &&dynamic_litlen_distance
;
735 /* Prepare for extra bits */
737 deflate
->length
= len
;
738 deflate
->extra_bits
= 0;
739 deflate
->dup_len
= 1;
741 static const uint8_t dup_len
[3] = { 3, 3, 11 };
742 static const uint8_t extra_bits
[3] = { 2, 3, 7 };
743 index
= ( len
- 16 );
744 deflate
->dup_len
= dup_len
[index
];
745 deflate
->extra_bits
= extra_bits
[index
];
751 dynamic_litlen_distance_extra
: {
753 unsigned int dup_len
;
755 /* Extract extra bits */
756 extra
= deflate_extract ( deflate
, in
, deflate
->extra_bits
);
758 deflate
->resume
= &&dynamic_litlen_distance_extra
;
762 /* Store code lengths */
763 dup_len
= ( deflate
->dup_len
+ extra
);
764 while ( ( deflate
->length_index
< deflate
->length_target
) &&
766 deflate_set_length ( deflate
, deflate
->length_index
++,
770 /* Process next literal/length or distance code
771 * length, if more are required.
773 if ( deflate
->length_index
< deflate
->length_target
)
774 goto dynamic_litlen_distance
;
776 /* Construct alphabets */
777 goto construct_alphabets
;
780 construct_alphabets
: {
781 unsigned int distance_offset
= deflate
->litlen_count
;
782 unsigned int distance_count
= deflate
->distance_count
;
785 /* Generate literal/length alphabet */
786 if ( ( rc
= deflate_alphabet ( deflate
, &deflate
->litlen
,
787 deflate
->litlen_count
, 0 ) ) !=0)
790 /* Handle degenerate case of a single distance code
791 * (for which it is impossible to construct a valid,
792 * complete Huffman alphabet). RFC 1951 states:
794 * If only one distance code is used, it is encoded
795 * using one bit, not zero bits; in this case there
796 * is a single code length of one, with one unused
797 * code. One distance code of zero bits means that
798 * there are no distance codes used at all (the data
801 * If we have only a single distance code, then we
802 * instead use two distance codes both with length 1.
803 * This results in a valid Huffman alphabet. The code
804 * "0" will mean distance code 0 (which is either
805 * correct or irrelevant), and the code "1" will mean
806 * distance code 1 (which is always irrelevant).
808 if ( deflate
->distance_count
== 1 ) {
810 deflate
->lengths
[0] = 0x11;
815 /* Generate distance alphabet */
816 if ( ( rc
= deflate_alphabet ( deflate
,
817 &deflate
->distance_codelen
,
819 distance_offset
) ) != 0 )
829 /* Decode Huffman codes */
832 /* Decode Huffman code */
833 code
= deflate_decode ( deflate
, in
, &deflate
->litlen
);
835 deflate
->resume
= &&lzhuf_litlen
;
839 /* Handle according to code type */
840 if ( code
< DEFLATE_LITLEN_END
) {
842 /* Literal value: copy to output buffer */
844 DBGCP ( deflate
, "DEFLATE %p literal %#02x "
845 "('%c')\n", deflate
, byte
,
846 ( isprint ( byte
) ? byte
: '.' ) );
847 deflate_copy ( out
, virt_to_user ( &byte
), 0,
850 } else if ( code
== DEFLATE_LITLEN_END
) {
857 /* Length code: process extra bits */
858 extra
= ( code
- DEFLATE_LITLEN_END
- 1 );
860 bits
= ( extra
/ 4 );
863 deflate
->extra_bits
= bits
;
865 deflate_litlen_base
[extra
];
867 deflate
->extra_bits
= 0;
868 deflate
->dup_len
= 258;
870 goto lzhuf_litlen_extra
;
875 lzhuf_litlen_extra
: {
878 /* Extract extra bits */
879 extra
= deflate_extract ( deflate
, in
, deflate
->extra_bits
);
881 deflate
->resume
= &&lzhuf_litlen_extra
;
885 /* Update duplicate length */
886 deflate
->dup_len
+= extra
;
894 /* Decode Huffman code */
895 code
= deflate_decode ( deflate
, in
,
896 &deflate
->distance_codelen
);
898 deflate
->resume
= &&lzhuf_distance
;
902 /* Process extra bits */
904 bits
= ( extra
/ 2 );
907 deflate
->extra_bits
= bits
;
908 deflate
->dup_distance
= deflate_distance_base
[extra
];
911 lzhuf_distance_extra
: {
916 /* Extract extra bits */
917 extra
= deflate_extract ( deflate
, in
, deflate
->extra_bits
);
919 deflate
->resume
= &&lzhuf_distance_extra
;
923 /* Update duplicate distance */
924 dup_distance
= ( deflate
->dup_distance
+ extra
);
925 dup_len
= deflate
->dup_len
;
926 DBGCP ( deflate
, "DEFLATE %p duplicate length %zd distance "
927 "%zd\n", deflate
, dup_len
, dup_distance
);
930 if ( dup_distance
> out
->offset
) {
931 DBGC ( deflate
, "DEFLATE %p bad distance %zd (max "
932 "%zd)\n", deflate
, dup_distance
, out
->offset
);
936 /* Copy data, allowing for overlap */
937 deflate_copy ( out
, out
->data
, ( out
->offset
- dup_distance
),
940 /* Process next literal/length symbol */
946 DBGCP ( deflate
, "DEFLATE %p end of block\n", deflate
);
948 /* If this was not the final block, process next block header */
949 if ( ! ( deflate
->header
& ( 1 << DEFLATE_HEADER_BFINAL_BIT
) ))
952 /* Otherwise, process footer (if any) */
953 switch ( deflate
->format
) {
954 case DEFLATE_RAW
: goto finished
;
955 case DEFLATE_ZLIB
: goto zlib_footer
;
956 default: assert ( 0 );
962 /* Discard any bits up to the next byte boundary */
963 deflate_discard_to_byte ( deflate
);
969 /* Accumulate the 32 bits of checksum. We don't check
970 * the value, stop processing immediately afterwards,
971 * and so don't have to worry about the nasty corner
972 * cases involved in calling deflate_extract() to
973 * obtain a full 32 bits.
975 excess
= deflate_accumulate ( deflate
, in
, ZLIB_ADLER32_BITS
);
977 deflate
->resume
= &&zlib_adler32
;
981 /* Finish processing */
986 /* Mark as finished and terminate */
987 DBGCP ( deflate
, "DEFLATE %p finished\n", deflate
);
988 deflate
->resume
= NULL
;
994 * Initialise decompressor
996 * @v deflate Decompressor
997 * @v format Compression format code
999 void deflate_init ( struct deflate
*deflate
, enum deflate_format format
) {
1000 static int global_init_done
;
1007 /* Perform global initialisation if required */
1008 if ( ! global_init_done
) {
1010 /* Initialise byte reversal table */
1011 for ( i
= 255 ; i
; i
-- ) {
1012 for ( bit
= 1, byte
= 0 ; bit
; bit
<<= 1 ) {
1017 deflate_reverse
[i
] = byte
;
1020 /* Initialise literal/length extra bits table */
1022 for ( i
= 0 ; i
< 28 ; i
++ ) {
1026 deflate_litlen_base
[i
] = base
;
1027 base
+= ( 1 << bits
);
1029 assert ( base
== 259 ); /* sic */
1031 /* Initialise distance extra bits table */
1033 for ( i
= 0 ; i
< 30 ; i
++ ) {
1037 deflate_distance_base
[i
] = base
;
1038 base
+= ( 1 << bits
);
1040 assert ( base
== 32769 );
1042 /* Record global initialisation as complete */
1043 global_init_done
= 1;
1046 /* Initialise structure */
1047 memset ( deflate
, 0, sizeof ( *deflate
) );
1048 deflate
->format
= format
;