xref: /optee_os/lib/libutils/isoc/include/malloc.h (revision c46bd3e1f20d9c743a685714ad4f169c6e52d0d1)
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 
11*c46bd3e1SEtienne Carriere /*
12*c46bd3e1SEtienne Carriere  * Due to bget implementation, the first memory pool registered shall have
13*c46bd3e1SEtienne Carriere  * a min size. Choose 1kB which is reasonable.
14*c46bd3e1SEtienne Carriere  */
15*c46bd3e1SEtienne Carriere #define MALLOC_INITIAL_POOL_MIN_SIZE	1024
16*c46bd3e1SEtienne Carriere 
170fcbddd4SSY Chiu void free(void *ptr);
180fcbddd4SSY Chiu 
19b0104773SPascal Brand #ifdef ENABLE_MDBG
20b0104773SPascal Brand 
21074ba9b2SJens Wiklander void *mdbg_malloc(const char *fname, int lineno, size_t size);
22074ba9b2SJens Wiklander void *mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size);
23074ba9b2SJens Wiklander void *mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size);
243f286c3bSJens Wiklander void *mdbg_memalign(const char *fname, int lineno, size_t alignment,
253f286c3bSJens Wiklander 		    size_t size);
26b0104773SPascal Brand 
27074ba9b2SJens Wiklander void mdbg_check(int bufdump);
28b0104773SPascal Brand 
29074ba9b2SJens Wiklander #define malloc(size)	mdbg_malloc(__FILE__, __LINE__, (size))
30074ba9b2SJens Wiklander #define calloc(nmemb, size) \
31074ba9b2SJens Wiklander 		mdbg_calloc(__FILE__, __LINE__, (nmemb), (size))
32074ba9b2SJens Wiklander #define realloc(ptr, size) \
33074ba9b2SJens Wiklander 		mdbg_realloc(__FILE__, __LINE__, (ptr), (size))
343f286c3bSJens Wiklander #define memalign(alignment, size) \
353f286c3bSJens Wiklander 		mdbg_memalign(__FILE__, __LINE__, (alignment), (size))
36b0104773SPascal Brand 
37b0104773SPascal Brand #else
38b0104773SPascal Brand 
39b0104773SPascal Brand void *malloc(size_t size);
40074ba9b2SJens Wiklander void *calloc(size_t nmemb, size_t size);
41b0104773SPascal Brand void *realloc(void *ptr, size_t size);
423f286c3bSJens Wiklander void *memalign(size_t alignment, size_t size);
43b0104773SPascal Brand 
44074ba9b2SJens Wiklander #define mdbg_check(x)        do { } while (0)
45b0104773SPascal Brand 
46074ba9b2SJens Wiklander #endif
47b0104773SPascal Brand 
48b0104773SPascal Brand 
49074ba9b2SJens Wiklander /*
50074ba9b2SJens Wiklander  * Returns true if the supplied memory area is within a buffer
51074ba9b2SJens Wiklander  * previously allocated (and not freed yet).
52074ba9b2SJens Wiklander  *
53074ba9b2SJens Wiklander  * Used internally by TAs
54074ba9b2SJens Wiklander  */
55074ba9b2SJens Wiklander bool malloc_buffer_is_within_alloced(void *buf, size_t len);
56074ba9b2SJens Wiklander 
57074ba9b2SJens Wiklander /*
58074ba9b2SJens Wiklander  * Returns true if the supplied memory area is overlapping the area used
59074ba9b2SJens Wiklander  * for heap.
60074ba9b2SJens Wiklander  *
61074ba9b2SJens Wiklander  * Used internally by TAs
62074ba9b2SJens Wiklander  */
63074ba9b2SJens Wiklander bool malloc_buffer_overlaps_heap(void *buf, size_t len);
64074ba9b2SJens Wiklander 
65074ba9b2SJens Wiklander /*
66945694b9SPascal Brand  * Adds a pool of memory to allocate from.
67074ba9b2SJens Wiklander  */
68074ba9b2SJens Wiklander void malloc_add_pool(void *buf, size_t len);
69b0104773SPascal Brand 
7052f8b816SJerome Forissier #ifdef CFG_WITH_STATS
7152f8b816SJerome Forissier /*
7252f8b816SJerome Forissier  * Get/reset allocation statistics
7352f8b816SJerome Forissier  */
7452f8b816SJerome Forissier 
7552f8b816SJerome Forissier #define TEE_ALLOCATOR_DESC_LENGTH 32
7652f8b816SJerome Forissier struct malloc_stats {
7752f8b816SJerome Forissier 	char desc[TEE_ALLOCATOR_DESC_LENGTH];
7852f8b816SJerome Forissier 	uint32_t allocated;               /* Bytes currently allocated */
7952f8b816SJerome Forissier 	uint32_t max_allocated;           /* Tracks max value of allocated */
8052f8b816SJerome Forissier 	uint32_t size;                    /* Total size for this allocator */
8152f8b816SJerome Forissier 	uint32_t num_alloc_fail;          /* Number of failed alloc requests */
8252f8b816SJerome Forissier 	uint32_t biggest_alloc_fail;      /* Size of biggest failed alloc */
8352f8b816SJerome Forissier 	uint32_t biggest_alloc_fail_used; /* Alloc bytes when above occurred */
8452f8b816SJerome Forissier };
8552f8b816SJerome Forissier 
8652f8b816SJerome Forissier void malloc_get_stats(struct malloc_stats *stats);
8752f8b816SJerome Forissier void malloc_reset_stats(void);
8852f8b816SJerome Forissier #endif /* CFG_WITH_STATS */
892c276d68SPascal Brand 
90386fc264SVolodymyr Babchuk 
91386fc264SVolodymyr Babchuk #ifdef CFG_VIRTUALIZATION
92386fc264SVolodymyr Babchuk 
93386fc264SVolodymyr Babchuk void nex_free(void *ptr);
94386fc264SVolodymyr Babchuk 
95386fc264SVolodymyr Babchuk #ifdef ENABLE_MDBG
96386fc264SVolodymyr Babchuk 
97386fc264SVolodymyr Babchuk void *nex_mdbg_malloc(const char *fname, int lineno, size_t size);
98386fc264SVolodymyr Babchuk void *nex_mdbg_calloc(const char *fname, int lineno, size_t nmemb, size_t size);
99386fc264SVolodymyr Babchuk void *nex_mdbg_realloc(const char *fname, int lineno, void *ptr, size_t size);
1003f286c3bSJens Wiklander void *nex_mdbg_memalign(const char *fname, int lineno, size_t alignment,
1013f286c3bSJens Wiklander 			size_t size);
102386fc264SVolodymyr Babchuk 
103386fc264SVolodymyr Babchuk void nex_mdbg_check(int bufdump);
104386fc264SVolodymyr Babchuk 
105386fc264SVolodymyr Babchuk #define nex_malloc(size)	nex_mdbg_malloc(__FILE__, __LINE__, (size))
106386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) \
107386fc264SVolodymyr Babchuk 		nex_mdbg_calloc(__FILE__, __LINE__, (nmemb), (size))
108386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) \
109386fc264SVolodymyr Babchuk 		nex_mdbg_realloc(__FILE__, __LINE__, (ptr), (size))
1103f286c3bSJens Wiklander #define nex_memalign(alignment, size) \
1113f286c3bSJens Wiklander 		nex_mdbg_memalign(__FILE__, __LINE__, (alignment), (size))
112386fc264SVolodymyr Babchuk 
113386fc264SVolodymyr Babchuk #else /* ENABLE_MDBG */
114386fc264SVolodymyr Babchuk 
115386fc264SVolodymyr Babchuk void *nex_malloc(size_t size);
116386fc264SVolodymyr Babchuk void *nex_calloc(size_t nmemb, size_t size);
117386fc264SVolodymyr Babchuk void *nex_realloc(void *ptr, size_t size);
1183f286c3bSJens Wiklander void *nex_memalign(size_t alignment, size_t size);
119386fc264SVolodymyr Babchuk 
120386fc264SVolodymyr Babchuk #define nex_mdbg_check(x)        do { } while (0)
121386fc264SVolodymyr Babchuk 
122386fc264SVolodymyr Babchuk #endif /* ENABLE_MDBG */
123386fc264SVolodymyr Babchuk 
124386fc264SVolodymyr Babchuk bool nex_malloc_buffer_is_within_alloced(void *buf, size_t len);
125386fc264SVolodymyr Babchuk bool nex_malloc_buffer_overlaps_heap(void *buf, size_t len);
126386fc264SVolodymyr Babchuk void nex_malloc_add_pool(void *buf, size_t len);
127386fc264SVolodymyr Babchuk 
128386fc264SVolodymyr Babchuk #ifdef CFG_WITH_STATS
129386fc264SVolodymyr Babchuk /*
130386fc264SVolodymyr Babchuk  * Get/reset allocation statistics
131386fc264SVolodymyr Babchuk  */
132386fc264SVolodymyr Babchuk 
133386fc264SVolodymyr Babchuk void nex_malloc_get_stats(struct malloc_stats *stats);
134386fc264SVolodymyr Babchuk void nex_malloc_reset_stats(void);
135386fc264SVolodymyr Babchuk 
136386fc264SVolodymyr Babchuk #endif	/* CFG_WITH_STATS */
137386fc264SVolodymyr Babchuk #else  /* CFG_VIRTUALIZATION */
138386fc264SVolodymyr Babchuk 
139386fc264SVolodymyr Babchuk #define nex_free(ptr) free(ptr)
140386fc264SVolodymyr Babchuk #define nex_malloc(size) malloc(size)
141386fc264SVolodymyr Babchuk #define nex_calloc(nmemb, size) calloc(nmemb, size)
142386fc264SVolodymyr Babchuk #define nex_realloc(ptr, size) realloc(ptr, size)
1433f286c3bSJens Wiklander #define nex_memalign(alignment, size) memalign(alignment, size)
144386fc264SVolodymyr Babchuk 
145386fc264SVolodymyr Babchuk #endif	/* CFG_VIRTUALIZATION */
146386fc264SVolodymyr Babchuk 
147b0104773SPascal Brand #endif /* MALLOC_H */
148