1 /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ 2 /* 3 * Copyright (c) Facebook, Inc. 4 * All rights reserved. 5 * 6 * This source code is licensed under both the BSD-style license (found in the 7 * LICENSE file in the root directory of this source tree) and the GPLv2 (found 8 * in the COPYING file in the root directory of this source tree). 9 * You may select, at your option, one of the above-listed licenses. 10 */ 11 12 /* 13 * This file provides common libc dependencies that zstd requires. 14 * The purpose is to allow replacing this file with a custom implementation 15 * to compile zstd without libc support. 16 */ 17 18 /* Need: 19 * NULL 20 * INT_MAX 21 * UINT_MAX 22 * ZSTD_memcpy() 23 * ZSTD_memset() 24 * ZSTD_memmove() 25 */ 26 #ifndef ZSTD_DEPS_COMMON 27 #define ZSTD_DEPS_COMMON 28 29 #include <linux/limits.h> 30 #include <linux/stddef.h> 31 32 #define ZSTD_memcpy(d,s,n) __builtin_memcpy((d),(s),(n)) 33 #define ZSTD_memmove(d,s,n) __builtin_memmove((d),(s),(n)) 34 #define ZSTD_memset(d,s,n) __builtin_memset((d),(s),(n)) 35 36 #endif /* ZSTD_DEPS_COMMON */ 37 38 /* 39 * Define malloc as always failing. That means the user must 40 * either use ZSTD_customMem or statically allocate memory. 41 * Need: 42 * ZSTD_malloc() 43 * ZSTD_free() 44 * ZSTD_calloc() 45 */ 46 #ifdef ZSTD_DEPS_NEED_MALLOC 47 #ifndef ZSTD_DEPS_MALLOC 48 #define ZSTD_DEPS_MALLOC 49 50 #define ZSTD_malloc(s) ({ (void)(s); NULL; }) 51 #define ZSTD_free(p) ((void)(p)) 52 #define ZSTD_calloc(n,s) ({ (void)(n); (void)(s); NULL; }) 53 54 #endif /* ZSTD_DEPS_MALLOC */ 55 #endif /* ZSTD_DEPS_NEED_MALLOC */ 56 57 /* 58 * Provides 64-bit math support. 59 * Need: 60 * U64 ZSTD_div64(U64 dividend, U32 divisor) 61 */ 62 #ifdef ZSTD_DEPS_NEED_MATH64 63 #ifndef ZSTD_DEPS_MATH64 64 #define ZSTD_DEPS_MATH64 65 66 #include <linux/math64.h> 67 68 static uint64_t ZSTD_div64(uint64_t dividend, uint32_t divisor) { 69 return div_u64(dividend, divisor); 70 } 71 72 #endif /* ZSTD_DEPS_MATH64 */ 73 #endif /* ZSTD_DEPS_NEED_MATH64 */ 74 75 /* 76 * This is only requested when DEBUGLEVEL >= 1, meaning 77 * it is disabled in production. 78 * Need: 79 * assert() 80 */ 81 #ifdef ZSTD_DEPS_NEED_ASSERT 82 #ifndef ZSTD_DEPS_ASSERT 83 #define ZSTD_DEPS_ASSERT 84 85 #include <linux/kernel.h> 86 87 #define assert(x) WARN_ON(!(x)) 88 89 #endif /* ZSTD_DEPS_ASSERT */ 90 #endif /* ZSTD_DEPS_NEED_ASSERT */ 91 92 /* 93 * This is only requested when DEBUGLEVEL >= 2, meaning 94 * it is disabled in production. 95 * Need: 96 * ZSTD_DEBUG_PRINT() 97 */ 98 #ifdef ZSTD_DEPS_NEED_IO 99 #ifndef ZSTD_DEPS_IO 100 #define ZSTD_DEPS_IO 101 102 #include <linux/printk.h> 103 104 #define ZSTD_DEBUG_PRINT(...) pr_debug(__VA_ARGS__) 105 106 #endif /* ZSTD_DEPS_IO */ 107 #endif /* ZSTD_DEPS_NEED_IO */ 108 109 /* 110 * Only requested when MSAN is enabled. 111 * Need: 112 * intptr_t 113 */ 114 #ifdef ZSTD_DEPS_NEED_STDINT 115 #ifndef ZSTD_DEPS_STDINT 116 #define ZSTD_DEPS_STDINT 117 118 /* 119 * The Linux Kernel doesn't provide intptr_t, only uintptr_t, which 120 * is an unsigned long. 121 */ 122 typedef long intptr_t; 123 124 #endif /* ZSTD_DEPS_STDINT */ 125 #endif /* ZSTD_DEPS_NEED_STDINT */ 126