162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) Facebook, Inc.
462306a36Sopenharmony_ci * All rights reserved.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * This source code is licensed under both the BSD-style license (found in the
762306a36Sopenharmony_ci * LICENSE file in the root directory of this source tree) and the GPLv2 (found
862306a36Sopenharmony_ci * in the COPYING file in the root directory of this source tree).
962306a36Sopenharmony_ci * You may select, at your option, one of the above-listed licenses.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * This file provides common libc dependencies that zstd requires.
1462306a36Sopenharmony_ci * The purpose is to allow replacing this file with a custom implementation
1562306a36Sopenharmony_ci * to compile zstd without libc support.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Need:
1962306a36Sopenharmony_ci * NULL
2062306a36Sopenharmony_ci * INT_MAX
2162306a36Sopenharmony_ci * UINT_MAX
2262306a36Sopenharmony_ci * ZSTD_memcpy()
2362306a36Sopenharmony_ci * ZSTD_memset()
2462306a36Sopenharmony_ci * ZSTD_memmove()
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci#ifndef ZSTD_DEPS_COMMON
2762306a36Sopenharmony_ci#define ZSTD_DEPS_COMMON
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include <linux/limits.h>
3062306a36Sopenharmony_ci#include <linux/stddef.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define ZSTD_memcpy(d,s,n) __builtin_memcpy((d),(s),(n))
3362306a36Sopenharmony_ci#define ZSTD_memmove(d,s,n) __builtin_memmove((d),(s),(n))
3462306a36Sopenharmony_ci#define ZSTD_memset(d,s,n) __builtin_memset((d),(s),(n))
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#endif /* ZSTD_DEPS_COMMON */
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * Define malloc as always failing. That means the user must
4062306a36Sopenharmony_ci * either use ZSTD_customMem or statically allocate memory.
4162306a36Sopenharmony_ci * Need:
4262306a36Sopenharmony_ci * ZSTD_malloc()
4362306a36Sopenharmony_ci * ZSTD_free()
4462306a36Sopenharmony_ci * ZSTD_calloc()
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_ci#ifdef ZSTD_DEPS_NEED_MALLOC
4762306a36Sopenharmony_ci#ifndef ZSTD_DEPS_MALLOC
4862306a36Sopenharmony_ci#define ZSTD_DEPS_MALLOC
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define ZSTD_malloc(s) ({ (void)(s); NULL; })
5162306a36Sopenharmony_ci#define ZSTD_free(p) ((void)(p))
5262306a36Sopenharmony_ci#define ZSTD_calloc(n,s) ({ (void)(n); (void)(s); NULL; })
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#endif /* ZSTD_DEPS_MALLOC */
5562306a36Sopenharmony_ci#endif /* ZSTD_DEPS_NEED_MALLOC */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/*
5862306a36Sopenharmony_ci * Provides 64-bit math support.
5962306a36Sopenharmony_ci * Need:
6062306a36Sopenharmony_ci * U64 ZSTD_div64(U64 dividend, U32 divisor)
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci#ifdef ZSTD_DEPS_NEED_MATH64
6362306a36Sopenharmony_ci#ifndef ZSTD_DEPS_MATH64
6462306a36Sopenharmony_ci#define ZSTD_DEPS_MATH64
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#include <linux/math64.h>
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic uint64_t ZSTD_div64(uint64_t dividend, uint32_t divisor) {
6962306a36Sopenharmony_ci  return div_u64(dividend, divisor);
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#endif /* ZSTD_DEPS_MATH64 */
7362306a36Sopenharmony_ci#endif /* ZSTD_DEPS_NEED_MATH64 */
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/*
7662306a36Sopenharmony_ci * This is only requested when DEBUGLEVEL >= 1, meaning
7762306a36Sopenharmony_ci * it is disabled in production.
7862306a36Sopenharmony_ci * Need:
7962306a36Sopenharmony_ci * assert()
8062306a36Sopenharmony_ci */
8162306a36Sopenharmony_ci#ifdef ZSTD_DEPS_NEED_ASSERT
8262306a36Sopenharmony_ci#ifndef ZSTD_DEPS_ASSERT
8362306a36Sopenharmony_ci#define ZSTD_DEPS_ASSERT
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#include <linux/kernel.h>
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define assert(x) WARN_ON(!(x))
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#endif /* ZSTD_DEPS_ASSERT */
9062306a36Sopenharmony_ci#endif /* ZSTD_DEPS_NEED_ASSERT */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci/*
9362306a36Sopenharmony_ci * This is only requested when DEBUGLEVEL >= 2, meaning
9462306a36Sopenharmony_ci * it is disabled in production.
9562306a36Sopenharmony_ci * Need:
9662306a36Sopenharmony_ci * ZSTD_DEBUG_PRINT()
9762306a36Sopenharmony_ci */
9862306a36Sopenharmony_ci#ifdef ZSTD_DEPS_NEED_IO
9962306a36Sopenharmony_ci#ifndef ZSTD_DEPS_IO
10062306a36Sopenharmony_ci#define ZSTD_DEPS_IO
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#include <linux/printk.h>
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define ZSTD_DEBUG_PRINT(...) pr_debug(__VA_ARGS__)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#endif /* ZSTD_DEPS_IO */
10762306a36Sopenharmony_ci#endif /* ZSTD_DEPS_NEED_IO */
108