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