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 110fcbddd4SSY Chiu void free(void *ptr); 120fcbddd4SSY Chiu 13b0104773SPascal Brand #ifdef ENABLE_MDBG 14b0104773SPascal Brand 15074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size); 16074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 17074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 18*3f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment, 19*3f286c3bSJens Wiklander size_t size); 20b0104773SPascal Brand 21074ba9b2SJens Wiklander void mdbg_check(int bufdump); 22b0104773SPascal Brand 23074ba9b2SJens Wiklander #define malloc(size) mdbg_malloc(__FILE__, __LINE__, (size)) 24074ba9b2SJens Wiklander #define calloc(nmemb, size) \ 25074ba9b2SJens Wiklander mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 26074ba9b2SJens Wiklander #define realloc(ptr, size) \ 27074ba9b2SJens Wiklander mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 28*3f286c3bSJens Wiklander #define memalign(alignment, size) \ 29*3f286c3bSJens Wiklander mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 30b0104773SPascal Brand 31b0104773SPascal Brand #else 32b0104773SPascal Brand 33b0104773SPascal Brand void *malloc(size_t size); 34074ba9b2SJens Wiklander void *calloc(size_t nmemb, size_t size); 35b0104773SPascal Brand void *realloc(void *ptr, size_t size); 36*3f286c3bSJens Wiklander void *memalign(size_t alignment, size_t size); 37b0104773SPascal Brand 38074ba9b2SJens Wiklander #define mdbg_check(x) do { } while (0) 39b0104773SPascal Brand 40074ba9b2SJens Wiklander #endif 41b0104773SPascal Brand 42b0104773SPascal Brand 43074ba9b2SJens Wiklander /* 44074ba9b2SJens Wiklander * Returns true if the supplied memory area is within a buffer 45074ba9b2SJens Wiklander * previously allocated (and not freed yet). 46074ba9b2SJens Wiklander * 47074ba9b2SJens Wiklander * Used internally by TAs 48074ba9b2SJens Wiklander */ 49074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len); 50074ba9b2SJens Wiklander 51074ba9b2SJens Wiklander /* 52074ba9b2SJens Wiklander * Returns true if the supplied memory area is overlapping the area used 53074ba9b2SJens Wiklander * for heap. 54074ba9b2SJens Wiklander * 55074ba9b2SJens Wiklander * Used internally by TAs 56074ba9b2SJens Wiklander */ 57074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len); 58074ba9b2SJens Wiklander 59074ba9b2SJens Wiklander /* 60945694b9SPascal Brand * Adds a pool of memory to allocate from. 61074ba9b2SJens Wiklander */ 62074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len); 63b0104773SPascal Brand 6452f8b816SJerome Forissier #ifdef CFG_WITH_STATS 6552f8b816SJerome Forissier /* 6652f8b816SJerome Forissier * Get/reset allocation statistics 6752f8b816SJerome Forissier */ 6852f8b816SJerome Forissier 6952f8b816SJerome Forissier #define TEE_ALLOCATOR_DESC_LENGTH 32 7052f8b816SJerome Forissier struct malloc_stats { 7152f8b816SJerome Forissier char desc[TEE_ALLOCATOR_DESC_LENGTH]; 7252f8b816SJerome Forissier uint32_t allocated; /* Bytes currently allocated */ 7352f8b816SJerome Forissier uint32_t max_allocated; /* Tracks max value of allocated */ 7452f8b816SJerome Forissier uint32_t size; /* Total size for this allocator */ 7552f8b816SJerome Forissier uint32_t num_alloc_fail; /* Number of failed alloc requests */ 7652f8b816SJerome Forissier uint32_t biggest_alloc_fail; /* Size of biggest failed alloc */ 7752f8b816SJerome Forissier uint32_t biggest_alloc_fail_used; /* Alloc bytes when above occurred */ 7852f8b816SJerome Forissier }; 7952f8b816SJerome Forissier 8052f8b816SJerome Forissier void malloc_get_stats(struct malloc_stats *stats); 8152f8b816SJerome Forissier void malloc_reset_stats(void); 8252f8b816SJerome Forissier #endif /* CFG_WITH_STATS */ 832c276d68SPascal Brand 84386fc264SVolodymyr Babchuk 85386fc264SVolodymyr Babchuk #ifdef CFG_VIRTUALIZATION 86386fc264SVolodymyr Babchuk 87386fc264SVolodymyr Babchuk void nex_free(void *ptr); 88386fc264SVolodymyr Babchuk 89386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG 90386fc264SVolodymyr Babchuk 91386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size); 92386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size); 93386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size); 94*3f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment, 95*3f286c3bSJens Wiklander size_t size); 96386fc264SVolodymyr Babchuk 97386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump); 98386fc264SVolodymyr Babchuk 99386fc264SVolodymyr Babchuk #define nex_malloc(size) nex_mdbg_malloc(__FILE__, __LINE__, (size)) 100386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \ 101386fc264SVolodymyr Babchuk nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size)) 102386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \ 103386fc264SVolodymyr Babchuk nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size)) 104*3f286c3bSJens Wiklander #define nex_memalign(alignment, size) \ 105*3f286c3bSJens Wiklander nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size)) 106386fc264SVolodymyr Babchuk 107386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */ 108386fc264SVolodymyr Babchuk 109386fc264SVolodymyr Babchuk void *nex_malloc(size_t size); 110386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size); 111386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size); 112*3f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size); 113386fc264SVolodymyr Babchuk 114386fc264SVolodymyr Babchuk #define nex_mdbg_check(x) do { } while (0) 115386fc264SVolodymyr Babchuk 116386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */ 117386fc264SVolodymyr Babchuk 118386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len); 119386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len); 120386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len); 121386fc264SVolodymyr Babchuk 122386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS 123386fc264SVolodymyr Babchuk /* 124386fc264SVolodymyr Babchuk * Get/reset allocation statistics 125386fc264SVolodymyr Babchuk */ 126386fc264SVolodymyr Babchuk 127386fc264SVolodymyr Babchuk void nex_malloc_get_stats(struct malloc_stats *stats); 128386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void); 129386fc264SVolodymyr Babchuk 130386fc264SVolodymyr Babchuk #endif /* CFG_WITH_STATS */ 131386fc264SVolodymyr Babchuk #else /* CFG_VIRTUALIZATION */ 132386fc264SVolodymyr Babchuk 133386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr) 134386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size) 135386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size) 136386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size) 137*3f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size) 138386fc264SVolodymyr Babchuk 139386fc264SVolodymyr Babchuk #endif /* CFG_VIRTUALIZATION */ 140386fc264SVolodymyr Babchuk 141b0104773SPascal Brand #endif /* MALLOC_H */ 142