summaryrefslogtreecommitdiffstats
path: root/target/linux/adm5120/image/lzma-loader/src/decompress.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/adm5120/image/lzma-loader/src/decompress.c')
-rw-r--r--target/linux/adm5120/image/lzma-loader/src/decompress.c74
1 files changed, 39 insertions, 35 deletions
diff --git a/target/linux/adm5120/image/lzma-loader/src/decompress.c b/target/linux/adm5120/image/lzma-loader/src/decompress.c
index 9e2a04c99..4a20a6b42 100644
--- a/target/linux/adm5120/image/lzma-loader/src/decompress.c
+++ b/target/linux/adm5120/image/lzma-loader/src/decompress.c
@@ -118,12 +118,13 @@ struct env_var {
extern unsigned char workspace[];
extern void board_init(void);
+static CLzmaDecoderState lzma_state;
+
typedef void (*kernel_entry)(unsigned long reg_a0, unsigned long reg_a1,
unsigned long reg_a2, unsigned long reg_a3);
-static int decompress_data(unsigned char *buffer, UInt32 bufferSize,
- int lc, int lp, int pb, unsigned char *outStream, UInt32 outSize,
- UInt32 *outSizeProcessed);
+static int decompress_data(CLzmaDecoderState *vs, unsigned char *outStream,
+ UInt32 outSize);
#ifdef CONFIG_PASS_KARGS
#define ENVV(n,v) {.name = (n), .value = (v)}
@@ -139,7 +140,7 @@ static void halt(void)
for(;;);
}
-#if LZMA_WRAPPER
+#if (LZMA_WRAPPER)
extern unsigned char _lzma_data_start[];
extern unsigned char _lzma_data_end[];
@@ -158,12 +159,12 @@ static void decompress_init(void)
datalen = _lzma_data_end - _lzma_data_start;
}
-static int decompress_data(unsigned char *buffer, UInt32 bufferSize,
- int lc, int lp, int pb, unsigned char *outStream, UInt32 outSize,
- UInt32 *outSizeProcessed)
+static int decompress_data(CLzmaDecoderState *vs, unsigned char *outStream,
+ SizeT outSize)
{
- return LzmaDecode(buffer, bufferSize, lc, lp, pb, data, datalen,
- outStream, outSize, outSizeProcessed);
+ SizeT ip, op;
+
+ return LzmaDecode(vs, data, datalen, &ip, outStream, outSize, &op);
}
#endif /* LZMA_WRAPPER */
@@ -181,7 +182,8 @@ static __inline__ unsigned char get_byte(void)
return *(flash_base+flash_ofs++);
}
-static int lzma_read_byte(void *object, unsigned char **buffer, UInt32 *bufferSize)
+static int lzma_read_byte(void *object, const unsigned char **buffer,
+ SizeT *bufferSize)
{
unsigned long len;
@@ -263,12 +265,17 @@ static void decompress_init(void)
flash_max = flash_ofs+klen;
}
-static int decompress_data(unsigned char *buffer, UInt32 bufferSize,
- int lc, int lp, int pb, unsigned char *outStream, UInt32 outSize,
- UInt32 *outSizeProcessed)
+static int decompress_data(CLzmaDecoderState *vs, unsigned char *outStream,
+ SizeT outSize)
{
- return LzmaDecode(buffer, bufferSize, lc, lp, pb, &lzma_callback,
- outStream, outSize, outSizeProcessed);
+ SizeT op;
+
+#if 0
+ vs->Buffer = data;
+ vs->BufferLim = datalen;
+#endif
+
+ return LzmaDecode(vs, &lzma_callback, outStream, outSize, &op);
}
#endif /* !(LZMA_WRAPPER) */
@@ -278,11 +285,9 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
unsigned long icache_size, unsigned long icache_lsize,
unsigned long dcache_size, unsigned long dcache_lsize)
{
+ unsigned char props[LZMA_PROPERTIES_SIZE];
unsigned int i; /* temp value */
- unsigned int lc; /* literal context bits */
- unsigned int lp; /* literal pos state bits */
- unsigned int pb; /* pos state bits */
- unsigned int osize; /* uncompressed size */
+ SizeT osize; /* uncompressed size */
int res;
board_init();
@@ -293,29 +298,31 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
decompress_init();
/* lzma args */
- i = get_byte();
- lc = i % 9, i = i / 9;
- lp = i % 5, pb = i / 5;
+ for (i = 0; i < LZMA_PROPERTIES_SIZE; i++)
+ props[i] = get_byte();
/* skip rest of the LZMA coder property */
- for (i = 0; i < 4; i++)
- get_byte();
-
/* read the lower half of uncompressed size in the header */
- osize = ((unsigned int)get_byte()) +
- ((unsigned int)get_byte() << 8) +
- ((unsigned int)get_byte() << 16) +
- ((unsigned int)get_byte() << 24);
+ osize = ((SizeT)get_byte()) +
+ ((SizeT)get_byte() << 8) +
+ ((SizeT)get_byte() << 16) +
+ ((SizeT)get_byte() << 24);
/* skip rest of the header (upper half of uncompressed size) */
for (i = 0; i < 4; i++)
get_byte();
+ res = LzmaDecodeProperties(&lzma_state.Properties, props,
+ LZMA_PROPERTIES_SIZE);
+ if (res != LZMA_RESULT_OK) {
+ printf("Incorrect LZMA stream properties!\n");
+ halt();
+ }
+
printf("decompressing kernel... ");
- /* decompress kernel */
- res = decompress_data(workspace, ~0, lc, lp, pb,
- (unsigned char *)LOADADDR, osize, &i);
+ lzma_state.Probs = (CProb *)workspace;
+ res = decompress_data(&lzma_state, (unsigned char *)LOADADDR, osize);
if (res != LZMA_RESULT_OK) {
printf("failed, ");
@@ -323,9 +330,6 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
case LZMA_RESULT_DATA_ERROR:
printf("data error!\n");
break;
- case LZMA_RESULT_NOT_ENOUGH_MEM:
- printf("not enough memory!\n");
- break;
default:
printf("unknown error %d!\n", res);
}