7994164a0e
from another (rom_stream.c and others), instead linking it like any source file should be linked. The same should (and will) be done with nrv2b.c, but that has some deeper implications as various CAR implementations include that directly, and thus requires more care. It fixes an issue with the cbfs code. Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de> Acked-by: Ronald G. Minnich <rminnich@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4206 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
/*
|
|
|
|
Coreboot interface to memory-saving variant of LZMA decoder
|
|
|
|
(C)opyright 2006 Carl-Daniel Hailfinger
|
|
Released under the GNU GPL v2 or later
|
|
|
|
Parts of this file are based on C/7zip/Compress/LZMA_C/LzmaTest.c from the LZMA
|
|
SDK 4.42, which is written and distributed to public domain by Igor Pavlov.
|
|
|
|
*/
|
|
|
|
#include "lzmadecode.c"
|
|
#include <console/console.h>
|
|
#include <string.h>
|
|
|
|
|
|
unsigned long ulzma(unsigned char * src, unsigned char * dst)
|
|
{
|
|
unsigned char properties[LZMA_PROPERTIES_SIZE];
|
|
UInt32 outSize;
|
|
SizeT inProcessed;
|
|
SizeT outProcessed;
|
|
int res;
|
|
CLzmaDecoderState state;
|
|
SizeT mallocneeds;
|
|
unsigned char scratchpad[15980];
|
|
|
|
memcpy(properties, src, LZMA_PROPERTIES_SIZE);
|
|
outSize = *(UInt32 *)(src + LZMA_PROPERTIES_SIZE);
|
|
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) {
|
|
printk_warning("Incorrect stream properties\n");
|
|
return 0;
|
|
}
|
|
mallocneeds = (LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
|
if (mallocneeds > 15980) {
|
|
printk_warning("Decoder scratchpad too small!\n");
|
|
return 0;
|
|
}
|
|
state.Probs = (CProb *)scratchpad;
|
|
res = LzmaDecode(&state, src + LZMA_PROPERTIES_SIZE + 8, (SizeT)0xffffffff, &inProcessed,
|
|
dst, outSize, &outProcessed);
|
|
if (res != 0) {
|
|
printk_warning("Decoding error = %d\n", res);
|
|
return 0;
|
|
}
|
|
return outSize;
|
|
}
|