1 /******************************************************************************
3 ** FILE NAME : LzmaWrapper.c
4 ** PROJECT : bootloader
9 ** DESCRIPTION : LZMA decoder support for U-boot 1.1.5
10 ** COPYRIGHT : Copyright (c) 2006
11 ** Infineon Technologies AG
12 ** Am Campeon 1-12, 85579 Neubiberg, Germany
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License as published by
16 ** the Free Software Foundation; either version 2 of the License, or
17 ** (at your option) any later version.
20 ** $Date $Author $Comment
21 ** 2 Nov 2006 Lin Mars init version which derived from LzmaTest.c from
23 ** 24 May 2007 Lin Mars Fix issue for multiple lzma_inflate involved
24 *******************************************************************************/
34 #include <linux/types.h>
35 #include <linux/string.h>
36 #include <linux/ctype.h>
41 #include "LzmaDecode.h"
42 #include "LzmaWrapper.h"
44 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
45 static const char *kCantReadMessage
= "Can not read from source buffer";
46 static const char *kCantAllocateMessage
= "Not enough buffer for decompression";
49 static size_t rpos
=0, dpos
=0;
51 static int MyReadFileAndCheck(unsigned char *src
, void *dest
, size_t size
)
55 memcpy(dest
, src
+ rpos
, size
);
60 int lzma_inflate(unsigned char *source
, int s_len
, unsigned char *dest
, int *d_len
)
62 /* We use two 32-bit integers to construct 64-bit integer for file size.
63 You can remove outSizeHigh, if you don't need >= 4GB supporting,
64 or you can use UInt64 outSize, if your compiler supports 64-bit integers*/
66 UInt32 outSizeHigh
= 0;
68 unsigned char *outStream
;
71 /* waitEOS = 1, if there is no uncompressed size in headers,
72 so decoder will wait EOS (End of Stream Marker) in compressed stream */
75 unsigned char *inStream
;
77 CLzmaDecoderState state
; /* it's about 24-80 bytes structure, if int is 32-bit */
78 unsigned char properties
[LZMA_PROPERTIES_SIZE
];
84 if (sizeof(UInt32
) < 4)
86 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
87 printf("LZMA decoder needs correct UInt32\n");
89 return LZMA_RESULT_DATA_ERROR
;
94 if ((long)(SizeT
)length
!= length
)
96 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
97 printf("Too big compressed stream\n");
99 return LZMA_RESULT_DATA_ERROR
;
101 compressedSize
= (SizeT
)(length
- (LZMA_PROPERTIES_SIZE
+ 8));
104 /* Read LZMA properties for compressed stream */
106 if (!MyReadFileAndCheck(source
, properties
, sizeof(properties
)))
108 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
109 printf("%s\n", kCantReadMessage
);
111 return LZMA_RESULT_DATA_ERROR
;
114 /* Read uncompressed size */
117 for (i
= 0; i
< 8; i
++)
120 if (!MyReadFileAndCheck(source
, &b
, 1))
122 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
123 printf("%s\n", kCantReadMessage
);
125 return LZMA_RESULT_DATA_ERROR
;
130 outSize
+= (UInt32
)(b
) << (i
* 8);
132 outSizeHigh
+= (UInt32
)(b
) << ((i
- 4) * 8);
137 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
138 printf("Stream with EOS marker is not supported");
140 return LZMA_RESULT_DATA_ERROR
;
142 outSizeFull
= (SizeT
)outSize
;
143 if (sizeof(SizeT
) >= 8)
144 outSizeFull
|= (((SizeT
)outSizeHigh
<< 16) << 16);
145 else if (outSizeHigh
!= 0 || (UInt32
)(SizeT
)outSize
!= outSize
)
147 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
148 printf("Too big uncompressed stream");
150 return LZMA_RESULT_DATA_ERROR
;
154 /* Decode LZMA properties and allocate memory */
155 if (LzmaDecodeProperties(&state
.Properties
, properties
, LZMA_PROPERTIES_SIZE
) != LZMA_RESULT_OK
)
157 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
158 printf("Incorrect stream properties");
160 return LZMA_RESULT_DATA_ERROR
;
162 state
.Probs
= (CProb
*)malloc(LzmaGetNumProbs(&state
.Properties
) * sizeof(CProb
));
164 if (outSizeFull
== 0)
168 if (outSizeFull
> d_len
)
174 if (compressedSize
== 0)
178 if ((compressedSize
+rpos
) > s_len
)
181 inStream
= source
+ rpos
;
185 || (outStream
== 0 && outSizeFull
!= 0)
186 || (inStream
== 0 && compressedSize
!= 0)
190 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
191 printf("%s\n", kCantAllocateMessage
);
193 return LZMA_RESULT_DATA_ERROR
;
200 res
= LzmaDecode(&state
,
201 inStream
, compressedSize
, &inProcessed
,
202 outStream
, outSizeFull
, &outProcessed
);
205 #if defined(DEBUG_ENABLE_BOOTSTRAP_PRINTF) || !defined(CFG_BOOTSTRAP_CODE)
206 printf("\nDecoding error = %d\n", res
);
212 *d_len
= outProcessed
;
220 #endif /* CONFIG_LZMA */
This page took 0.064846 seconds and 5 git commands to generate.