11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 57eaed3a3SEtienne Carriere #ifndef __MALLOC_H 67eaed3a3SEtienne Carriere #define __MALLOC_H 7b0104773SPascal Brand 8*a05577eaSEtienne Carriere #include <pta_stats.h> 9b0104773SPascal Brand #include <stddef.h> 10074ba9b2SJens Wiklander #include <types_ext.h> 11b0104773SPascal Brand 12c46bd3e1SEtienne Carriere /* 13c46bd3e1SEtienne Carriere * Due to bget implementation, the first memory pool registered shall have 14c46bd3e1SEtienne Carriere * a min size. Choose 1kB which is reasonable. 15c46bd3e1SEtienne Carriere */ 16c46bd3e1SEtienne Carriere #define MALLOC_INITIAL_POOL_MIN_SIZE 1024 17c46bd3e1SEtienne Carriere 18eacabbbcSJerome Forissier void *malloc(size_t size); 19eacabbbcSJerome Forissier void *calloc(size_t nmemb, size_t size); 20eacabbbcSJerome Forissier void *realloc(void *ptr, size_t size); 21eacabbbcSJerome Forissier void *memalign(size_t alignment, size_t size); 220fcbddd4SSY Chiu void free(void *ptr); 230fcbddd4SSY Chiu 24bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 25bc8fe8c2SEtienne Carriere void *aligned_alloc(size_t alignment, size_t size); 26bc8fe8c2SEtienne Carriere #endif 27bc8fe8c2SEtienne Carriere 28b0104773SPascal Brand #ifdef ENABLE_MDBG 29b0104773SPascal Brand 30074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size); 31074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 32074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 333f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment, 343f286c3bSJens Wiklander size_t size); 35b0104773SPascal Brand 36bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 37bc8fe8c2SEtienne Carriere void *mdbg_aligned_alloc(const char *fname, int lineno, size_t alignment, 38bc8fe8c2SEtienne Carriere size_t size); 39bc8fe8c2SEtienne Carriere #endif 40bc8fe8c2SEtienne Carriere 41074ba9b2SJens Wiklander void mdbg_check(int bufdump); 42b0104773SPascal Brand 43074ba9b2SJens Wiklander #define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size)) 44074ba9b2SJens Wiklander #define calloc(nmemb, size) \ 45074ba9b2SJens Wiklander mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 46074ba9b2SJens Wiklander #define realloc(ptr, size) \ 47074ba9b2SJens Wiklander mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 483f286c3bSJens Wiklander #define memalign(alignment, size) \ 493f286c3bSJens Wiklander mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 50b0104773SPascal Brand 51bc8fe8c2SEtienne Carriere #if __STDC_VERSION__ >= 201112L 52bc8fe8c2SEtienne Carriere #define aligned_alloc(alignment, size) \ 53bc8fe8c2SEtienne Carriere mdbg_aligned_alloc(__FILE__, __LINE__, (alignment), (size)) 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 84*a05577eaSEtienne 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 89386fc264SVolodymyr Babchuk 90b76b2296SJerome Forissier #ifdef CFG_NS_VIRTUALIZATION 91386fc264SVolodymyr Babchuk 92386fc264SVolodymyr Babchuk void nex_free(void *ptr); 93386fc264SVolodymyr Babchuk 94386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 95386fc264SVolodymyr Babchuk 96386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); 97386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 98386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 993f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, 1003f286c3bSJens Wiklander size_t size); 101386fc264SVolodymyr Babchuk 102386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 103386fc264SVolodymyr Babchuk 104386fc264SVolodymyr Babchuk #define nex_malloc(size) nex_mdbg_malloc(__FILE__, __LINE__, (size)) 105386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \ 106386fc264SVolodymyr Babchuk nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 107386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \ 108386fc264SVolodymyr Babchuk nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 1093f286c3bSJens Wiklander #define nex_memalign(alignment, size) \ 1103f286c3bSJens Wiklander nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 111386fc264SVolodymyr Babchuk 112386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 113386fc264SVolodymyr Babchuk 114386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 115386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 116386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 1173f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 118386fc264SVolodymyr Babchuk 119386fc264SVolodymyr Babchuk #define nex_mdbg_check(x) do { } while (0) 120386fc264SVolodymyr Babchuk 121386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 122386fc264SVolodymyr Babchuk 123386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 124386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 125386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 126386fc264SVolodymyr Babchuk 127386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 128386fc264SVolodymyr Babchuk /* 129386fc264SVolodymyr Babchuk * Get/reset allocation statistics 130386fc264SVolodymyr Babchuk */ 131386fc264SVolodymyr Babchuk 1322617f49fSEtienne Carriere void nex_malloc_get_stats(struct pta_stats_alloc *stats); 133386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 134386fc264SVolodymyr Babchuk 135386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 136b76b2296SJerome Forissier #else /* CFG_NS_VIRTUALIZATION */ 137386fc264SVolodymyr Babchuk 138386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 139386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 140386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 141386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 1423f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 143386fc264SVolodymyr Babchuk 144b76b2296SJerome Forissier #endif /* CFG_NS_VIRTUALIZATION */ 145386fc264SVolodymyr Babchuk 146680bc37cSJens Wiklander struct malloc_ctx; 147680bc37cSJens Wiklander void *raw_memalign(size_t hdr_size, size_t ftr_size, size_t alignment, 148680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 149680bc37cSJens Wiklander void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size, 150680bc37cSJens Wiklander struct malloc_ctx *ctx); 151680bc37cSJens Wiklander void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe); 152680bc37cSJens Wiklander void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb, 153680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 154680bc37cSJens Wiklander void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size, 155680bc37cSJens Wiklander size_t pl_size, struct malloc_ctx *ctx); 156680bc37cSJens Wiklander size_t raw_malloc_get_ctx_size(void); 157680bc37cSJens Wiklander void raw_malloc_init_ctx(struct malloc_ctx *ctx); 158680bc37cSJens Wiklander void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len); 15912d739bdSJens Wiklander bool raw_malloc_buffer_overlaps_heap(struct malloc_ctx *ctx, 16012d739bdSJens Wiklander void *buf, size_t len); 16112d739bdSJens Wiklander bool raw_malloc_buffer_is_within_alloced(struct malloc_ctx *ctx, 16212d739bdSJens Wiklander void *buf, size_t len); 163a51d45b5SJens Wiklander #ifdef CFG_WITH_STATS 1642617f49fSEtienne Carriere void raw_malloc_get_stats(struct malloc_ctx *ctx, 1652617f49fSEtienne Carriere struct pta_stats_alloc *stats); 166a51d45b5SJens Wiklander #endif 167680bc37cSJens Wiklander 1687eaed3a3SEtienne Carriere #endif /* __MALLOC_H */ 169