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 11c46bd3e1SEtienne Carriere /* 12c46bd3e1SEtienne Carriere * Due to bget implementation, the first memory pool registered shall have 13c46bd3e1SEtienne Carriere * a min size. Choose 1kB which is reasonable. 14c46bd3e1SEtienne Carriere */ 15c46bd3e1SEtienne Carriere #define MALLOC_INITIAL_POOL_MIN_SIZE 1024 16c46bd3e1SEtienne Carriere 17eacabbbcSJerome Forissier void *malloc(size_t size); 18eacabbbcSJerome Forissier void *calloc(size_t nmemb, size_t size); 19eacabbbcSJerome Forissier void *realloc(void *ptr, size_t size); 20eacabbbcSJerome Forissier void *memalign(size_t alignment, size_t size); 210fcbddd4SSY Chiu void free(void *ptr); 220fcbddd4SSY Chiu 23b0104773SPascal Brand #ifdef ENABLE_MDBG 24b0104773SPascal Brand 25074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size); 26074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 27074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 283f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment, 293f286c3bSJens Wiklander size_t size); 30b0104773SPascal Brand 31074ba9b2SJens Wiklander void mdbg_check(int bufdump); 32b0104773SPascal Brand 33074ba9b2SJens Wiklander #define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size)) 34074ba9b2SJens Wiklander #define calloc(nmemb, size) \ 35074ba9b2SJens Wiklander mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 36074ba9b2SJens Wiklander #define realloc(ptr, size) \ 37074ba9b2SJens Wiklander mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 383f286c3bSJens Wiklander #define memalign(alignment, size) \ 393f286c3bSJens Wiklander mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 40b0104773SPascal Brand 41b0104773SPascal Brand #else 42b0104773SPascal Brand 43074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 44b0104773SPascal Brand 45074ba9b2SJens Wiklander #endif 46b0104773SPascal Brand 47074ba9b2SJens Wiklander /* 48074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 49074ba9b2SJens Wiklander * previously allocated (and not freed yet). 50074ba9b2SJens Wiklander * 51074ba9b2SJens Wiklander * Used internally by TAs 52074ba9b2SJens Wiklander */ 53074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 54074ba9b2SJens Wiklander 55074ba9b2SJens Wiklander /* 56074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 57074ba9b2SJens Wiklander * for heap. 58074ba9b2SJens Wiklander * 59074ba9b2SJens Wiklander * Used internally by TAs 60074ba9b2SJens Wiklander */ 61074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 62074ba9b2SJens Wiklander 63074ba9b2SJens Wiklander /* 64945694b9SPascal Brand * Adds a pool of memory to allocate from. 65074ba9b2SJens Wiklander */ 66074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 67b0104773SPascal Brand 6852f8b816SJerome Forissier #ifdef CFG_WITH_STATS 6952f8b816SJerome Forissier /* 7052f8b816SJerome Forissier * Get/reset allocation statistics 7152f8b816SJerome Forissier */ 7252f8b816SJerome Forissier 7352f8b816SJerome Forissier #define TEE_ALLOCATOR_DESC_LENGTH 32 7452f8b816SJerome Forissier struct malloc_stats { 7552f8b816SJerome Forissier char desc[TEE_ALLOCATOR_DESC_LENGTH]; 7652f8b816SJerome Forissier uint32_t allocated; /* Bytes currently allocated */ 7752f8b816SJerome Forissier uint32_t max_allocated; /* Tracks max value of allocated */ 7852f8b816SJerome Forissier uint32_t size; /* Total size for this allocator */ 7952f8b816SJerome Forissier uint32_t num_alloc_fail; /* Number of failed alloc requests */ 8052f8b816SJerome Forissier uint32_t biggest_alloc_fail; /* Size of biggest failed alloc */ 8152f8b816SJerome Forissier uint32_t biggest_alloc_fail_used; /* Alloc bytes when above occurred */ 8252f8b816SJerome Forissier }; 8352f8b816SJerome Forissier 8452f8b816SJerome Forissier void malloc_get_stats(struct malloc_stats *stats); 8552f8b816SJerome Forissier void malloc_reset_stats(void); 8652f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 872c276d68SPascal Brand 88386fc264SVolodymyr Babchuk 89386fc264SVolodymyr Babchuk #ifdef CFG_VIRTUALIZATION 90386fc264SVolodymyr Babchuk 91386fc264SVolodymyr Babchuk void nex_free(void *ptr); 92386fc264SVolodymyr Babchuk 93386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 94386fc264SVolodymyr Babchuk 95386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); 96386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 97386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 983f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, 993f286c3bSJens Wiklander size_t size); 100386fc264SVolodymyr Babchuk 101386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 102386fc264SVolodymyr Babchuk 103386fc264SVolodymyr Babchuk #define nex_malloc(size) nex_mdbg_malloc(__FILE__, __LINE__, (size)) 104386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \ 105386fc264SVolodymyr Babchuk nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 106386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \ 107386fc264SVolodymyr Babchuk nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 1083f286c3bSJens Wiklander #define nex_memalign(alignment, size) \ 1093f286c3bSJens Wiklander nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 110386fc264SVolodymyr Babchuk 111386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 112386fc264SVolodymyr Babchuk 113386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 114386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 115386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1163f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 117386fc264SVolodymyr Babchuk 118386fc264SVolodymyr Babchuk #define nex_mdbg_check(x) do { } while (0) 119386fc264SVolodymyr Babchuk 120386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 121386fc264SVolodymyr Babchuk 122386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 123386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 124386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 125386fc264SVolodymyr Babchuk 126386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 127386fc264SVolodymyr Babchuk /* 128386fc264SVolodymyr Babchuk * Get/reset allocation statistics 129386fc264SVolodymyr Babchuk */ 130386fc264SVolodymyr Babchuk 131386fc264SVolodymyr Babchuk void nex_malloc_get_stats(struct malloc_stats *stats); 132386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 133386fc264SVolodymyr Babchuk 134386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 135386fc264SVolodymyr Babchuk #else /* CFG_VIRTUALIZATION */ 136386fc264SVolodymyr Babchuk 137386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 138386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 139386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 140386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1413f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 142386fc264SVolodymyr Babchuk 143386fc264SVolodymyr Babchuk #endif /* CFG_VIRTUALIZATION */ 144386fc264SVolodymyr Babchuk 145680bc37cSJens Wiklander struct malloc_ctx; 146680bc37cSJens Wiklander void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, 147680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 148680bc37cSJens Wiklander void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size, 149680bc37cSJens Wiklander struct malloc_ctx *ctx); 150680bc37cSJens Wiklander void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe); 151680bc37cSJens Wiklander void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb, 152680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 153680bc37cSJens Wiklander void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size, 154680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 155680bc37cSJens Wiklander size_t raw_malloc_get_ctx_size(void); 156680bc37cSJens Wiklander void raw_malloc_init_ctx(struct malloc_ctx *ctx); 157680bc37cSJens Wiklander void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len); 158*a51d45b5SJens Wiklander #ifdef CFG_WITH_STATS 159680bc37cSJens Wiklander void raw_malloc_get_stats(struct malloc_ctx *ctx, struct malloc_stats *stats); 160*a51d45b5SJens Wiklander #endif 161680bc37cSJens Wiklander 162b0104773SPascal Brand #endif /* MALLOC_H */ 163