diff options
author | Patrick Georgi <patrick.georgi@secunet.com> | 2011-07-21 15:43:14 +0200 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2011-08-04 08:11:21 +0200 |
commit | 6de1ee4a3021cec992a63dbe20c4c1805e266e95 (patch) | |
tree | ad6df0c601f29af12d067a1683e1d03c790c262b /payloads/libpayload/liblzma/lzma.c | |
parent | b88351537bcee4b888a80b8afeb2f7e65767e666 (diff) | |
download | coreboot-6de1ee4a3021cec992a63dbe20c4c1805e266e95.tar.xz |
libpayload: Add liblzma, libcbfs
Add cbfs core from coreboot into libpayload, and to support lzma decode,
add coreboot's lzma code, too. Carl-Daniel agreed to relicense the
lzmadecode wrapper as BSD-l, solving licensing problems.
Change-Id: Id28990fe7e951d99447e265a4880d70a8f208dd2
Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Reviewed-on: http://review.coreboot.org/115
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-by: Marc Jones <marcj303@gmail.com>
Diffstat (limited to 'payloads/libpayload/liblzma/lzma.c')
-rw-r--r-- | payloads/libpayload/liblzma/lzma.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/payloads/libpayload/liblzma/lzma.c b/payloads/libpayload/liblzma/lzma.c new file mode 100644 index 0000000000..fdda30d8c4 --- /dev/null +++ b/payloads/libpayload/liblzma/lzma.c @@ -0,0 +1,47 @@ +/* + * coreboot interface to memory-saving variant of LZMA decoder + * + * Copyright (C) 2006 Carl-Daniel Hailfinger + * Released under the BSD license + * + * 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 <lzma.h> +#include <stdio.h> +#include <string.h> +#include "lzmadecode.c" + +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) { + printf("lzma: Incorrect stream properties.\n"); + return 0; + } + mallocneeds = (LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (mallocneeds > 15980) { + printf("lzma: 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) { + printf("lzma: Decoding error = %d\n", res); + return 0; + } + return outSize; +} |