11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4f3d9bdeeSJens Wiklander * Copyright (c) 2015-2025, Linaro Limited. 5b0104773SPascal Brand */ 67eaed3a3SEtienne Carriere #ifndef __MALLOC_H 77eaed3a3SEtienne Carriere #define __MALLOC_H 8b0104773SPascal Brand 9f3d9bdeeSJens Wiklander #include <malloc_flags.h> 10a05577eaSEtienne Carriere #include <pta_stats.h> 11b0104773SPascal Brand #include <stddef.h> 12074ba9b2SJens Wiklander #include <types_ext.h> 13b0104773SPascal Brand 14c46bd3e1SEtienne Carriere /* 15c46bd3e1SEtienne Carriere * Due to bget implementation, the first memory pool registered shall have 16c46bd3e1SEtienne Carriere * a min size. Choose 1kB which is reasonable. 17c46bd3e1SEtienne Carriere */ 18c46bd3e1SEtienne Carriere #define MALLOC_INITIAL_POOL_MIN_SIZE 1024 19c46bd3e1SEtienne Carriere 20eacabbbcSJerome Forissier void *malloc(size_t size); 21eacabbbcSJerome Forissier void *calloc(size_t nmemb, size_t size); 22eacabbbcSJerome Forissier void *realloc(void *ptr, size_t size); 23eacabbbcSJerome Forissier void *memalign(size_t alignment, size_t size); 240fcbddd4SSY Chiu void free(void *ptr); 250fcbddd4SSY Chiu 26bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 27bc8fe8c2SEtienne Carriere void *aligned_alloc(size_t alignment, size_t size); 28bc8fe8c2SEtienne Carriere #endif 29bc8fe8c2SEtienne Carriere 30b0104773SPascal Brand #ifdef ENABLE_MDBG 31*695be9d6SJens Wiklander void *__mdbg_alloc(uint32_t flags, void *ptr, size_t alignment, size_t nmemb, 32*695be9d6SJens Wiklander size_t size, const char *fname, int lineno); 33bc8fe8c2SEtienne Carriere 34074ba9b2SJens Wiklander void mdbg_check(int bufdump); 35b0104773SPascal Brand 36*695be9d6SJens Wiklander #define malloc(size) __mdbg_alloc(MAF_NULL, NULL, 1, 1, \ 37*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 38*695be9d6SJens Wiklander #define calloc(nmemb, size) __mdbg_alloc(MAF_ZERO_INIT, NULL, 1, (nmemb), \ 39*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 40*695be9d6SJens Wiklander #define realloc(ptr, size) __mdbg_alloc(MAF_NULL, (ptr), 1, 1, \ 41*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 42*695be9d6SJens Wiklander #define memalign(align, size) __mdbg_alloc(MAF_NULL, NULL, (align), 1, \ 43*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 44b0104773SPascal Brand 45bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 46*695be9d6SJens Wiklander #define aligned_alloc(align, size) \ 47*695be9d6SJens Wiklander __mdbg_alloc(MAF_NULL, NULL, (align), 1, (size), __FILE__, __LINE__) 48bc8fe8c2SEtienne Carriere #endif /* __STDC_VERSION__ */ 49bc8fe8c2SEtienne Carriere 50b0104773SPascal Brand #else 51b0104773SPascal Brand 52074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 53b0104773SPascal Brand 54074ba9b2SJens Wiklander #endif 55b0104773SPascal Brand 56074ba9b2SJens Wiklander /* 57074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 58074ba9b2SJens Wiklander * previously allocated (and not freed yet). 59074ba9b2SJens Wiklander * 60074ba9b2SJens Wiklander * Used internally by TAs 61074ba9b2SJens Wiklander */ 62074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 63074ba9b2SJens Wiklander 64074ba9b2SJens Wiklander /* 65074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 66074ba9b2SJens Wiklander * for heap. 67074ba9b2SJens Wiklander * 68074ba9b2SJens Wiklander * Used internally by TAs 69074ba9b2SJens Wiklander */ 70074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 71074ba9b2SJens Wiklander 72074ba9b2SJens Wiklander /* 73945694b9SPascal Brand * Adds a pool of memory to allocate from. 74074ba9b2SJens Wiklander */ 75074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 76b0104773SPascal Brand 7752f8b816SJerome Forissier #ifdef CFG_WITH_STATS 78a05577eaSEtienne Carriere /* Get/reset allocation statistics */ 792617f49fSEtienne Carriere void malloc_get_stats(struct pta_stats_alloc *stats); 8052f8b816SJerome Forissier void malloc_reset_stats(void); 8152f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 822c276d68SPascal Brand 83b76b2296SJerome Forissier #ifdef CFG_NS_VIRTUALIZATION 84386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 85386fc264SVolodymyr Babchuk 86386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 87386fc264SVolodymyr Babchuk 88*695be9d6SJens Wiklander #define nex_malloc(size) __mdbg_alloc(MAF_NEX, NULL, 1, 1, \ 89*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 90*695be9d6SJens Wiklander #define nex_calloc(nmemb, size) __mdbg_alloc(MAF_NEX | MAF_ZERO_INIT, NULL, 1, \ 91*695be9d6SJens Wiklander (nmemb), (size), __FILE__, \ 92*695be9d6SJens Wiklander __LINE__) 93*695be9d6SJens Wiklander #define nex_realloc(ptr, size) __mdbg_alloc(MAF_NEX, (ptr), 1, 1, \ 94*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 95*695be9d6SJens Wiklander #define nex_memalign(align, size) __mdbg_alloc(MAF_NEX, NULL, (align), 1, \ 96*695be9d6SJens Wiklander (size), __FILE__, __LINE__) 97386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 98386fc264SVolodymyr Babchuk 99*695be9d6SJens Wiklander #define nex_mdbg_check(x) do { } while (0) 100*695be9d6SJens Wiklander 101386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 102386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 103386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1043f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 105386fc264SVolodymyr Babchuk 106386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 107386fc264SVolodymyr Babchuk 108*695be9d6SJens Wiklander void nex_free(void *ptr); 109*695be9d6SJens Wiklander 110386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 111386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 112386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 113386fc264SVolodymyr Babchuk 114386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 115386fc264SVolodymyr Babchuk /* 116386fc264SVolodymyr Babchuk * Get/reset allocation statistics 117386fc264SVolodymyr Babchuk */ 118386fc264SVolodymyr Babchuk 1192617f49fSEtienne Carriere void nex_malloc_get_stats(struct pta_stats_alloc *stats); 120386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 121386fc264SVolodymyr Babchuk 122386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 123b76b2296SJerome Forissier #else /* CFG_NS_VIRTUALIZATION */ 124386fc264SVolodymyr Babchuk 125386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 126386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 127386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 128386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1293f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 1308cd20f23SJens Wiklander #define nex_malloc_buffer_overlaps_heap(buf, len) \ 1318cd20f23SJens Wiklander malloc_buffer_overlaps_heap(buf, len) 1328cd20f23SJens Wiklander #define nex_malloc_buffer_is_within_alloced(buf, len) \ 1338cd20f23SJens Wiklander malloc_buffer_is_within_alloced(buf, len) 134386fc264SVolodymyr Babchuk 135b76b2296SJerome Forissier #endif /* CFG_NS_VIRTUALIZATION */ 136386fc264SVolodymyr Babchuk 137680bc37cSJens Wiklander struct malloc_ctx; 138680bc37cSJens Wiklander void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, 139680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 140680bc37cSJens Wiklander void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size, 141680bc37cSJens Wiklander struct malloc_ctx *ctx); 142680bc37cSJens Wiklander void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe); 143680bc37cSJens Wiklander void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb, 144680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 145680bc37cSJens Wiklander void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size, 146680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 147680bc37cSJens Wiklander size_t raw_malloc_get_ctx_size(void); 148680bc37cSJens Wiklander void raw_malloc_init_ctx(struct malloc_ctx *ctx); 149680bc37cSJens Wiklander void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len); 15012d739bdSJens Wiklander bool raw_malloc_buffer_overlaps_heap(struct malloc_ctx *ctx, 15112d739bdSJens Wiklander void *buf, size_t len); 15212d739bdSJens Wiklander bool raw_malloc_buffer_is_within_alloced(struct malloc_ctx *ctx, 15312d739bdSJens Wiklander void *buf, size_t len); 154a51d45b5SJens Wiklander #ifdef CFG_WITH_STATS 1552617f49fSEtienne Carriere void raw_malloc_get_stats(struct malloc_ctx *ctx, 1562617f49fSEtienne Carriere struct pta_stats_alloc *stats); 157a51d45b5SJens Wiklander #endif 158680bc37cSJens Wiklander 1597eaed3a3SEtienne Carriere #endif /* __MALLOC_H */ 160