11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4*f3d9bdeeSJens Wiklander * Copyright (c) 2015-2025, Linaro Limited. 5b0104773SPascal Brand */ 67eaed3a3SEtienne Carriere #ifndef __MALLOC_H 77eaed3a3SEtienne Carriere #define __MALLOC_H 8b0104773SPascal Brand 9*f3d9bdeeSJens 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 31b0104773SPascal Brand 32074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size); 33074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 34074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 353f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment, 363f286c3bSJens Wiklander size_t size); 37b0104773SPascal Brand 38bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 39bc8fe8c2SEtienne Carriere void *mdbg_aligned_alloc(const char *fname, int lineno, size_t alignment, 40bc8fe8c2SEtienne Carriere size_t size); 41bc8fe8c2SEtienne Carriere #endif 42bc8fe8c2SEtienne Carriere 43074ba9b2SJens Wiklander void mdbg_check(int bufdump); 44b0104773SPascal Brand 45074ba9b2SJens Wiklander #define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size)) 46074ba9b2SJens Wiklander #define calloc(nmemb, size) \ 47074ba9b2SJens Wiklander mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 48074ba9b2SJens Wiklander #define realloc(ptr, size) \ 49074ba9b2SJens Wiklander mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 503f286c3bSJens Wiklander #define memalign(alignment, size) \ 513f286c3bSJens Wiklander mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 52b0104773SPascal Brand 53bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 54bc8fe8c2SEtienne Carriere #define aligned_alloc(alignment, size) \ 55bc8fe8c2SEtienne Carriere mdbg_aligned_alloc(__FILE__, __LINE__, (alignment), (size)) 56bc8fe8c2SEtienne Carriere #endif /* __STDC_VERSION__ */ 57bc8fe8c2SEtienne Carriere 58b0104773SPascal Brand #else 59b0104773SPascal Brand 60074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 61b0104773SPascal Brand 62074ba9b2SJens Wiklander #endif 63b0104773SPascal Brand 64074ba9b2SJens Wiklander /* 65074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 66074ba9b2SJens Wiklander * previously allocated (and not freed yet). 67074ba9b2SJens Wiklander * 68074ba9b2SJens Wiklander * Used internally by TAs 69074ba9b2SJens Wiklander */ 70074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 71074ba9b2SJens Wiklander 72074ba9b2SJens Wiklander /* 73074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 74074ba9b2SJens Wiklander * for heap. 75074ba9b2SJens Wiklander * 76074ba9b2SJens Wiklander * Used internally by TAs 77074ba9b2SJens Wiklander */ 78074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 79074ba9b2SJens Wiklander 80074ba9b2SJens Wiklander /* 81945694b9SPascal Brand * Adds a pool of memory to allocate from. 82074ba9b2SJens Wiklander */ 83074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 84b0104773SPascal Brand 8552f8b816SJerome Forissier #ifdef CFG_WITH_STATS 86a05577eaSEtienne Carriere /* Get/reset allocation statistics */ 872617f49fSEtienne Carriere void malloc_get_stats(struct pta_stats_alloc *stats); 8852f8b816SJerome Forissier void malloc_reset_stats(void); 8952f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 902c276d68SPascal Brand 91386fc264SVolodymyr Babchuk 92b76b2296SJerome Forissier #ifdef CFG_NS_VIRTUALIZATION 93386fc264SVolodymyr Babchuk 94386fc264SVolodymyr Babchuk void nex_free(void *ptr); 95386fc264SVolodymyr Babchuk 96386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 97386fc264SVolodymyr Babchuk 98386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); 99386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 100386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 1013f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, 1023f286c3bSJens Wiklander size_t size); 103386fc264SVolodymyr Babchuk 104386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 105386fc264SVolodymyr Babchuk 106386fc264SVolodymyr Babchuk #define nex_malloc(size) nex_mdbg_malloc(__FILE__, __LINE__, (size)) 107386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \ 108386fc264SVolodymyr Babchuk nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 109386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \ 110386fc264SVolodymyr Babchuk nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 1113f286c3bSJens Wiklander #define nex_memalign(alignment, size) \ 1123f286c3bSJens Wiklander nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 113386fc264SVolodymyr Babchuk 114386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 115386fc264SVolodymyr Babchuk 116386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 117386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 118386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1193f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 120386fc264SVolodymyr Babchuk 121386fc264SVolodymyr Babchuk #define nex_mdbg_check(x) do { } while (0) 122386fc264SVolodymyr Babchuk 123386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 124386fc264SVolodymyr Babchuk 125386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 126386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 127386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 128386fc264SVolodymyr Babchuk 129386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 130386fc264SVolodymyr Babchuk /* 131386fc264SVolodymyr Babchuk * Get/reset allocation statistics 132386fc264SVolodymyr Babchuk */ 133386fc264SVolodymyr Babchuk 1342617f49fSEtienne Carriere void nex_malloc_get_stats(struct pta_stats_alloc *stats); 135386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 136386fc264SVolodymyr Babchuk 137386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 138b76b2296SJerome Forissier #else /* CFG_NS_VIRTUALIZATION */ 139386fc264SVolodymyr Babchuk 140386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 141386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 142386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 143386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1443f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 1458cd20f23SJens Wiklander #define nex_malloc_buffer_overlaps_heap(buf, len) \ 1468cd20f23SJens Wiklander malloc_buffer_overlaps_heap(buf, len) 1478cd20f23SJens Wiklander #define nex_malloc_buffer_is_within_alloced(buf, len) \ 1488cd20f23SJens Wiklander malloc_buffer_is_within_alloced(buf, len) 149386fc264SVolodymyr Babchuk 150b76b2296SJerome Forissier #endif /* CFG_NS_VIRTUALIZATION */ 151386fc264SVolodymyr Babchuk 152680bc37cSJens Wiklander struct malloc_ctx; 153680bc37cSJens Wiklander void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, 154680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 155680bc37cSJens Wiklander void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size, 156680bc37cSJens Wiklander struct malloc_ctx *ctx); 157680bc37cSJens Wiklander void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe); 158680bc37cSJens Wiklander void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb, 159680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 160680bc37cSJens Wiklander void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size, 161680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 162680bc37cSJens Wiklander size_t raw_malloc_get_ctx_size(void); 163680bc37cSJens Wiklander void raw_malloc_init_ctx(struct malloc_ctx *ctx); 164680bc37cSJens Wiklander void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len); 16512d739bdSJens Wiklander bool raw_malloc_buffer_overlaps_heap(struct malloc_ctx *ctx, 16612d739bdSJens Wiklander void *buf, size_t len); 16712d739bdSJens Wiklander bool raw_malloc_buffer_is_within_alloced(struct malloc_ctx *ctx, 16812d739bdSJens Wiklander void *buf, size_t len); 169a51d45b5SJens Wiklander #ifdef CFG_WITH_STATS 1702617f49fSEtienne Carriere void raw_malloc_get_stats(struct malloc_ctx *ctx, 1712617f49fSEtienne Carriere struct pta_stats_alloc *stats); 172a51d45b5SJens Wiklander #endif 173680bc37cSJens Wiklander 1747eaed3a3SEtienne Carriere #endif /* __MALLOC_H */ 175