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