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