xref: /optee_os/lib/libutils/isoc/include/malloc.h (revision 695be9d6057d6160ebf89cc8c2e1e94c9d976da7)
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