123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- #ifndef __LZ4DEFS_H__
- #define __LZ4DEFS_H__
- /*
- * lz4defs.h -- common and architecture specific defines for the kernel usage
- * LZ4 - Fast LZ compression algorithm
- * Copyright (C) 2011-2016, Yann Collet.
- * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
- * OWNER 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.
- * You can contact the author at :
- * - LZ4 homepage : http://www.lz4.org
- * - LZ4 source repository : https://github.com/lz4/lz4
- *
- * Changed for kernel usage by:
- * Sven Schmidt <[email protected]>
- */
- #include <asm/unaligned.h>
- #include <linux/string.h> /* memset, memcpy */
- #define FORCE_INLINE __always_inline
- /*-************************************
- * Basic Types
- **************************************/
- #include <linux/types.h>
- typedef uint8_t BYTE;
- typedef uint16_t U16;
- typedef uint32_t U32;
- typedef int32_t S32;
- typedef uint64_t U64;
- typedef uintptr_t uptrval;
- /*-************************************
- * Architecture specifics
- **************************************/
- #if defined(CONFIG_64BIT)
- #define LZ4_ARCH64 1
- #else
- #define LZ4_ARCH64 0
- #endif
- #if defined(__LITTLE_ENDIAN)
- #define LZ4_LITTLE_ENDIAN 1
- #else
- #define LZ4_LITTLE_ENDIAN 0
- #endif
- /*-************************************
- * Constants
- **************************************/
- #define MINMATCH 4
- #define WILDCOPYLENGTH 8
- #define LASTLITERALS 5
- #define MFLIMIT (WILDCOPYLENGTH + MINMATCH)
- /* Increase this value ==> compression run slower on incompressible data */
- #define LZ4_SKIPTRIGGER 6
- #define HASH_UNIT sizeof(size_t)
- #define KB (1 << 10)
- #define MB (1 << 20)
- #define GB (1U << 30)
- #define MAXD_LOG 16
- #define MAX_DISTANCE ((1 << MAXD_LOG) - 1)
- #define STEPSIZE sizeof(size_t)
- #define ML_BITS 4
- #define ML_MASK ((1U << ML_BITS) - 1)
- #define RUN_BITS (8 - ML_BITS)
- #define RUN_MASK ((1U << RUN_BITS) - 1)
- /*-************************************
- * Reading and writing into memory
- **************************************/
- static FORCE_INLINE U16 LZ4_read16(const void *ptr)
- {
- return get_unaligned((const U16 *)ptr);
- }
- static FORCE_INLINE U32 LZ4_read32(const void *ptr)
- {
- return get_unaligned((const U32 *)ptr);
- }
- static FORCE_INLINE size_t LZ4_read_ARCH(const void *ptr)
- {
- return get_unaligned((const size_t *)ptr);
- }
- static FORCE_INLINE void LZ4_write16(void *memPtr, U16 value)
- {
- put_unaligned(value, (U16 *)memPtr);
- }
- static FORCE_INLINE void LZ4_write32(void *memPtr, U32 value)
- {
- put_unaligned(value, (U32 *)memPtr);
- }
- static FORCE_INLINE U16 LZ4_readLE16(const void *memPtr)
- {
- return get_unaligned_le16(memPtr);
- }
- static FORCE_INLINE void LZ4_writeLE16(void *memPtr, U16 value)
- {
- return put_unaligned_le16(value, memPtr);
- }
- static FORCE_INLINE void LZ4_copy8(void *dst, const void *src)
- {
- #if LZ4_ARCH64
- U64 a = get_unaligned((const U64 *)src);
- put_unaligned(a, (U64 *)dst);
- #else
- U32 a = get_unaligned((const U32 *)src);
- U32 b = get_unaligned((const U32 *)src + 1);
- put_unaligned(a, (U32 *)dst);
- put_unaligned(b, (U32 *)dst + 1);
- #endif
- }
- /*
- * customized variant of memcpy,
- * which can overwrite up to 7 bytes beyond dstEnd
- */
- static FORCE_INLINE void LZ4_wildCopy(void *dstPtr,
- const void *srcPtr, void *dstEnd)
- {
- BYTE *d = (BYTE *)dstPtr;
- const BYTE *s = (const BYTE *)srcPtr;
- BYTE *const e = (BYTE *)dstEnd;
- do {
- LZ4_copy8(d, s);
- d += 8;
- s += 8;
- } while (d < e);
- }
- static FORCE_INLINE unsigned int LZ4_NbCommonBytes(register size_t val)
- {
- #if LZ4_LITTLE_ENDIAN
- return __ffs(val) >> 3;
- #else
- return (BITS_PER_LONG - 1 - __fls(val)) >> 3;
- #endif
- }
- static FORCE_INLINE unsigned int LZ4_count(
- const BYTE *pIn,
- const BYTE *pMatch,
- const BYTE *pInLimit)
- {
- const BYTE *const pStart = pIn;
- while (likely(pIn < pInLimit - (STEPSIZE - 1))) {
- size_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn);
- if (!diff) {
- pIn += STEPSIZE;
- pMatch += STEPSIZE;
- continue;
- }
- pIn += LZ4_NbCommonBytes(diff);
- return (unsigned int)(pIn - pStart);
- }
- #if LZ4_ARCH64
- if ((pIn < (pInLimit - 3))
- && (LZ4_read32(pMatch) == LZ4_read32(pIn))) {
- pIn += 4;
- pMatch += 4;
- }
- #endif
- if ((pIn < (pInLimit - 1))
- && (LZ4_read16(pMatch) == LZ4_read16(pIn))) {
- pIn += 2;
- pMatch += 2;
- }
- if ((pIn < pInLimit) && (*pMatch == *pIn))
- pIn++;
- return (unsigned int)(pIn - pStart);
- }
- typedef enum { noLimit = 0, limitedOutput = 1 } limitedOutput_directive;
- typedef enum { byPtr, byU32, byU16 } tableType_t;
- typedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive;
- typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive;
- typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive;
- typedef enum { full = 0, partial = 1 } earlyEnd_directive;
- #endif
|