11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand #ifndef MALLOC_H 6b0104773SPascal Brand #define MALLOC_H 7b0104773SPascal Brand 8b0104773SPascal Brand #include <stddef.h> 9074ba9b2SJens Wiklander #include <types_ext.h> 10b0104773SPascal Brand 11*c46bd3e1SEtienne Carriere /* 12*c46bd3e1SEtienne Carriere * Due to bget implementation, the first memory pool registered shall have 13*c46bd3e1SEtienne Carriere * a min size. Choose 1kB which is reasonable. 14*c46bd3e1SEtienne Carriere */ 15*c46bd3e1SEtienne Carriere #define MALLOC_INITIAL_POOL_MIN_SIZE 1024 16*c46bd3e1SEtienne Carriere 170fcbddd4SSY Chiu void free(void *ptr); 180fcbddd4SSY Chiu 19b0104773SPascal Brand #ifdef ENABLE_MDBG 20b0104773SPascal Brand 21074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size); 22074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 23074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 243f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment, 253f286c3bSJens Wiklander size_t size); 26b0104773SPascal Brand 27074ba9b2SJens Wiklander void mdbg_check(int bufdump); 28b0104773SPascal Brand 29074ba9b2SJens Wiklander #define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size)) 30074ba9b2SJens Wiklander #define calloc(nmemb, size) \ 31074ba9b2SJens Wiklander mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 32074ba9b2SJens Wiklander #define realloc(ptr, size) \ 33074ba9b2SJens Wiklander mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 343f286c3bSJens Wiklander #define memalign(alignment, size) \ 353f286c3bSJens Wiklander mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 36b0104773SPascal Brand 37b0104773SPascal Brand #else 38b0104773SPascal Brand 39b0104773SPascal Brand void *malloc(size_t size); 40074ba9b2SJens Wiklander void *calloc(size_t nmemb, size_t size); 41b0104773SPascal Brand void *realloc(void *ptr, size_t size); 423f286c3bSJens Wiklander void *memalign(size_t alignment, size_t size); 43b0104773SPascal Brand 44074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 45b0104773SPascal Brand 46074ba9b2SJens Wiklander #endif 47b0104773SPascal Brand 48b0104773SPascal Brand 49074ba9b2SJens Wiklander /* 50074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 51074ba9b2SJens Wiklander * previously allocated (and not freed yet). 52074ba9b2SJens Wiklander * 53074ba9b2SJens Wiklander * Used internally by TAs 54074ba9b2SJens Wiklander */ 55074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 56074ba9b2SJens Wiklander 57074ba9b2SJens Wiklander /* 58074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 59074ba9b2SJens Wiklander * for heap. 60074ba9b2SJens Wiklander * 61074ba9b2SJens Wiklander * Used internally by TAs 62074ba9b2SJens Wiklander */ 63074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 64074ba9b2SJens Wiklander 65074ba9b2SJens Wiklander /* 66945694b9SPascal Brand * Adds a pool of memory to allocate from. 67074ba9b2SJens Wiklander */ 68074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 69b0104773SPascal Brand 7052f8b816SJerome Forissier #ifdef CFG_WITH_STATS 7152f8b816SJerome Forissier /* 7252f8b816SJerome Forissier * Get/reset allocation statistics 7352f8b816SJerome Forissier */ 7452f8b816SJerome Forissier 7552f8b816SJerome Forissier #define TEE_ALLOCATOR_DESC_LENGTH 32 7652f8b816SJerome Forissier struct malloc_stats { 7752f8b816SJerome Forissier char desc[TEE_ALLOCATOR_DESC_LENGTH]; 7852f8b816SJerome Forissier uint32_t allocated; /* Bytes currently allocated */ 7952f8b816SJerome Forissier uint32_t max_allocated; /* Tracks max value of allocated */ 8052f8b816SJerome Forissier uint32_t size; /* Total size for this allocator */ 8152f8b816SJerome Forissier uint32_t num_alloc_fail; /* Number of failed alloc requests */ 8252f8b816SJerome Forissier uint32_t biggest_alloc_fail; /* Size of biggest failed alloc */ 8352f8b816SJerome Forissier uint32_t biggest_alloc_fail_used; /* Alloc bytes when above occurred */ 8452f8b816SJerome Forissier }; 8552f8b816SJerome Forissier 8652f8b816SJerome Forissier void malloc_get_stats(struct malloc_stats *stats); 8752f8b816SJerome Forissier void malloc_reset_stats(void); 8852f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 892c276d68SPascal Brand 90386fc264SVolodymyr Babchuk 91386fc264SVolodymyr Babchuk #ifdef CFG_VIRTUALIZATION 92386fc264SVolodymyr Babchuk 93386fc264SVolodymyr Babchuk void nex_free(void *ptr); 94386fc264SVolodymyr Babchuk 95386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 96386fc264SVolodymyr Babchuk 97386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); 98386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 99386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 1003f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, 1013f286c3bSJens Wiklander size_t size); 102386fc264SVolodymyr Babchuk 103386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 104386fc264SVolodymyr Babchuk 105386fc264SVolodymyr Babchuk #define nex_malloc(size) nex_mdbg_malloc(__FILE__, __LINE__, (size)) 106386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \ 107386fc264SVolodymyr Babchuk nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 108386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \ 109386fc264SVolodymyr Babchuk nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 1103f286c3bSJens Wiklander #define nex_memalign(alignment, size) \ 1113f286c3bSJens Wiklander nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 112386fc264SVolodymyr Babchuk 113386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 114386fc264SVolodymyr Babchuk 115386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 116386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 117386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1183f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 119386fc264SVolodymyr Babchuk 120386fc264SVolodymyr Babchuk #define nex_mdbg_check(x) do { } while (0) 121386fc264SVolodymyr Babchuk 122386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 123386fc264SVolodymyr Babchuk 124386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 125386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 126386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 127386fc264SVolodymyr Babchuk 128386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 129386fc264SVolodymyr Babchuk /* 130386fc264SVolodymyr Babchuk * Get/reset allocation statistics 131386fc264SVolodymyr Babchuk */ 132386fc264SVolodymyr Babchuk 133386fc264SVolodymyr Babchuk void nex_malloc_get_stats(struct malloc_stats *stats); 134386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 135386fc264SVolodymyr Babchuk 136386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 137386fc264SVolodymyr Babchuk #else /* CFG_VIRTUALIZATION */ 138386fc264SVolodymyr Babchuk 139386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 140386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 141386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 142386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1433f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 144386fc264SVolodymyr Babchuk 145386fc264SVolodymyr Babchuk #endif /* CFG_VIRTUALIZATION */ 146386fc264SVolodymyr Babchuk 147b0104773SPascal Brand #endif /* MALLOC_H */ 148