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 20*edc125c5SJens Wiklander #define MALLOC_DEFAULT_ALIGNMENT (sizeof(long) * 2) 21*edc125c5SJens Wiklander 22eacabbbcSJerome Forissier void *malloc(size_t size); 23*edc125c5SJens Wiklander void *malloc_flags(uint32_t flags, void *ptr, size_t alignment, size_t size); 24eacabbbcSJerome Forissier void *calloc(size_t nmemb, size_t size); 25eacabbbcSJerome Forissier void *realloc(void *ptr, size_t size); 26eacabbbcSJerome Forissier void *memalign(size_t alignment, size_t size); 270fcbddd4SSY Chiu void free(void *ptr); 28*edc125c5SJens Wiklander void free_flags(uint32_t flags, void *ptr); 290fcbddd4SSY Chiu 30bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 31bc8fe8c2SEtienne Carriere void *aligned_alloc(size_t alignment, size_t size); 32bc8fe8c2SEtienne Carriere #endif 33bc8fe8c2SEtienne Carriere 34b0104773SPascal Brand #ifdef ENABLE_MDBG 35695be9d6SJens Wiklander void *__mdbg_alloc(uint32_t flags, void *ptr, size_t alignment, size_t nmemb, 36695be9d6SJens Wiklander size_t size, const char *fname, int lineno); 37bc8fe8c2SEtienne Carriere 38074ba9b2SJens Wiklander void mdbg_check(int bufdump); 39b0104773SPascal Brand 40695be9d6SJens Wiklander #define malloc(size) __mdbg_alloc(MAF_NULL, NULL, 1, 1, \ 41695be9d6SJens Wiklander (size), __FILE__, __LINE__) 42*edc125c5SJens Wiklander #define malloc_flags(flags, ptr, align, size) \ 43*edc125c5SJens Wiklander __mdbg_alloc((flags), (ptr), (align), 1, (size), __FILE__, __LINE__) 44695be9d6SJens Wiklander #define calloc(nmemb, size) __mdbg_alloc(MAF_ZERO_INIT, NULL, 1, (nmemb), \ 45695be9d6SJens Wiklander (size), __FILE__, __LINE__) 46695be9d6SJens Wiklander #define realloc(ptr, size) __mdbg_alloc(MAF_NULL, (ptr), 1, 1, \ 47695be9d6SJens Wiklander (size), __FILE__, __LINE__) 48695be9d6SJens Wiklander #define memalign(align, size) __mdbg_alloc(MAF_NULL, NULL, (align), 1, \ 49695be9d6SJens Wiklander (size), __FILE__, __LINE__) 50b0104773SPascal Brand 51bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 52695be9d6SJens Wiklander #define aligned_alloc(align, size) \ 53695be9d6SJens Wiklander __mdbg_alloc(MAF_NULL, NULL, (align), 1, (size), __FILE__, __LINE__) 54bc8fe8c2SEtienne Carriere #endif /* __STDC_VERSION__ */ 55bc8fe8c2SEtienne Carriere 56b0104773SPascal Brand #else 57b0104773SPascal Brand 58074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 59b0104773SPascal Brand 60074ba9b2SJens Wiklander #endif 61b0104773SPascal Brand 62074ba9b2SJens Wiklander /* 63074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 64074ba9b2SJens Wiklander * previously allocated (and not freed yet). 65074ba9b2SJens Wiklander * 66074ba9b2SJens Wiklander * Used internally by TAs 67074ba9b2SJens Wiklander */ 68074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 69074ba9b2SJens Wiklander 70074ba9b2SJens Wiklander /* 71074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 72074ba9b2SJens Wiklander * for heap. 73074ba9b2SJens Wiklander * 74074ba9b2SJens Wiklander * Used internally by TAs 75074ba9b2SJens Wiklander */ 76074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 77074ba9b2SJens Wiklander 78074ba9b2SJens Wiklander /* 79945694b9SPascal Brand * Adds a pool of memory to allocate from. 80074ba9b2SJens Wiklander */ 81074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 82b0104773SPascal Brand 8352f8b816SJerome Forissier #ifdef CFG_WITH_STATS 84a05577eaSEtienne Carriere /* Get/reset allocation statistics */ 852617f49fSEtienne Carriere void malloc_get_stats(struct pta_stats_alloc *stats); 8652f8b816SJerome Forissier void malloc_reset_stats(void); 8752f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 882c276d68SPascal Brand 89b76b2296SJerome Forissier #ifdef CFG_NS_VIRTUALIZATION 90386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 91386fc264SVolodymyr Babchuk 92386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 93386fc264SVolodymyr Babchuk 94695be9d6SJens Wiklander #define nex_malloc(size) __mdbg_alloc(MAF_NEX, NULL, 1, 1, \ 95695be9d6SJens Wiklander (size), __FILE__, __LINE__) 96695be9d6SJens Wiklander #define nex_calloc(nmemb, size) __mdbg_alloc(MAF_NEX | MAF_ZERO_INIT, NULL, 1, \ 97695be9d6SJens Wiklander (nmemb), (size), __FILE__, \ 98695be9d6SJens Wiklander __LINE__) 99695be9d6SJens Wiklander #define nex_realloc(ptr, size) __mdbg_alloc(MAF_NEX, (ptr), 1, 1, \ 100695be9d6SJens Wiklander (size), __FILE__, __LINE__) 101695be9d6SJens Wiklander #define nex_memalign(align, size) __mdbg_alloc(MAF_NEX, NULL, (align), 1, \ 102695be9d6SJens Wiklander (size), __FILE__, __LINE__) 103386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 104386fc264SVolodymyr Babchuk 105695be9d6SJens Wiklander #define nex_mdbg_check(x) do { } while (0) 106695be9d6SJens Wiklander 107386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 108386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 109386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1103f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 111386fc264SVolodymyr Babchuk 112386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 113386fc264SVolodymyr Babchuk 114695be9d6SJens Wiklander void nex_free(void *ptr); 115695be9d6SJens Wiklander 116386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 117386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 118386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 119386fc264SVolodymyr Babchuk 120386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 121386fc264SVolodymyr Babchuk /* 122386fc264SVolodymyr Babchuk * Get/reset allocation statistics 123386fc264SVolodymyr Babchuk */ 124386fc264SVolodymyr Babchuk 1252617f49fSEtienne Carriere void nex_malloc_get_stats(struct pta_stats_alloc *stats); 126386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 127386fc264SVolodymyr Babchuk 128386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 129b76b2296SJerome Forissier #else /* CFG_NS_VIRTUALIZATION */ 130386fc264SVolodymyr Babchuk 131386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 132386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 133386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 134386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1353f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 1368cd20f23SJens Wiklander #define nex_malloc_buffer_overlaps_heap(buf, len) \ 1378cd20f23SJens Wiklander malloc_buffer_overlaps_heap(buf, len) 1388cd20f23SJens Wiklander #define nex_malloc_buffer_is_within_alloced(buf, len) \ 1398cd20f23SJens Wiklander malloc_buffer_is_within_alloced(buf, len) 140386fc264SVolodymyr Babchuk 141b76b2296SJerome Forissier #endif /* CFG_NS_VIRTUALIZATION */ 142386fc264SVolodymyr Babchuk 143680bc37cSJens Wiklander struct malloc_ctx; 144680bc37cSJens Wiklander void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, 145680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 146680bc37cSJens Wiklander void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size, 147680bc37cSJens Wiklander struct malloc_ctx *ctx); 148680bc37cSJens Wiklander void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe); 149680bc37cSJens Wiklander void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb, 150680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 151680bc37cSJens Wiklander void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size, 152680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 153680bc37cSJens Wiklander size_t raw_malloc_get_ctx_size(void); 154680bc37cSJens Wiklander void raw_malloc_init_ctx(struct malloc_ctx *ctx); 155680bc37cSJens Wiklander void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len); 15612d739bdSJens Wiklander bool raw_malloc_buffer_overlaps_heap(struct malloc_ctx *ctx, 15712d739bdSJens Wiklander void *buf, size_t len); 15812d739bdSJens Wiklander bool raw_malloc_buffer_is_within_alloced(struct malloc_ctx *ctx, 15912d739bdSJens Wiklander void *buf, size_t len); 160a51d45b5SJens Wiklander #ifdef CFG_WITH_STATS 1612617f49fSEtienne Carriere void raw_malloc_get_stats(struct malloc_ctx *ctx, 1622617f49fSEtienne Carriere struct pta_stats_alloc *stats); 163a51d45b5SJens Wiklander #endif 164680bc37cSJens Wiklander 1657eaed3a3SEtienne Carriere #endif /* __MALLOC_H */ 166