75 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
81 { 0x88, ( ( ( 143 - 0 ) + 1 ) / 2 ) },
82 { 0x99, ( ( ( 255 - 144 ) + 1 ) / 2 ) },
83 { 0x77, ( ( ( 279 - 256 ) + 1 ) / 2 ) },
84 { 0x88, ( ( ( 287 - 280 ) + 1 ) / 2 ) },
86 { 0x55, ( ( ( 31 - 0 ) + 1 ) / 2 ) },
99 static char buf[ ( 8 *
sizeof (
value ) ) + 1 ];
121 unsigned int bits ) {
134 unsigned int index ) {
153 return "distance/codelen";
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 )
183 DBGC2 ( alphabet,
"DEFLATE %p \"%s\" length %d start \"%s\" " 187 for ( i = 0 ; i < huf_sym->
freq ; i++ ) {
188 DBGC2 ( alphabet,
" %03x",
189 huf_sym->
raw[ huf + i ] );
191 DBGC2 ( alphabet,
"\n" );
195 DBGC2 ( alphabet,
"DEFLATE %p \"%s\" quick lookup:",
deflate,
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" );
218 unsigned int cum_freq;
221 unsigned int adjustment;
238 for (
bits = 1 ;
bits <= (
sizeof ( alphabet->
huf ) /
239 sizeof ( alphabet->
huf[0] ) ) ;
bits++ ) {
240 huf_sym = &alphabet->
huf[
bits - 1 ];
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,
254 cum_freq += huf_sym->
freq;
256 complete = ( huf == ( 1U <<
bits ) );
262 huf_sym = &alphabet->
huf[
bits - 1 ];
270 for (
bits = 1 ;
bits <= (
sizeof ( alphabet->
huf ) /
271 sizeof ( alphabet->
huf[0] ) ) ;
bits++ ) {
272 huf_sym = &alphabet->
huf[
bits - 1 ];
276 adjustment = ( huf_sym->
start >> huf_sym->
shift );
277 huf_sym->
raw -= adjustment;
291 DBGC ( alphabet,
"DEFLATE %p \"%s\" is incomplete\n",
deflate,
309 unsigned int target ) {
315 if (
in->offset >=
in->len )
367 unsigned int target ) {
401 unsigned int lookup_index;
417 huf_sym = &alphabet->
huf[ alphabet->
lookup[ lookup_index ] ];
418 while ( huf < huf_sym->
start )
458 size_t out_offset =
out->offset;
462 if ( out_offset < out->
len ) {
463 copy_len = (
out->len - out_offset );
464 if ( copy_len >
len )
466 while ( copy_len-- ) {
522 "compression method %d\n",
deflate,
cm );
526 DBGC (
deflate,
"DEFLATE %p unsupported ZLIB preset " 551 DBGC (
deflate,
"DEFLATE %p found %sblock type %#x\n",
552 deflate, ( bfinal ?
"final " :
"" ), btype );
561 DBGC (
deflate,
"DEFLATE %p unsupported block type " 585 DBGC2 (
deflate,
"DEFLATE %p literal block length %#04zx\n",
614 in_remaining = (
in->len -
in->offset );
616 if (
len > in_remaining )
642 pattern->
count ; pattern++ ) {
644 lengths += pattern->
count;
648 goto construct_alphabets;
677 DBGC2 (
deflate,
"DEFLATE %p dynamic block %d codelen, %d " 678 "litlen, %d distance\n",
deflate,
724 dynamic_litlen_distance: {
741 static const uint8_t dup_len[3] = { 3, 3, 11 };
742 static const uint8_t extra_bits[3] = { 2, 3, 7 };
751 dynamic_litlen_distance_extra: {
753 unsigned int dup_len;
774 goto dynamic_litlen_distance;
777 goto construct_alphabets;
780 construct_alphabets: {
819 distance_offset ) ) != 0 )
846 (
isprint (
byte ) ?
byte :
'.' ) );
870 goto lzhuf_litlen_extra;
875 lzhuf_litlen_extra: {
911 lzhuf_distance_extra: {
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 );
1000 static int global_init_done;
1008 if ( ! global_init_done ) {
1011 for ( i = 255 ; i ; i-- ) {
1012 for (
bit = 1,
byte = 0 ;
bit ;
bit <<= 1 ) {
1022 for ( i = 0 ; i < 28 ; i++ ) {
1033 for ( i = 0 ; i < 30 ; i++ ) {
1043 global_init_done = 1;
int deflate_inflate(struct deflate *deflate, struct deflate_chunk *in, struct deflate_chunk *out)
Inflate compressed data.
#define EINVAL
Invalid argument.
static void deflate_set_length(struct deflate *deflate, unsigned int index, unsigned int bits)
Set Huffman symbol length.
struct arbelprm_rc_send_wqe rc
unsigned int length_index
Current length index within a set of code lengths.
#define DEFLATE_DYNAMIC_HLIT_LSB
Dynamic header HLIT field LSB.
static uint16_t deflate_distance_base[32]
Distance base values.
static void deflate_copy(struct deflate_chunk *out, userptr_t start, size_t offset, size_t len)
Copy data to output buffer (if available)
#define DEFLATE_CODELEN_BITS
Dynamic header code length length (in bits)
struct deflate_alphabet distance_codelen
Distance and code length Huffman alphabet.
unsigned int length_target
Target length index within a set of code lengths.
uint8_t extra
Signature extra byte.
#define DEFLATE_DYNAMIC_HCLEN_MASK
Dynamic header HCLEN field mask.
#define DEFLATE_HUFFMAN_QL_SHIFT
Quick lookup shift.
unsigned int extra_bits
Number of extra bits required.
#define DEFLATE_HUFFMAN_BITS
Maximum length of a Huffman symbol (in bits)
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
size_t dup_distance
Distance of a duplicated string.
#define DEFLATE_HEADER_BTYPE_STATIC
Block header type: static Huffman alphabet.
unsigned int header
Current block header.
uint16_t raw[0]
Raw symbols.
enum deflate_format format
Format.
unsigned int length
Current length within a set of code lengths.
A Huffman-coded set of symbols of a given length.
#define ZLIB_ADLER32_BITS
ZLIB ADLER32 length (in bits)
uint32_t start
First symbol of this length (normalised to 16 bits)
static unsigned int unsigned int bit
A Huffman-coded alphabet.
#define DEFLATE_LITLEN_END
Literal/length end of block code.
static unsigned int deflate_length(struct deflate *deflate, unsigned int index)
Get Huffman symbol length.
static int deflate_alphabet(struct deflate *deflate, struct deflate_alphabet *alphabet, unsigned int count, unsigned int offset)
Construct Huffman alphabet.
#define DEFLATE_DYNAMIC_HDIST_MASK
Dynamic header HDIST field mask.
uint8_t count
Repetition count.
static unsigned int code
Response code.
Access to external ("user") memory.
unsigned int bits
Number of bits within the accumulator.
static const char * deflate_bin(unsigned long value, unsigned int bits)
Transcribe binary value (for debugging)
#define ENOTSUP
Operation not supported.
static int isprint(int character)
Check if character is printable.
#define DEFLATE_DYNAMIC_HCLEN_LSB
Dynamic header HCLEN field LSB.
uint32_t start
Starting offset.
static void deflate_dump_alphabet(struct deflate *deflate, struct deflate_alphabet *alphabet)
Dump Huffman alphabet (for debugging)
#define DEFLATE_HEADER_BTYPE_LSB
Block header type LSB.
#define ZLIB_HEADER_BITS
ZLIB header length (in bits)
void deflate_init(struct deflate *deflate, enum deflate_format format)
Initialise decompressor.
#define DEFLATE_LITERAL_LEN_BITS
Literal header LEN/NLEN field length (in bits)
uint32_t accumulator
Accumulator.
size_t dup_len
Length of a duplicated string.
#define ZLIB_HEADER_CM_DEFLATE
ZLIB header compression method: DEFLATE.
uint32_t userptr_t
A pointer to a user buffer.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void * resume
Resume point.
pseudo_bit_t value[0x00020]
#define DEFLATE_HUFFMAN_QL_BITS
Quick lookup length for a Huffman symbol (in bits)
uint8_t lookup[1<< DEFLATE_HUFFMAN_QL_BITS]
Quick lookup table.
uint16_t count
Number of entries.
struct deflate_huf_symbols huf[DEFLATE_HUFFMAN_BITS]
Huffman-coded symbol set for each length.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
uint16_t freq
Number of Huffman-coded symbols having this length.
#define DEFLATE_DYNAMIC_HLIT_MASK
Dynamic header HLIT field mask.
deflate_format
Compression formats.
#define DEFLATE_CODELEN_MAX_CODE
Maximum value of a code length code.
static const char * deflate_alphabet_name(struct deflate *deflate, struct deflate_alphabet *alphabet)
Determine Huffman alphabet name (for debugging)
uint32_t rotalumucca
Bit-reversed accumulator.
unsigned int distance_count
Number of symbols in the distance Huffman alphabet.
static uint8_t deflate_litlen_base[28]
Literal/length base values.
static int deflate_consume(struct deflate *deflate, unsigned int count)
Consume accumulated bits from the input stream.
struct deflate_alphabet litlen
Literal/length Huffman alphabet.
uint16_t * raw
Raw symbols having this length.
static int deflate_accumulate(struct deflate *deflate, struct deflate_chunk *in, unsigned int target)
Attempt to accumulate bits from input stream.
static uint8_t deflate_codelen_map[19]
Code length map.
#define DEFLATE_DYNAMIC_BITS
Dynamic header length (in bits)
Raw DEFLATE data (no header or footer)
static volatile void * bits
A static Huffman alphabet length pattern.
#define DEFLATE_HEADER_BTYPE_LITERAL
Block header type: literal data.
struct ena_aq_header header
Header.
userptr_t virt_to_user(volatile const void *addr)
Convert virtual address to user pointer.
#define DEFLATE_HEADER_BITS
Block header length (in bits)
uint8_t data[48]
Additional event data.
#define ZLIB_HEADER_CM_MASK
ZLIB header compression method mask.
static struct deflate_static_length_pattern deflate_static_length_patterns[]
Static Huffman alphabet length patterns.
unsigned int litlen_count
Number of symbols in the literal/length Huffman alphabet.
uint16_t offset
Offset to command line.
#define ZLIB_HEADER_CM_LSB
ZLIB header compression method LSB.
#define DEFLATE_HEADER_BFINAL_BIT
Block header final block flags bit.
uint8_t lengths[((DEFLATE_LITLEN_MAX_CODE+1)+(DEFLATE_DISTANCE_MAX_CODE+1)+1)/2]
Huffman code lengths.
static void deflate_discard_to_byte(struct deflate *deflate)
Discard bits up to the next byte boundary.
DEFLATE decompression algorithm.
uint8_t shift
Shift to normalise symbols of this length to 16 bits.
static int deflate_extract(struct deflate *deflate, struct deflate_chunk *in, unsigned int target)
Attempt to extract a fixed number of bits from input stream.
static int deflate_decode(struct deflate *deflate, struct deflate_chunk *in, struct deflate_alphabet *alphabet)
Attempt to decode a Huffman-coded symbol from input stream.
#define ZLIB_HEADER_FDICT_BIT
ZLIB header preset dictionary flag bit.
#define NULL
NULL pointer (VOID *)
#define DEFLATE_DYNAMIC_HDIST_LSB
Dynamic header HDIST field LSB.
uint8_t bits
Length of Huffman-coded symbols.
void memcpy_user(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
Copy data between user buffers.
static uint8_t deflate_reverse[256]
Byte reversal table.
size_t remaining
Remaining length of data (e.g.
void * memset(void *dest, int character, size_t len) __nonnull
#define DEFLATE_HEADER_BTYPE_DYNAMIC
Block header type: dynamic Huffman alphabet.