diff --git a/lib/alloc.c b/lib/alloc.c index 7a99a9dd..34e7a8ac 100644 --- a/lib/alloc.c +++ b/lib/alloc.c @@ -1,9 +1,61 @@ #include "private-libwebsockets.h" +#if defined(LWS_PLAT_OPTEE) + +#define TEE_USER_MEM_HINT_NO_FILL_ZERO 0x80000000 + +void *__attribute__((weak)) + TEE_Malloc(uint32_t size, uint32_t hint) +{ + return NULL; +} +void *__attribute__((weak)) + TEE_Realloc(void *buffer, uint32_t newSize) +{ + return NULL; +} +void __attribute__((weak)) + TEE_Free(void *buffer) +{ +} + +void *lws_realloc(void *ptr, size_t size) +{ + return TEE_Realloc(ptr, size); +} + +void *lws_malloc(size_t size) +{ + return TEE_Malloc(size, TEE_USER_MEM_HINT_NO_FILL_ZERO); +} + +void lws_free(void *p) +{ + TEE_Free(p); +} + +void *lws_zalloc(size_t size) +{ + void *ptr = TEE_Malloc(size, TEE_USER_MEM_HINT_NO_FILL_ZERO); + if (ptr) + memset(ptr, 0, size); + return ptr; +} + +void lws_set_allocator(void *(*cb)(void *ptr, size_t size)) +{ + (void)cb; +} +#else + static void *_realloc(void *ptr, size_t size) { if (size) +#if defined(LWS_PLAT_OPTEE) + return (void *)TEE_Realloc(ptr, size); +#else return (void *)realloc(ptr, size); +#endif else if (ptr) free(ptr); return NULL; @@ -28,3 +80,4 @@ void lws_set_allocator(void *(*cb)(void *ptr, size_t size)) { _lws_realloc = cb; } +#endif diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index d879d306..ec33639a 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -1964,9 +1964,15 @@ lws_realloc(void *ptr, size_t size); LWS_EXTERN void * LWS_WARN_UNUSED_RESULT lws_zalloc(size_t size); +#ifdef LWS_PLAT_OPTEE +void *lws_malloc(size_t size); +void lws_free(void *p); +#define lws_free_set_NULL(P) do { lws_free(P); (P) = NULL; } while(0) +#else #define lws_malloc(S) lws_realloc(NULL, S) #define lws_free(P) lws_realloc(P, 0) #define lws_free_set_NULL(P) do { lws_realloc(P, 0); (P) = NULL; } while(0) +#endif /* lws_plat_ */ LWS_EXTERN void