summaryrefslogtreecommitdiff
path: root/lib_generic/lzma/LzmaDec.c
diff options
context:
space:
mode:
authorrhabarber1848@web.de <rhabarber1848@web.de>2009-07-24 08:16:30 +0200
committerWolfgang Denk <wd@denx.de>2009-07-27 00:16:36 +0200
commitfafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22 (patch)
tree03ca5e614ea8406e1caaf33a7308e59a8bdfb81e /lib_generic/lzma/LzmaDec.c
parent3c972849f2becbf19c13a24f090d293f37ecf616 (diff)
downloadu-boot-imx-fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22.zip
u-boot-imx-fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22.tar.gz
u-boot-imx-fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22.tar.bz2
add WATCHDOG_RESET to allow LZMA kernel decompression on slow machines
Signed-off-by: rhabarber1848@web.de
Diffstat (limited to 'lib_generic/lzma/LzmaDec.c')
-rw-r--r--lib_generic/lzma/LzmaDec.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib_generic/lzma/LzmaDec.c b/lib_generic/lzma/LzmaDec.c
index 89d934a..acffb14 100644
--- a/lib_generic/lzma/LzmaDec.c
+++ b/lib_generic/lzma/LzmaDec.c
@@ -1,6 +1,9 @@
/* LzmaDec.c -- LZMA Decoder
2008-11-06 : Igor Pavlov : Public domain */
+#include <config.h>
+#include <common.h>
+#include <watchdog.h>
#include "LzmaDec.h"
#include <string.h>
@@ -156,6 +159,8 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
UInt32 range = p->range;
UInt32 code = p->code;
+ WATCHDOG_RESET();
+
do
{
CLzmaProb *prob;
@@ -176,6 +181,9 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
if (state < kNumLitStates)
{
symbol = 1;
+
+ WATCHDOG_RESET();
+
do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
}
else
@@ -183,6 +191,9 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
unsigned offs = 0x100;
symbol = 1;
+
+ WATCHDOG_RESET();
+
do
{
unsigned bit;
@@ -316,6 +327,9 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
{
UInt32 mask = 1;
unsigned i = 1;
+
+ WATCHDOG_RESET();
+
do
{
GET_BIT2(prob + i, i, ; , distance |= mask);
@@ -327,6 +341,9 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
else
{
numDirectBits -= kNumAlignBits;
+
+ WATCHDOG_RESET();
+
do
{
NORMALIZE
@@ -399,12 +416,18 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
const Byte *lim = dest + curLen;
dicPos += curLen;
+
+ WATCHDOG_RESET();
+
do
*(dest) = (Byte)*(dest + src);
while (++dest != lim);
}
else
{
+
+ WATCHDOG_RESET();
+
do
{
dic[dicPos++] = dic[pos];
@@ -417,6 +440,9 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte
}
}
while (dicPos < limit && buf < bufLimit);
+
+ WATCHDOG_RESET();
+
NORMALIZE;
p->buf = buf;
p->range = range;