1fc5e0894SMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause
2fc5e0894SMarouene Boubakri /*
3fc5e0894SMarouene Boubakri * Copyright (c) 2014, STMicroelectronics International N.V.
4fc5e0894SMarouene Boubakri */
5fc5e0894SMarouene Boubakri
6fc5e0894SMarouene Boubakri #include <kernel/panic.h>
7fc5e0894SMarouene Boubakri #include <kernel/spinlock.h>
8fc5e0894SMarouene Boubakri #include <kernel/tee_common.h>
9fc5e0894SMarouene Boubakri #include <mm/tee_mm.h>
10fc5e0894SMarouene Boubakri #include <mm/tee_pager.h>
11a05577eaSEtienne Carriere #include <pta_stats.h>
12fc5e0894SMarouene Boubakri #include <trace.h>
13fc5e0894SMarouene Boubakri #include <util.h>
14fc5e0894SMarouene Boubakri
tee_mm_init(tee_mm_pool_t * pool,paddr_t lo,paddr_size_t size,uint8_t shift,uint32_t flags)15fc5e0894SMarouene Boubakri bool tee_mm_init(tee_mm_pool_t *pool, paddr_t lo, paddr_size_t size,
16fc5e0894SMarouene Boubakri uint8_t shift, uint32_t flags)
17fc5e0894SMarouene Boubakri {
18fc5e0894SMarouene Boubakri paddr_size_t rounded = 0;
19fc5e0894SMarouene Boubakri paddr_t initial_lo = lo;
20fc5e0894SMarouene Boubakri
21fc5e0894SMarouene Boubakri if (pool == NULL)
22fc5e0894SMarouene Boubakri return false;
23fc5e0894SMarouene Boubakri
2476d6685eSEtienne Carriere lo = ROUNDUP2(lo, 1 << shift);
25fc5e0894SMarouene Boubakri rounded = lo - initial_lo;
2676d6685eSEtienne Carriere size = ROUNDDOWN2(size - rounded, 1 << shift);
27fc5e0894SMarouene Boubakri
28fc5e0894SMarouene Boubakri assert(((uint64_t)size >> shift) < (uint64_t)UINT32_MAX);
29fc5e0894SMarouene Boubakri
30a969e99eSEtienne Carriere *pool = (tee_mm_pool_t){
31a969e99eSEtienne Carriere .lo = lo,
32a969e99eSEtienne Carriere .size = size,
33a969e99eSEtienne Carriere .shift = shift,
34a969e99eSEtienne Carriere .flags = flags,
35a969e99eSEtienne Carriere };
36fc5e0894SMarouene Boubakri
37fe8de805SJens Wiklander pool->entry = malloc_flags(pool->flags | MAF_ZERO_INIT, NULL,
38fe8de805SJens Wiklander MALLOC_DEFAULT_ALIGNMENT,
39fe8de805SJens Wiklander sizeof(tee_mm_entry_t));
40fc5e0894SMarouene Boubakri if (pool->entry == NULL)
41fc5e0894SMarouene Boubakri return false;
42fc5e0894SMarouene Boubakri
43fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC)
44fc5e0894SMarouene Boubakri pool->entry->offset = ((size - 1) >> shift) + 1;
45fc5e0894SMarouene Boubakri
46fc5e0894SMarouene Boubakri pool->entry->pool = pool;
47fc5e0894SMarouene Boubakri pool->lock = SPINLOCK_UNLOCK;
48fc5e0894SMarouene Boubakri
49fc5e0894SMarouene Boubakri return true;
50fc5e0894SMarouene Boubakri }
51fc5e0894SMarouene Boubakri
tee_mm_final(tee_mm_pool_t * pool)52fc5e0894SMarouene Boubakri void tee_mm_final(tee_mm_pool_t *pool)
53fc5e0894SMarouene Boubakri {
54fc5e0894SMarouene Boubakri if (pool == NULL || pool->entry == NULL)
55fc5e0894SMarouene Boubakri return;
56fc5e0894SMarouene Boubakri
57fc5e0894SMarouene Boubakri while (pool->entry->next != NULL)
58fc5e0894SMarouene Boubakri tee_mm_free(pool->entry->next);
59fe8de805SJens Wiklander free_flags(pool->flags, pool->entry);
60fc5e0894SMarouene Boubakri pool->entry = NULL;
61fc5e0894SMarouene Boubakri }
62fc5e0894SMarouene Boubakri
tee_mm_add(tee_mm_entry_t * p,tee_mm_entry_t * nn)63fc5e0894SMarouene Boubakri static void tee_mm_add(tee_mm_entry_t *p, tee_mm_entry_t *nn)
64fc5e0894SMarouene Boubakri {
65fc5e0894SMarouene Boubakri /* add to list */
66fc5e0894SMarouene Boubakri nn->next = p->next;
67fc5e0894SMarouene Boubakri p->next = nn;
68fc5e0894SMarouene Boubakri }
69fc5e0894SMarouene Boubakri
70fc5e0894SMarouene Boubakri #ifdef CFG_WITH_STATS
tee_mm_stats_allocated(tee_mm_pool_t * pool)71fc5e0894SMarouene Boubakri static size_t tee_mm_stats_allocated(tee_mm_pool_t *pool)
72fc5e0894SMarouene Boubakri {
73fc5e0894SMarouene Boubakri tee_mm_entry_t *entry;
74fc5e0894SMarouene Boubakri uint32_t sz = 0;
75fc5e0894SMarouene Boubakri
76fc5e0894SMarouene Boubakri if (!pool)
77fc5e0894SMarouene Boubakri return 0;
78fc5e0894SMarouene Boubakri
79fc5e0894SMarouene Boubakri entry = pool->entry;
80fc5e0894SMarouene Boubakri while (entry) {
81fc5e0894SMarouene Boubakri sz += entry->size;
82fc5e0894SMarouene Boubakri entry = entry->next;
83fc5e0894SMarouene Boubakri }
84fc5e0894SMarouene Boubakri
85fc5e0894SMarouene Boubakri return sz << pool->shift;
86fc5e0894SMarouene Boubakri }
87fc5e0894SMarouene Boubakri
tee_mm_get_pool_stats(tee_mm_pool_t * pool,struct pta_stats_alloc * stats,bool reset)882617f49fSEtienne Carriere void tee_mm_get_pool_stats(tee_mm_pool_t *pool, struct pta_stats_alloc *stats,
89fc5e0894SMarouene Boubakri bool reset)
90fc5e0894SMarouene Boubakri {
91fc5e0894SMarouene Boubakri uint32_t exceptions;
92fc5e0894SMarouene Boubakri
93fc5e0894SMarouene Boubakri if (!pool)
94fc5e0894SMarouene Boubakri return;
95fc5e0894SMarouene Boubakri
96fc5e0894SMarouene Boubakri memset(stats, 0, sizeof(*stats));
97fc5e0894SMarouene Boubakri
98fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock);
99fc5e0894SMarouene Boubakri
100fc5e0894SMarouene Boubakri stats->size = pool->size;
101fc5e0894SMarouene Boubakri stats->max_allocated = pool->max_allocated;
102fc5e0894SMarouene Boubakri stats->allocated = tee_mm_stats_allocated(pool);
103fc5e0894SMarouene Boubakri
104fc5e0894SMarouene Boubakri if (reset)
105fc5e0894SMarouene Boubakri pool->max_allocated = 0;
106fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
107fc5e0894SMarouene Boubakri }
108fc5e0894SMarouene Boubakri
update_max_allocated(tee_mm_pool_t * pool)109fc5e0894SMarouene Boubakri static void update_max_allocated(tee_mm_pool_t *pool)
110fc5e0894SMarouene Boubakri {
111fc5e0894SMarouene Boubakri size_t sz = tee_mm_stats_allocated(pool);
112fc5e0894SMarouene Boubakri
113fc5e0894SMarouene Boubakri if (sz > pool->max_allocated)
114fc5e0894SMarouene Boubakri pool->max_allocated = sz;
115fc5e0894SMarouene Boubakri }
116fc5e0894SMarouene Boubakri #else /* CFG_WITH_STATS */
update_max_allocated(tee_mm_pool_t * pool __unused)117fc5e0894SMarouene Boubakri static inline void update_max_allocated(tee_mm_pool_t *pool __unused)
118fc5e0894SMarouene Boubakri {
119fc5e0894SMarouene Boubakri }
120fc5e0894SMarouene Boubakri #endif /* CFG_WITH_STATS */
121fc5e0894SMarouene Boubakri
tee_mm_alloc_flags(tee_mm_pool_t * pool,size_t size,uint32_t flags)122*5f76bc75SJens Wiklander tee_mm_entry_t *tee_mm_alloc_flags(tee_mm_pool_t *pool, size_t size,
123*5f76bc75SJens Wiklander uint32_t flags)
124fc5e0894SMarouene Boubakri {
125*5f76bc75SJens Wiklander size_t psize = 0;
126*5f76bc75SJens Wiklander tee_mm_entry_t *entry = NULL;
127*5f76bc75SJens Wiklander tee_mm_entry_t *nn = NULL;
128*5f76bc75SJens Wiklander size_t remaining = 0;
129*5f76bc75SJens Wiklander uint32_t exceptions = 0;
130fc5e0894SMarouene Boubakri
131fc5e0894SMarouene Boubakri /* Check that pool is initialized */
132fc5e0894SMarouene Boubakri if (!pool || !pool->entry)
133fc5e0894SMarouene Boubakri return NULL;
134fc5e0894SMarouene Boubakri
135*5f76bc75SJens Wiklander flags &= ~MAF_NEX; /* This flag must come from pool->flags */
136*5f76bc75SJens Wiklander flags |= pool->flags;
137*5f76bc75SJens Wiklander nn = malloc_flags(flags, NULL, MALLOC_DEFAULT_ALIGNMENT,
138fe8de805SJens Wiklander sizeof(tee_mm_entry_t));
139fc5e0894SMarouene Boubakri if (!nn)
140fc5e0894SMarouene Boubakri return NULL;
141fc5e0894SMarouene Boubakri
142fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock);
143fc5e0894SMarouene Boubakri
144fc5e0894SMarouene Boubakri entry = pool->entry;
145fc5e0894SMarouene Boubakri if (!size)
146fc5e0894SMarouene Boubakri psize = 0;
147fc5e0894SMarouene Boubakri else
148fc5e0894SMarouene Boubakri psize = ((size - 1) >> pool->shift) + 1;
149fc5e0894SMarouene Boubakri
150fc5e0894SMarouene Boubakri /* find free slot */
151fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) {
152fc5e0894SMarouene Boubakri while (entry->next != NULL && psize >
153fc5e0894SMarouene Boubakri (entry->offset - entry->next->offset -
154fc5e0894SMarouene Boubakri entry->next->size))
155fc5e0894SMarouene Boubakri entry = entry->next;
156fc5e0894SMarouene Boubakri } else {
157fc5e0894SMarouene Boubakri while (entry->next != NULL && psize >
158fc5e0894SMarouene Boubakri (entry->next->offset - entry->size - entry->offset))
159fc5e0894SMarouene Boubakri entry = entry->next;
160fc5e0894SMarouene Boubakri }
161fc5e0894SMarouene Boubakri
162fc5e0894SMarouene Boubakri /* check if we have enough memory */
163fc5e0894SMarouene Boubakri if (entry->next == NULL) {
164fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) {
165fc5e0894SMarouene Boubakri /*
166fc5e0894SMarouene Boubakri * entry->offset is a "block count" offset from
167fc5e0894SMarouene Boubakri * pool->lo. The byte offset is
168fc5e0894SMarouene Boubakri * (entry->offset << pool->shift).
169fc5e0894SMarouene Boubakri * In the HI_ALLOC allocation scheme the memory is
170fc5e0894SMarouene Boubakri * allocated from the end of the segment, thus to
171fc5e0894SMarouene Boubakri * validate there is sufficient memory validate that
172fc5e0894SMarouene Boubakri * (entry->offset << pool->shift) > size.
173fc5e0894SMarouene Boubakri */
174fc5e0894SMarouene Boubakri if ((entry->offset << pool->shift) < size) {
175fc5e0894SMarouene Boubakri /* out of memory */
176fc5e0894SMarouene Boubakri goto err;
177fc5e0894SMarouene Boubakri }
178fc5e0894SMarouene Boubakri } else {
179fc5e0894SMarouene Boubakri if (!pool->size)
180fc5e0894SMarouene Boubakri panic("invalid pool");
181fc5e0894SMarouene Boubakri
182fc5e0894SMarouene Boubakri remaining = pool->size;
183fc5e0894SMarouene Boubakri remaining -= ((entry->offset + entry->size) <<
184fc5e0894SMarouene Boubakri pool->shift);
185fc5e0894SMarouene Boubakri
186fc5e0894SMarouene Boubakri if (remaining < size) {
187fc5e0894SMarouene Boubakri /* out of memory */
188fc5e0894SMarouene Boubakri goto err;
189fc5e0894SMarouene Boubakri }
190fc5e0894SMarouene Boubakri }
191fc5e0894SMarouene Boubakri }
192fc5e0894SMarouene Boubakri
193fc5e0894SMarouene Boubakri tee_mm_add(entry, nn);
194fc5e0894SMarouene Boubakri
195fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC)
196fc5e0894SMarouene Boubakri nn->offset = entry->offset - psize;
197fc5e0894SMarouene Boubakri else
198fc5e0894SMarouene Boubakri nn->offset = entry->offset + entry->size;
199fc5e0894SMarouene Boubakri nn->size = psize;
200fc5e0894SMarouene Boubakri nn->pool = pool;
201fc5e0894SMarouene Boubakri
202fc5e0894SMarouene Boubakri update_max_allocated(pool);
203fc5e0894SMarouene Boubakri
204fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
205fc5e0894SMarouene Boubakri return nn;
206fc5e0894SMarouene Boubakri err:
207fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
208*5f76bc75SJens Wiklander free_flags(flags, nn);
209fc5e0894SMarouene Boubakri return NULL;
210fc5e0894SMarouene Boubakri }
211fc5e0894SMarouene Boubakri
fit_in_gap(tee_mm_pool_t * pool,tee_mm_entry_t * e,paddr_t offslo,paddr_t offshi)212fc5e0894SMarouene Boubakri static inline bool fit_in_gap(tee_mm_pool_t *pool, tee_mm_entry_t *e,
213fc5e0894SMarouene Boubakri paddr_t offslo, paddr_t offshi)
214fc5e0894SMarouene Boubakri {
215fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) {
216fc5e0894SMarouene Boubakri if (offshi > e->offset ||
217fc5e0894SMarouene Boubakri (e->next != NULL &&
218fc5e0894SMarouene Boubakri (offslo < e->next->offset + e->next->size)) ||
219fc5e0894SMarouene Boubakri (offshi << pool->shift) - 1 > pool->size)
220fc5e0894SMarouene Boubakri /* memory not available */
221fc5e0894SMarouene Boubakri return false;
222fc5e0894SMarouene Boubakri } else {
223fc5e0894SMarouene Boubakri if (offslo < (e->offset + e->size) ||
224fc5e0894SMarouene Boubakri (e->next != NULL && (offshi > e->next->offset)) ||
225fc5e0894SMarouene Boubakri (offshi << pool->shift) > pool->size)
226fc5e0894SMarouene Boubakri /* memory not available */
227fc5e0894SMarouene Boubakri return false;
228fc5e0894SMarouene Boubakri }
229fc5e0894SMarouene Boubakri
230fc5e0894SMarouene Boubakri return true;
231fc5e0894SMarouene Boubakri }
232fc5e0894SMarouene Boubakri
tee_mm_alloc2(tee_mm_pool_t * pool,paddr_t base,size_t size)233fc5e0894SMarouene Boubakri tee_mm_entry_t *tee_mm_alloc2(tee_mm_pool_t *pool, paddr_t base, size_t size)
234fc5e0894SMarouene Boubakri {
235fc5e0894SMarouene Boubakri tee_mm_entry_t *entry;
236fc5e0894SMarouene Boubakri paddr_t offslo;
237fc5e0894SMarouene Boubakri paddr_t offshi;
238fc5e0894SMarouene Boubakri tee_mm_entry_t *mm;
239fc5e0894SMarouene Boubakri uint32_t exceptions;
240fc5e0894SMarouene Boubakri
241fc5e0894SMarouene Boubakri /* Check that pool is initialized */
242fc5e0894SMarouene Boubakri if (!pool || !pool->entry)
243fc5e0894SMarouene Boubakri return NULL;
244fc5e0894SMarouene Boubakri
245fc5e0894SMarouene Boubakri /* Wrapping and sanity check */
246fc5e0894SMarouene Boubakri if ((base + size) < base || base < pool->lo)
247fc5e0894SMarouene Boubakri return NULL;
248fc5e0894SMarouene Boubakri
249fe8de805SJens Wiklander mm = malloc_flags(pool->flags, NULL, MALLOC_DEFAULT_ALIGNMENT,
250fe8de805SJens Wiklander sizeof(tee_mm_entry_t));
251fc5e0894SMarouene Boubakri if (!mm)
252fc5e0894SMarouene Boubakri return NULL;
253fc5e0894SMarouene Boubakri
254fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock);
255fc5e0894SMarouene Boubakri
256fc5e0894SMarouene Boubakri entry = pool->entry;
257fc5e0894SMarouene Boubakri offslo = (base - pool->lo) >> pool->shift;
258fc5e0894SMarouene Boubakri offshi = ((base - pool->lo + size - 1) >> pool->shift) + 1;
259fc5e0894SMarouene Boubakri
260fc5e0894SMarouene Boubakri /* find slot */
261fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) {
262fc5e0894SMarouene Boubakri while (entry->next != NULL &&
263fc5e0894SMarouene Boubakri offshi < entry->next->offset + entry->next->size)
264fc5e0894SMarouene Boubakri entry = entry->next;
265fc5e0894SMarouene Boubakri } else {
266fc5e0894SMarouene Boubakri while (entry->next != NULL && offslo > entry->next->offset)
267fc5e0894SMarouene Boubakri entry = entry->next;
268fc5e0894SMarouene Boubakri }
269fc5e0894SMarouene Boubakri
270fc5e0894SMarouene Boubakri /* Check that memory is available */
271fc5e0894SMarouene Boubakri if (!fit_in_gap(pool, entry, offslo, offshi))
272fc5e0894SMarouene Boubakri goto err;
273fc5e0894SMarouene Boubakri
274fc5e0894SMarouene Boubakri tee_mm_add(entry, mm);
275fc5e0894SMarouene Boubakri
276fc5e0894SMarouene Boubakri mm->offset = offslo;
277fc5e0894SMarouene Boubakri mm->size = offshi - offslo;
278fc5e0894SMarouene Boubakri mm->pool = pool;
279fc5e0894SMarouene Boubakri
280fc5e0894SMarouene Boubakri update_max_allocated(pool);
281fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
282fc5e0894SMarouene Boubakri return mm;
283fc5e0894SMarouene Boubakri err:
284fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
285fe8de805SJens Wiklander free_flags(pool->flags, mm);
286fc5e0894SMarouene Boubakri return NULL;
287fc5e0894SMarouene Boubakri }
288fc5e0894SMarouene Boubakri
tee_mm_free(tee_mm_entry_t * p)289fc5e0894SMarouene Boubakri void tee_mm_free(tee_mm_entry_t *p)
290fc5e0894SMarouene Boubakri {
291fc5e0894SMarouene Boubakri tee_mm_entry_t *entry;
292fc5e0894SMarouene Boubakri uint32_t exceptions;
293fc5e0894SMarouene Boubakri
294fc5e0894SMarouene Boubakri if (!p || !p->pool)
295fc5e0894SMarouene Boubakri return;
296fc5e0894SMarouene Boubakri
297fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&p->pool->lock);
298fc5e0894SMarouene Boubakri entry = p->pool->entry;
299fc5e0894SMarouene Boubakri
300fc5e0894SMarouene Boubakri /* remove entry from list */
301fc5e0894SMarouene Boubakri while (entry->next != NULL && entry->next != p)
302fc5e0894SMarouene Boubakri entry = entry->next;
303fc5e0894SMarouene Boubakri
304fc5e0894SMarouene Boubakri if (!entry->next)
305fc5e0894SMarouene Boubakri panic("invalid mm_entry");
306fc5e0894SMarouene Boubakri
307fc5e0894SMarouene Boubakri entry->next = entry->next->next;
308fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&p->pool->lock, exceptions);
309fc5e0894SMarouene Boubakri
310fe8de805SJens Wiklander free_flags(p->pool->flags, p);
311fc5e0894SMarouene Boubakri }
312fc5e0894SMarouene Boubakri
tee_mm_get_bytes(const tee_mm_entry_t * mm)313fc5e0894SMarouene Boubakri size_t tee_mm_get_bytes(const tee_mm_entry_t *mm)
314fc5e0894SMarouene Boubakri {
315fc5e0894SMarouene Boubakri if (!mm || !mm->pool)
316fc5e0894SMarouene Boubakri return 0;
317fc5e0894SMarouene Boubakri else
318fc5e0894SMarouene Boubakri return mm->size << mm->pool->shift;
319fc5e0894SMarouene Boubakri }
320fc5e0894SMarouene Boubakri
tee_mm_addr_is_within_range(const tee_mm_pool_t * pool,paddr_t addr)321fc5e0894SMarouene Boubakri bool tee_mm_addr_is_within_range(const tee_mm_pool_t *pool, paddr_t addr)
322fc5e0894SMarouene Boubakri {
323fc5e0894SMarouene Boubakri return pool && addr >= pool->lo &&
324fc5e0894SMarouene Boubakri addr <= (pool->lo + (pool->size - 1));
325fc5e0894SMarouene Boubakri }
326fc5e0894SMarouene Boubakri
tee_mm_is_empty(tee_mm_pool_t * pool)327fc5e0894SMarouene Boubakri bool tee_mm_is_empty(tee_mm_pool_t *pool)
328fc5e0894SMarouene Boubakri {
329fc5e0894SMarouene Boubakri bool ret;
330fc5e0894SMarouene Boubakri uint32_t exceptions;
331fc5e0894SMarouene Boubakri
332fc5e0894SMarouene Boubakri if (pool == NULL || pool->entry == NULL)
333fc5e0894SMarouene Boubakri return true;
334fc5e0894SMarouene Boubakri
335fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock);
336fc5e0894SMarouene Boubakri ret = pool->entry == NULL || pool->entry->next == NULL;
337fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions);
338fc5e0894SMarouene Boubakri
339fc5e0894SMarouene Boubakri return ret;
340fc5e0894SMarouene Boubakri }
341fc5e0894SMarouene Boubakri
tee_mm_find(const tee_mm_pool_t * pool,paddr_t addr)342fc5e0894SMarouene Boubakri tee_mm_entry_t *tee_mm_find(const tee_mm_pool_t *pool, paddr_t addr)
343fc5e0894SMarouene Boubakri {
344fc5e0894SMarouene Boubakri tee_mm_entry_t *entry = pool->entry;
345fc5e0894SMarouene Boubakri uint16_t offset = (addr - pool->lo) >> pool->shift;
346fc5e0894SMarouene Boubakri uint32_t exceptions;
347fc5e0894SMarouene Boubakri
348fc5e0894SMarouene Boubakri if (!tee_mm_addr_is_within_range(pool, addr))
349fc5e0894SMarouene Boubakri return NULL;
350fc5e0894SMarouene Boubakri
351fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&((tee_mm_pool_t *)pool)->lock);
352fc5e0894SMarouene Boubakri
353fc5e0894SMarouene Boubakri while (entry->next != NULL) {
354fc5e0894SMarouene Boubakri entry = entry->next;
355fc5e0894SMarouene Boubakri
356fc5e0894SMarouene Boubakri if ((offset >= entry->offset) &&
357fc5e0894SMarouene Boubakri (offset < (entry->offset + entry->size))) {
358fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&((tee_mm_pool_t *)pool)->lock,
359fc5e0894SMarouene Boubakri exceptions);
360fc5e0894SMarouene Boubakri return entry;
361fc5e0894SMarouene Boubakri }
362fc5e0894SMarouene Boubakri }
363fc5e0894SMarouene Boubakri
364fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&((tee_mm_pool_t *)pool)->lock, exceptions);
365fc5e0894SMarouene Boubakri return NULL;
366fc5e0894SMarouene Boubakri }
367fc5e0894SMarouene Boubakri
tee_mm_get_smem(const tee_mm_entry_t * mm)368fc5e0894SMarouene Boubakri uintptr_t tee_mm_get_smem(const tee_mm_entry_t *mm)
369fc5e0894SMarouene Boubakri {
370fc5e0894SMarouene Boubakri return (mm->offset << mm->pool->shift) + mm->pool->lo;
371fc5e0894SMarouene Boubakri }
372