diff options
| author | rhabarber1848@web.de <rhabarber1848@web.de> | 2009-07-24 08:16:30 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2009-07-27 00:16:36 +0200 | 
| commit | fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22 (patch) | |
| tree | 03ca5e614ea8406e1caaf33a7308e59a8bdfb81e | |
| parent | 3c972849f2becbf19c13a24f090d293f37ecf616 (diff) | |
| download | olio-uboot-2014.01-fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22.tar.xz olio-uboot-2014.01-fafbb2c3e4b35b60ca303ed2ad1c6cf400cd9a22.zip | |
add WATCHDOG_RESET to allow LZMA kernel decompression on slow machines
Signed-off-by: rhabarber1848@web.de
| -rw-r--r-- | lib_generic/lzma/LzmaDec.c | 26 | ||||
| -rw-r--r-- | lib_generic/lzma/LzmaTools.c | 4 | 
2 files changed, 30 insertions, 0 deletions
| diff --git a/lib_generic/lzma/LzmaDec.c b/lib_generic/lzma/LzmaDec.c index 89d934ad0..acffb14aa 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; diff --git a/lib_generic/lzma/LzmaTools.c b/lib_generic/lzma/LzmaTools.c index c2a91e528..88ba399c7 100644 --- a/lib_generic/lzma/LzmaTools.c +++ b/lib_generic/lzma/LzmaTools.c @@ -36,6 +36,7 @@  #include <config.h>  #include <common.h> +#include <watchdog.h>  #ifdef CONFIG_LZMA @@ -112,6 +113,9 @@ int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,      /* Decompress */      outProcessed = outSizeFull; + +    WATCHDOG_RESET(); +      res = LzmaDecode(          outStream, &outProcessed,          inStream + LZMA_DATA_OFFSET, &compressedSize, |