xref: /OK3568_Linux_fs/kernel/lib/zstd/zstd_common.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /**
2*4882a593Smuzhiyun  * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3*4882a593Smuzhiyun  * All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This source code is licensed under the BSD-style license found in the
6*4882a593Smuzhiyun  * LICENSE file in the root directory of https://github.com/facebook/zstd.
7*4882a593Smuzhiyun  * An additional grant of patent rights can be found in the PATENTS file in the
8*4882a593Smuzhiyun  * same directory.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it under
11*4882a593Smuzhiyun  * the terms of the GNU General Public License version 2 as published by the
12*4882a593Smuzhiyun  * Free Software Foundation. This program is dual-licensed; you may select
13*4882a593Smuzhiyun  * either version 2 of the GNU General Public License ("GPL") or BSD license
14*4882a593Smuzhiyun  * ("BSD").
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /*-*************************************
18*4882a593Smuzhiyun *  Dependencies
19*4882a593Smuzhiyun ***************************************/
20*4882a593Smuzhiyun #include "error_private.h"
21*4882a593Smuzhiyun #include "zstd_internal.h" /* declaration of ZSTD_isError, ZSTD_getErrorName, ZSTD_getErrorCode, ZSTD_getErrorString, ZSTD_versionNumber */
22*4882a593Smuzhiyun #include <linux/kernel.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /*=**************************************************************
25*4882a593Smuzhiyun *  Custom allocator
26*4882a593Smuzhiyun ****************************************************************/
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define stack_push(stack, size)                                 \
29*4882a593Smuzhiyun 	({                                                      \
30*4882a593Smuzhiyun 		void *const ptr = ZSTD_PTR_ALIGN((stack)->ptr); \
31*4882a593Smuzhiyun 		(stack)->ptr = (char *)ptr + (size);            \
32*4882a593Smuzhiyun 		(stack)->ptr <= (stack)->end ? ptr : NULL;      \
33*4882a593Smuzhiyun 	})
34*4882a593Smuzhiyun 
ZSTD_initStack(void * workspace,size_t workspaceSize)35*4882a593Smuzhiyun ZSTD_customMem ZSTD_initStack(void *workspace, size_t workspaceSize)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	ZSTD_customMem stackMem = {ZSTD_stackAlloc, ZSTD_stackFree, workspace};
38*4882a593Smuzhiyun 	ZSTD_stack *stack = (ZSTD_stack *)workspace;
39*4882a593Smuzhiyun 	/* Verify preconditions */
40*4882a593Smuzhiyun 	if (!workspace || workspaceSize < sizeof(ZSTD_stack) || workspace != ZSTD_PTR_ALIGN(workspace)) {
41*4882a593Smuzhiyun 		ZSTD_customMem error = {NULL, NULL, NULL};
42*4882a593Smuzhiyun 		return error;
43*4882a593Smuzhiyun 	}
44*4882a593Smuzhiyun 	/* Initialize the stack */
45*4882a593Smuzhiyun 	stack->ptr = workspace;
46*4882a593Smuzhiyun 	stack->end = (char *)workspace + workspaceSize;
47*4882a593Smuzhiyun 	stack_push(stack, sizeof(ZSTD_stack));
48*4882a593Smuzhiyun 	return stackMem;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
ZSTD_stackAllocAll(void * opaque,size_t * size)51*4882a593Smuzhiyun void *ZSTD_stackAllocAll(void *opaque, size_t *size)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	ZSTD_stack *stack = (ZSTD_stack *)opaque;
54*4882a593Smuzhiyun 	*size = (BYTE const *)stack->end - (BYTE *)ZSTD_PTR_ALIGN(stack->ptr);
55*4882a593Smuzhiyun 	return stack_push(stack, *size);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
ZSTD_stackAlloc(void * opaque,size_t size)58*4882a593Smuzhiyun void *ZSTD_stackAlloc(void *opaque, size_t size)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	ZSTD_stack *stack = (ZSTD_stack *)opaque;
61*4882a593Smuzhiyun 	return stack_push(stack, size);
62*4882a593Smuzhiyun }
ZSTD_stackFree(void * opaque,void * address)63*4882a593Smuzhiyun void ZSTD_stackFree(void *opaque, void *address)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	(void)opaque;
66*4882a593Smuzhiyun 	(void)address;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
ZSTD_malloc(size_t size,ZSTD_customMem customMem)69*4882a593Smuzhiyun void *ZSTD_malloc(size_t size, ZSTD_customMem customMem) { return customMem.customAlloc(customMem.opaque, size); }
70*4882a593Smuzhiyun 
ZSTD_free(void * ptr,ZSTD_customMem customMem)71*4882a593Smuzhiyun void ZSTD_free(void *ptr, ZSTD_customMem customMem)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	if (ptr != NULL)
74*4882a593Smuzhiyun 		customMem.customFree(customMem.opaque, ptr);
75*4882a593Smuzhiyun }
76