diff options
author | Julius Werner <jwerner@chromium.org> | 2019-12-11 15:47:42 -0800 |
---|---|---|
committer | Julius Werner <jwerner@chromium.org> | 2020-01-28 06:36:13 +0000 |
commit | 98eeb961353d187a26085a07889bd0414cdaa910 (patch) | |
tree | b97e2edbdb5033a93095044be96c809271bd0be8 /src/commonlib/lz4_wrapper.c | |
parent | e4d6c033fe91cf777a95531669622f7829e6b44d (diff) |
commonlib: Add commonlib/bsd
This patch creates a new commonlib/bsd subdirectory with a similar
purpose to the existing commonlib, with the difference that all files
under this subdirectory shall be licensed under the BSD-3-Clause license
(or compatible permissive license). The goal is to allow more code to be
shared with libpayload in the future.
Initially, I'm going to move a few files there that have already been
BSD-licensed in the existing commonlib. I am also exracting most
contents of the often-needed <commonlib/helpers.h> as long as they have
either been written by me (and are hereby relicensed) or have an
existing equivalent in BSD-licensed libpayload code. I am also
relicensing <commonlib/compression.h> (written by me) and
<commonlib/compiler.h> (same stuff exists in libpayload).
Finally, I am extracting the cb_err error code definitions from
<types.h> into a new BSD-licensed header so that future commonlib/bsd
code can build upon a common set of error values. I am making the
assumption here that the enum constants and the half-sentence fragments
of documentation next to them by themselves do not meet the threshold of
copyrightability.
Change-Id: I316cea70930f131e8e93d4218542ddb5ae4b63a2
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38420
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
Diffstat (limited to 'src/commonlib/lz4_wrapper.c')
-rw-r--r-- | src/commonlib/lz4_wrapper.c | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/src/commonlib/lz4_wrapper.c b/src/commonlib/lz4_wrapper.c deleted file mode 100644 index 474df642c2..0000000000 --- a/src/commonlib/lz4_wrapper.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2015-2016 Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <commonlib/compression.h> -#include <commonlib/endian.h> -#include <commonlib/helpers.h> -#include <stdint.h> -#include <string.h> - -/* LZ4 comes with its own supposedly portable memory access functions, but they - * seem to be very inefficient in practice (at least on ARM64). Since coreboot - * knows about endinaness and allows some basic assumptions (such as unaligned - * access support), we can easily write the ones we need ourselves. */ -static uint16_t LZ4_readLE16(const void *src) -{ - return read_le16(src); -} -static void LZ4_copy8(void *dst, const void *src) -{ -/* ARM32 needs to be a special snowflake to prevent GCC from coalescing the - * access into LDRD/STRD (which don't support unaligned accesses). */ -#ifdef __arm__ /* ARMv < 6 doesn't support unaligned accesses at all. */ - #if defined(__COREBOOT_ARM_ARCH__) && __COREBOOT_ARM_ARCH__ < 6 - int i; - for (i = 0; i < 8; i++) - ((uint8_t *)dst)[i] = ((uint8_t *)src)[i]; - #else - uint32_t x0, x1; - __asm__ ("ldr %[x0], [%[src]]" - : [x0]"=r"(x0) - : [src]"r"(src), "m"(*(const uint32_t *)src)); - __asm__ ("ldr %[x1], [%[src], #4]" - : [x1]"=r"(x1) - : [src]"r"(src), "m"(*(const uint32_t *)(src + 4))); - __asm__ ("str %[x0], [%[dst]]" - : "=m"(*(uint32_t *)dst) - : [x0]"r"(x0), [dst]"r"(dst)); - __asm__ ("str %[x1], [%[dst], #4]" - : "=m"(*(uint32_t *)(dst + 4)) - : [x1]"r"(x1), [dst]"r"(dst)); - #endif -#elif defined(__riscv) - /* RISC-V implementations may trap on any unaligned access. */ - int i; - for (i = 0; i < 8; i++) - ((uint8_t *)dst)[i] = ((uint8_t *)src)[i]; -#else - *(uint64_t *)dst = *(const uint64_t *)src; -#endif -} - -typedef uint8_t BYTE; -typedef uint16_t U16; -typedef uint32_t U32; -typedef int32_t S32; -typedef uint64_t U64; - -#define FORCE_INLINE static __always_inline -#define likely(expr) __builtin_expect((expr) != 0, 1) -#define unlikely(expr) __builtin_expect((expr) != 0, 0) - -/* Unaltered (just removed unrelated code) from github.com/Cyan4973/lz4/dev. */ -#include "lz4.c.inc" /* #include for inlining, do not link! */ - -#define LZ4F_MAGICNUMBER 0x184D2204 - -struct lz4_frame_header { - uint32_t magic; - union { - uint8_t flags; - struct { - uint8_t reserved0 : 2; - uint8_t has_content_checksum : 1; - uint8_t has_content_size : 1; - uint8_t has_block_checksum : 1; - uint8_t independent_blocks : 1; - uint8_t version : 2; - }; - }; - union { - uint8_t block_descriptor; - struct { - uint8_t reserved1 : 4; - uint8_t max_block_size : 3; - uint8_t reserved2 : 1; - }; - }; - /* + uint64_t content_size iff has_content_size is set */ - /* + uint8_t header_checksum */ -} __packed; - -struct lz4_block_header { - union { - uint32_t raw; - struct { - uint32_t size : 31; - uint32_t not_compressed : 1; - }; - }; - /* + size bytes of data */ - /* + uint32_t block_checksum iff has_block_checksum is set */ -} __packed; - -size_t ulz4fn(const void *src, size_t srcn, void *dst, size_t dstn) -{ - const void *in = src; - void *out = dst; - size_t out_size = 0; - int has_block_checksum; - - { /* With in-place decompression the header may become invalid later. */ - const struct lz4_frame_header *h = in; - - if (srcn < sizeof(*h) + sizeof(uint64_t) + sizeof(uint8_t)) - return 0; /* input overrun */ - - /* We assume there's always only a single, standard frame. */ - if (read_le32(&h->magic) != LZ4F_MAGICNUMBER || h->version != 1) - return 0; /* unknown format */ - if (h->reserved0 || h->reserved1 || h->reserved2) - return 0; /* reserved must be zero */ - if (!h->independent_blocks) - return 0; /* we don't support block dependency */ - has_block_checksum = h->has_block_checksum; - - in += sizeof(*h); - if (h->has_content_size) - in += sizeof(uint64_t); - in += sizeof(uint8_t); - } - - while (1) { - struct lz4_block_header b = { { .raw = read_le32(in) } }; - in += sizeof(struct lz4_block_header); - - if ((size_t)(in - src) + b.size > srcn) - break; /* input overrun */ - - if (!b.size) { - out_size = out - dst; - break; /* decompression successful */ - } - - if (b.not_compressed) { - size_t size = MIN((uintptr_t)b.size, (uintptr_t)dst - + dstn - (uintptr_t)out); - memcpy(out, in, size); - if (size < b.size) - break; /* output overrun */ - out += size; - } else { - /* constant folding essential, do not touch params! */ - int ret = LZ4_decompress_generic(in, out, b.size, - dst + dstn - out, endOnInputSize, - full, 0, noDict, out, NULL, 0); - if (ret < 0) - break; /* decompression error */ - out += ret; - } - - in += b.size; - if (has_block_checksum) - in += sizeof(uint32_t); - } - - return out_size; -} - -size_t ulz4f(const void *src, void *dst) -{ - /* LZ4 uses signed size parameters, so can't just use ((u32)-1) here. */ - return ulz4fn(src, 1*GiB, dst, 1*GiB); -} |