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