18c2ecf20Sopenharmony_ci/**
28c2ecf20Sopenharmony_ci * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
38c2ecf20Sopenharmony_ci * All rights reserved.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * This source code is licensed under the BSD-style license found in the
68c2ecf20Sopenharmony_ci * LICENSE file in the root directory of https://github.com/facebook/zstd.
78c2ecf20Sopenharmony_ci * An additional grant of patent rights can be found in the PATENTS file in the
88c2ecf20Sopenharmony_ci * same directory.
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify it under
118c2ecf20Sopenharmony_ci * the terms of the GNU General Public License version 2 as published by the
128c2ecf20Sopenharmony_ci * Free Software Foundation. This program is dual-licensed; you may select
138c2ecf20Sopenharmony_ci * either version 2 of the GNU General Public License ("GPL") or BSD license
148c2ecf20Sopenharmony_ci * ("BSD").
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/*-*************************************
188c2ecf20Sopenharmony_ci*  Dependencies
198c2ecf20Sopenharmony_ci***************************************/
208c2ecf20Sopenharmony_ci#include "error_private.h"
218c2ecf20Sopenharmony_ci#include "zstd_internal.h" /* declaration of ZSTD_isError, ZSTD_getErrorName, ZSTD_getErrorCode, ZSTD_getErrorString, ZSTD_versionNumber */
228c2ecf20Sopenharmony_ci#include <linux/kernel.h>
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/*=**************************************************************
258c2ecf20Sopenharmony_ci*  Custom allocator
268c2ecf20Sopenharmony_ci****************************************************************/
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define stack_push(stack, size)                                 \
298c2ecf20Sopenharmony_ci	({                                                      \
308c2ecf20Sopenharmony_ci		void *const ptr = ZSTD_PTR_ALIGN((stack)->ptr); \
318c2ecf20Sopenharmony_ci		(stack)->ptr = (char *)ptr + (size);            \
328c2ecf20Sopenharmony_ci		(stack)->ptr <= (stack)->end ? ptr : NULL;      \
338c2ecf20Sopenharmony_ci	})
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ciZSTD_customMem ZSTD_initStack(void *workspace, size_t workspaceSize)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	ZSTD_customMem stackMem = {ZSTD_stackAlloc, ZSTD_stackFree, workspace};
388c2ecf20Sopenharmony_ci	ZSTD_stack *stack = (ZSTD_stack *)workspace;
398c2ecf20Sopenharmony_ci	/* Verify preconditions */
408c2ecf20Sopenharmony_ci	if (!workspace || workspaceSize < sizeof(ZSTD_stack) || workspace != ZSTD_PTR_ALIGN(workspace)) {
418c2ecf20Sopenharmony_ci		ZSTD_customMem error = {NULL, NULL, NULL};
428c2ecf20Sopenharmony_ci		return error;
438c2ecf20Sopenharmony_ci	}
448c2ecf20Sopenharmony_ci	/* Initialize the stack */
458c2ecf20Sopenharmony_ci	stack->ptr = workspace;
468c2ecf20Sopenharmony_ci	stack->end = (char *)workspace + workspaceSize;
478c2ecf20Sopenharmony_ci	stack_push(stack, sizeof(ZSTD_stack));
488c2ecf20Sopenharmony_ci	return stackMem;
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_civoid *ZSTD_stackAllocAll(void *opaque, size_t *size)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	ZSTD_stack *stack = (ZSTD_stack *)opaque;
548c2ecf20Sopenharmony_ci	*size = (BYTE const *)stack->end - (BYTE *)ZSTD_PTR_ALIGN(stack->ptr);
558c2ecf20Sopenharmony_ci	return stack_push(stack, *size);
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_civoid *ZSTD_stackAlloc(void *opaque, size_t size)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	ZSTD_stack *stack = (ZSTD_stack *)opaque;
618c2ecf20Sopenharmony_ci	return stack_push(stack, size);
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_civoid ZSTD_stackFree(void *opaque, void *address)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	(void)opaque;
668c2ecf20Sopenharmony_ci	(void)address;
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_civoid *ZSTD_malloc(size_t size, ZSTD_customMem customMem) { return customMem.customAlloc(customMem.opaque, size); }
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_civoid ZSTD_free(void *ptr, ZSTD_customMem customMem)
728c2ecf20Sopenharmony_ci{
738c2ecf20Sopenharmony_ci	if (ptr != NULL)
748c2ecf20Sopenharmony_ci		customMem.customFree(customMem.opaque, ptr);
758c2ecf20Sopenharmony_ci}
76