1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to
8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the
9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is
11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions:
12d4afb5ceSopenharmony_ci *
13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in
14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software.
15d4afb5ceSopenharmony_ci *
16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22d4afb5ceSopenharmony_ci * IN THE SOFTWARE.
23d4afb5ceSopenharmony_ci */
24d4afb5ceSopenharmony_ci
25d4afb5ceSopenharmony_ci#include "private-lib-core.h"
26d4afb5ceSopenharmony_ci
27d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_MALLOC_USABLE_SIZE)
28d4afb5ceSopenharmony_ci
29d4afb5ceSopenharmony_ci#include <malloc.h>
30d4afb5ceSopenharmony_ci
31d4afb5ceSopenharmony_ci/* the heap is processwide */
32d4afb5ceSopenharmony_cistatic size_t allocated;
33d4afb5ceSopenharmony_ci#endif
34d4afb5ceSopenharmony_ci
35d4afb5ceSopenharmony_ci#if defined(LWS_PLAT_OPTEE)
36d4afb5ceSopenharmony_ci
37d4afb5ceSopenharmony_ci#define TEE_USER_MEM_HINT_NO_FILL_ZERO       0x80000000
38d4afb5ceSopenharmony_ci#if defined (LWS_WITH_NETWORK)
39d4afb5ceSopenharmony_ci
40d4afb5ceSopenharmony_ci/* normal TA apis */
41d4afb5ceSopenharmony_ci
42d4afb5ceSopenharmony_civoid *__attribute__((weak))
43d4afb5ceSopenharmony_ci	TEE_Malloc(uint32_t size, uint32_t hint)
44d4afb5ceSopenharmony_ci{
45d4afb5ceSopenharmony_ci	return NULL;
46d4afb5ceSopenharmony_ci}
47d4afb5ceSopenharmony_civoid *__attribute__((weak))
48d4afb5ceSopenharmony_ci	TEE_Realloc(void *buffer, uint32_t newSize)
49d4afb5ceSopenharmony_ci{
50d4afb5ceSopenharmony_ci	return NULL;
51d4afb5ceSopenharmony_ci}
52d4afb5ceSopenharmony_civoid __attribute__((weak))
53d4afb5ceSopenharmony_ci	TEE_Free(void *buffer)
54d4afb5ceSopenharmony_ci{
55d4afb5ceSopenharmony_ci}
56d4afb5ceSopenharmony_ci#else
57d4afb5ceSopenharmony_ci
58d4afb5ceSopenharmony_ci/* in-OP-TEE core apis */
59d4afb5ceSopenharmony_ci
60d4afb5ceSopenharmony_civoid *
61d4afb5ceSopenharmony_ci	TEE_Malloc(uint32_t size, uint32_t hint)
62d4afb5ceSopenharmony_ci{
63d4afb5ceSopenharmony_ci	return malloc(size);
64d4afb5ceSopenharmony_ci}
65d4afb5ceSopenharmony_civoid *
66d4afb5ceSopenharmony_ci	TEE_Realloc(void *buffer, uint32_t newSize)
67d4afb5ceSopenharmony_ci{
68d4afb5ceSopenharmony_ci	return realloc(buffer, newSize);
69d4afb5ceSopenharmony_ci}
70d4afb5ceSopenharmony_civoid
71d4afb5ceSopenharmony_ci	TEE_Free(void *buffer)
72d4afb5ceSopenharmony_ci{
73d4afb5ceSopenharmony_ci	free(buffer);
74d4afb5ceSopenharmony_ci}
75d4afb5ceSopenharmony_ci
76d4afb5ceSopenharmony_ci#endif
77d4afb5ceSopenharmony_ci
78d4afb5ceSopenharmony_civoid *lws_realloc(void *ptr, size_t size, const char *reason)
79d4afb5ceSopenharmony_ci{
80d4afb5ceSopenharmony_ci	return TEE_Realloc(ptr, size);
81d4afb5ceSopenharmony_ci}
82d4afb5ceSopenharmony_ci
83d4afb5ceSopenharmony_civoid *lws_malloc(size_t size, const char *reason)
84d4afb5ceSopenharmony_ci{
85d4afb5ceSopenharmony_ci	return TEE_Malloc(size, TEE_USER_MEM_HINT_NO_FILL_ZERO);
86d4afb5ceSopenharmony_ci}
87d4afb5ceSopenharmony_ci
88d4afb5ceSopenharmony_civoid lws_free(void *p)
89d4afb5ceSopenharmony_ci{
90d4afb5ceSopenharmony_ci	TEE_Free(p);
91d4afb5ceSopenharmony_ci}
92d4afb5ceSopenharmony_ci
93d4afb5ceSopenharmony_civoid *lws_zalloc(size_t size, const char *reason)
94d4afb5ceSopenharmony_ci{
95d4afb5ceSopenharmony_ci	void *ptr = TEE_Malloc(size, TEE_USER_MEM_HINT_NO_FILL_ZERO);
96d4afb5ceSopenharmony_ci	if (ptr)
97d4afb5ceSopenharmony_ci		memset(ptr, 0, size);
98d4afb5ceSopenharmony_ci	return ptr;
99d4afb5ceSopenharmony_ci}
100d4afb5ceSopenharmony_ci
101d4afb5ceSopenharmony_civoid lws_set_allocator(void *(*cb)(void *ptr, size_t size, const char *reason))
102d4afb5ceSopenharmony_ci{
103d4afb5ceSopenharmony_ci	(void)cb;
104d4afb5ceSopenharmony_ci}
105d4afb5ceSopenharmony_ci#else
106d4afb5ceSopenharmony_ci
107d4afb5ceSopenharmony_cistatic void *
108d4afb5ceSopenharmony_ci_realloc(void *ptr, size_t size, const char *reason)
109d4afb5ceSopenharmony_ci{
110d4afb5ceSopenharmony_ci	void *v;
111d4afb5ceSopenharmony_ci
112d4afb5ceSopenharmony_ci	if (size) {
113d4afb5ceSopenharmony_ci#if defined(LWS_PLAT_FREERTOS)
114d4afb5ceSopenharmony_ci		lwsl_debug("%s: size %lu: %s (free heap %d)\n", __func__,
115d4afb5ceSopenharmony_ci#if defined(LWS_AMAZON_RTOS)
116d4afb5ceSopenharmony_ci			    (unsigned long)size, reason, (unsigned int)xPortGetFreeHeapSize() - (int)size);
117d4afb5ceSopenharmony_ci#else
118d4afb5ceSopenharmony_ci			    (unsigned long)size, reason, (unsigned int)esp_get_free_heap_size() - (int)size);
119d4afb5ceSopenharmony_ci#endif
120d4afb5ceSopenharmony_ci#else
121d4afb5ceSopenharmony_ci		lwsl_debug("%s: size %lu: %s\n", __func__,
122d4afb5ceSopenharmony_ci			   (unsigned long)size, reason);
123d4afb5ceSopenharmony_ci#endif
124d4afb5ceSopenharmony_ci
125d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_MALLOC_USABLE_SIZE)
126d4afb5ceSopenharmony_ci		if (ptr)
127d4afb5ceSopenharmony_ci			allocated -= malloc_usable_size(ptr);
128d4afb5ceSopenharmony_ci#endif
129d4afb5ceSopenharmony_ci
130d4afb5ceSopenharmony_ci#if defined(LWS_PLAT_OPTEE)
131d4afb5ceSopenharmony_ci		v = (void *)TEE_Realloc(ptr, size);
132d4afb5ceSopenharmony_ci#else
133d4afb5ceSopenharmony_ci		v = (void *)realloc(ptr, size);
134d4afb5ceSopenharmony_ci#endif
135d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_MALLOC_USABLE_SIZE)
136d4afb5ceSopenharmony_ci		allocated += malloc_usable_size(v);
137d4afb5ceSopenharmony_ci#endif
138d4afb5ceSopenharmony_ci		return v;
139d4afb5ceSopenharmony_ci	}
140d4afb5ceSopenharmony_ci	if (ptr) {
141d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_MALLOC_USABLE_SIZE)
142d4afb5ceSopenharmony_ci		allocated -= malloc_usable_size(ptr);
143d4afb5ceSopenharmony_ci#endif
144d4afb5ceSopenharmony_ci		free(ptr);
145d4afb5ceSopenharmony_ci	}
146d4afb5ceSopenharmony_ci
147d4afb5ceSopenharmony_ci	return NULL;
148d4afb5ceSopenharmony_ci}
149d4afb5ceSopenharmony_ci
150d4afb5ceSopenharmony_civoid *(*_lws_realloc)(void *ptr, size_t size, const char *reason) = _realloc;
151d4afb5ceSopenharmony_ci
152d4afb5ceSopenharmony_civoid *lws_realloc(void *ptr, size_t size, const char *reason)
153d4afb5ceSopenharmony_ci{
154d4afb5ceSopenharmony_ci	return _lws_realloc(ptr, size, reason);
155d4afb5ceSopenharmony_ci}
156d4afb5ceSopenharmony_ci
157d4afb5ceSopenharmony_civoid *lws_zalloc(size_t size, const char *reason)
158d4afb5ceSopenharmony_ci{
159d4afb5ceSopenharmony_ci	void *ptr = _lws_realloc(NULL, size, reason);
160d4afb5ceSopenharmony_ci
161d4afb5ceSopenharmony_ci	if (ptr)
162d4afb5ceSopenharmony_ci		memset(ptr, 0, size);
163d4afb5ceSopenharmony_ci
164d4afb5ceSopenharmony_ci	return ptr;
165d4afb5ceSopenharmony_ci}
166d4afb5ceSopenharmony_ci
167d4afb5ceSopenharmony_civoid lws_set_allocator(void *(*cb)(void *ptr, size_t size, const char *reason))
168d4afb5ceSopenharmony_ci{
169d4afb5ceSopenharmony_ci	_lws_realloc = cb;
170d4afb5ceSopenharmony_ci}
171d4afb5ceSopenharmony_ci
172d4afb5ceSopenharmony_cisize_t lws_get_allocated_heap(void)
173d4afb5ceSopenharmony_ci{
174d4afb5ceSopenharmony_ci#if defined(LWS_HAVE_MALLOC_USABLE_SIZE)
175d4afb5ceSopenharmony_ci	return allocated;
176d4afb5ceSopenharmony_ci#else
177d4afb5ceSopenharmony_ci	return 0;
178d4afb5ceSopenharmony_ci#endif
179d4afb5ceSopenharmony_ci}
180d4afb5ceSopenharmony_ci#endif
181