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 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 37*fe8de805SJens Wiklander pool->entry = malloc_flags(pool->flags | MAF_ZERO_INIT, NULL, 38*fe8de805SJens Wiklander MALLOC_DEFAULT_ALIGNMENT, 39*fe8de805SJens 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 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); 59*fe8de805SJens Wiklander free_flags(pool->flags, pool->entry); 60fc5e0894SMarouene Boubakri pool->entry = NULL; 61fc5e0894SMarouene Boubakri } 62fc5e0894SMarouene Boubakri 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 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 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 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 */ 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 122fc5e0894SMarouene Boubakri tee_mm_entry_t *tee_mm_alloc(tee_mm_pool_t *pool, size_t size) 123fc5e0894SMarouene Boubakri { 124fc5e0894SMarouene Boubakri size_t psize; 125fc5e0894SMarouene Boubakri tee_mm_entry_t *entry; 126fc5e0894SMarouene Boubakri tee_mm_entry_t *nn; 127fc5e0894SMarouene Boubakri size_t remaining; 128fc5e0894SMarouene Boubakri uint32_t exceptions; 129fc5e0894SMarouene Boubakri 130fc5e0894SMarouene Boubakri /* Check that pool is initialized */ 131fc5e0894SMarouene Boubakri if (!pool || !pool->entry) 132fc5e0894SMarouene Boubakri return NULL; 133fc5e0894SMarouene Boubakri 134*fe8de805SJens Wiklander nn = malloc_flags(pool->flags, NULL, MALLOC_DEFAULT_ALIGNMENT, 135*fe8de805SJens Wiklander sizeof(tee_mm_entry_t)); 136fc5e0894SMarouene Boubakri if (!nn) 137fc5e0894SMarouene Boubakri return NULL; 138fc5e0894SMarouene Boubakri 139fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock); 140fc5e0894SMarouene Boubakri 141fc5e0894SMarouene Boubakri entry = pool->entry; 142fc5e0894SMarouene Boubakri if (!size) 143fc5e0894SMarouene Boubakri psize = 0; 144fc5e0894SMarouene Boubakri else 145fc5e0894SMarouene Boubakri psize = ((size - 1) >> pool->shift) + 1; 146fc5e0894SMarouene Boubakri 147fc5e0894SMarouene Boubakri /* find free slot */ 148fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) { 149fc5e0894SMarouene Boubakri while (entry->next != NULL && psize > 150fc5e0894SMarouene Boubakri (entry->offset - entry->next->offset - 151fc5e0894SMarouene Boubakri entry->next->size)) 152fc5e0894SMarouene Boubakri entry = entry->next; 153fc5e0894SMarouene Boubakri } else { 154fc5e0894SMarouene Boubakri while (entry->next != NULL && psize > 155fc5e0894SMarouene Boubakri (entry->next->offset - entry->size - entry->offset)) 156fc5e0894SMarouene Boubakri entry = entry->next; 157fc5e0894SMarouene Boubakri } 158fc5e0894SMarouene Boubakri 159fc5e0894SMarouene Boubakri /* check if we have enough memory */ 160fc5e0894SMarouene Boubakri if (entry->next == NULL) { 161fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) { 162fc5e0894SMarouene Boubakri /* 163fc5e0894SMarouene Boubakri * entry->offset is a "block count" offset from 164fc5e0894SMarouene Boubakri * pool->lo. The byte offset is 165fc5e0894SMarouene Boubakri * (entry->offset << pool->shift). 166fc5e0894SMarouene Boubakri * In the HI_ALLOC allocation scheme the memory is 167fc5e0894SMarouene Boubakri * allocated from the end of the segment, thus to 168fc5e0894SMarouene Boubakri * validate there is sufficient memory validate that 169fc5e0894SMarouene Boubakri * (entry->offset << pool->shift) > size. 170fc5e0894SMarouene Boubakri */ 171fc5e0894SMarouene Boubakri if ((entry->offset << pool->shift) < size) { 172fc5e0894SMarouene Boubakri /* out of memory */ 173fc5e0894SMarouene Boubakri goto err; 174fc5e0894SMarouene Boubakri } 175fc5e0894SMarouene Boubakri } else { 176fc5e0894SMarouene Boubakri if (!pool->size) 177fc5e0894SMarouene Boubakri panic("invalid pool"); 178fc5e0894SMarouene Boubakri 179fc5e0894SMarouene Boubakri remaining = pool->size; 180fc5e0894SMarouene Boubakri remaining -= ((entry->offset + entry->size) << 181fc5e0894SMarouene Boubakri pool->shift); 182fc5e0894SMarouene Boubakri 183fc5e0894SMarouene Boubakri if (remaining < size) { 184fc5e0894SMarouene Boubakri /* out of memory */ 185fc5e0894SMarouene Boubakri goto err; 186fc5e0894SMarouene Boubakri } 187fc5e0894SMarouene Boubakri } 188fc5e0894SMarouene Boubakri } 189fc5e0894SMarouene Boubakri 190fc5e0894SMarouene Boubakri tee_mm_add(entry, nn); 191fc5e0894SMarouene Boubakri 192fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) 193fc5e0894SMarouene Boubakri nn->offset = entry->offset - psize; 194fc5e0894SMarouene Boubakri else 195fc5e0894SMarouene Boubakri nn->offset = entry->offset + entry->size; 196fc5e0894SMarouene Boubakri nn->size = psize; 197fc5e0894SMarouene Boubakri nn->pool = pool; 198fc5e0894SMarouene Boubakri 199fc5e0894SMarouene Boubakri update_max_allocated(pool); 200fc5e0894SMarouene Boubakri 201fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions); 202fc5e0894SMarouene Boubakri return nn; 203fc5e0894SMarouene Boubakri err: 204fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions); 205*fe8de805SJens Wiklander free_flags(pool->flags, nn); 206fc5e0894SMarouene Boubakri return NULL; 207fc5e0894SMarouene Boubakri } 208fc5e0894SMarouene Boubakri 209fc5e0894SMarouene Boubakri static inline bool fit_in_gap(tee_mm_pool_t *pool, tee_mm_entry_t *e, 210fc5e0894SMarouene Boubakri paddr_t offslo, paddr_t offshi) 211fc5e0894SMarouene Boubakri { 212fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) { 213fc5e0894SMarouene Boubakri if (offshi > e->offset || 214fc5e0894SMarouene Boubakri (e->next != NULL && 215fc5e0894SMarouene Boubakri (offslo < e->next->offset + e->next->size)) || 216fc5e0894SMarouene Boubakri (offshi << pool->shift) - 1 > pool->size) 217fc5e0894SMarouene Boubakri /* memory not available */ 218fc5e0894SMarouene Boubakri return false; 219fc5e0894SMarouene Boubakri } else { 220fc5e0894SMarouene Boubakri if (offslo < (e->offset + e->size) || 221fc5e0894SMarouene Boubakri (e->next != NULL && (offshi > e->next->offset)) || 222fc5e0894SMarouene Boubakri (offshi << pool->shift) > pool->size) 223fc5e0894SMarouene Boubakri /* memory not available */ 224fc5e0894SMarouene Boubakri return false; 225fc5e0894SMarouene Boubakri } 226fc5e0894SMarouene Boubakri 227fc5e0894SMarouene Boubakri return true; 228fc5e0894SMarouene Boubakri } 229fc5e0894SMarouene Boubakri 230fc5e0894SMarouene Boubakri tee_mm_entry_t *tee_mm_alloc2(tee_mm_pool_t *pool, paddr_t base, size_t size) 231fc5e0894SMarouene Boubakri { 232fc5e0894SMarouene Boubakri tee_mm_entry_t *entry; 233fc5e0894SMarouene Boubakri paddr_t offslo; 234fc5e0894SMarouene Boubakri paddr_t offshi; 235fc5e0894SMarouene Boubakri tee_mm_entry_t *mm; 236fc5e0894SMarouene Boubakri uint32_t exceptions; 237fc5e0894SMarouene Boubakri 238fc5e0894SMarouene Boubakri /* Check that pool is initialized */ 239fc5e0894SMarouene Boubakri if (!pool || !pool->entry) 240fc5e0894SMarouene Boubakri return NULL; 241fc5e0894SMarouene Boubakri 242fc5e0894SMarouene Boubakri /* Wrapping and sanity check */ 243fc5e0894SMarouene Boubakri if ((base + size) < base || base < pool->lo) 244fc5e0894SMarouene Boubakri return NULL; 245fc5e0894SMarouene Boubakri 246*fe8de805SJens Wiklander mm = malloc_flags(pool->flags, NULL, MALLOC_DEFAULT_ALIGNMENT, 247*fe8de805SJens Wiklander sizeof(tee_mm_entry_t)); 248fc5e0894SMarouene Boubakri if (!mm) 249fc5e0894SMarouene Boubakri return NULL; 250fc5e0894SMarouene Boubakri 251fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock); 252fc5e0894SMarouene Boubakri 253fc5e0894SMarouene Boubakri entry = pool->entry; 254fc5e0894SMarouene Boubakri offslo = (base - pool->lo) >> pool->shift; 255fc5e0894SMarouene Boubakri offshi = ((base - pool->lo + size - 1) >> pool->shift) + 1; 256fc5e0894SMarouene Boubakri 257fc5e0894SMarouene Boubakri /* find slot */ 258fc5e0894SMarouene Boubakri if (pool->flags & TEE_MM_POOL_HI_ALLOC) { 259fc5e0894SMarouene Boubakri while (entry->next != NULL && 260fc5e0894SMarouene Boubakri offshi < entry->next->offset + entry->next->size) 261fc5e0894SMarouene Boubakri entry = entry->next; 262fc5e0894SMarouene Boubakri } else { 263fc5e0894SMarouene Boubakri while (entry->next != NULL && offslo > entry->next->offset) 264fc5e0894SMarouene Boubakri entry = entry->next; 265fc5e0894SMarouene Boubakri } 266fc5e0894SMarouene Boubakri 267fc5e0894SMarouene Boubakri /* Check that memory is available */ 268fc5e0894SMarouene Boubakri if (!fit_in_gap(pool, entry, offslo, offshi)) 269fc5e0894SMarouene Boubakri goto err; 270fc5e0894SMarouene Boubakri 271fc5e0894SMarouene Boubakri tee_mm_add(entry, mm); 272fc5e0894SMarouene Boubakri 273fc5e0894SMarouene Boubakri mm->offset = offslo; 274fc5e0894SMarouene Boubakri mm->size = offshi - offslo; 275fc5e0894SMarouene Boubakri mm->pool = pool; 276fc5e0894SMarouene Boubakri 277fc5e0894SMarouene Boubakri update_max_allocated(pool); 278fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions); 279fc5e0894SMarouene Boubakri return mm; 280fc5e0894SMarouene Boubakri err: 281fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions); 282*fe8de805SJens Wiklander free_flags(pool->flags, mm); 283fc5e0894SMarouene Boubakri return NULL; 284fc5e0894SMarouene Boubakri } 285fc5e0894SMarouene Boubakri 286fc5e0894SMarouene Boubakri void tee_mm_free(tee_mm_entry_t *p) 287fc5e0894SMarouene Boubakri { 288fc5e0894SMarouene Boubakri tee_mm_entry_t *entry; 289fc5e0894SMarouene Boubakri uint32_t exceptions; 290fc5e0894SMarouene Boubakri 291fc5e0894SMarouene Boubakri if (!p || !p->pool) 292fc5e0894SMarouene Boubakri return; 293fc5e0894SMarouene Boubakri 294fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&p->pool->lock); 295fc5e0894SMarouene Boubakri entry = p->pool->entry; 296fc5e0894SMarouene Boubakri 297fc5e0894SMarouene Boubakri /* remove entry from list */ 298fc5e0894SMarouene Boubakri while (entry->next != NULL && entry->next != p) 299fc5e0894SMarouene Boubakri entry = entry->next; 300fc5e0894SMarouene Boubakri 301fc5e0894SMarouene Boubakri if (!entry->next) 302fc5e0894SMarouene Boubakri panic("invalid mm_entry"); 303fc5e0894SMarouene Boubakri 304fc5e0894SMarouene Boubakri entry->next = entry->next->next; 305fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&p->pool->lock, exceptions); 306fc5e0894SMarouene Boubakri 307*fe8de805SJens Wiklander free_flags(p->pool->flags, p); 308fc5e0894SMarouene Boubakri } 309fc5e0894SMarouene Boubakri 310fc5e0894SMarouene Boubakri size_t tee_mm_get_bytes(const tee_mm_entry_t *mm) 311fc5e0894SMarouene Boubakri { 312fc5e0894SMarouene Boubakri if (!mm || !mm->pool) 313fc5e0894SMarouene Boubakri return 0; 314fc5e0894SMarouene Boubakri else 315fc5e0894SMarouene Boubakri return mm->size << mm->pool->shift; 316fc5e0894SMarouene Boubakri } 317fc5e0894SMarouene Boubakri 318fc5e0894SMarouene Boubakri bool tee_mm_addr_is_within_range(const tee_mm_pool_t *pool, paddr_t addr) 319fc5e0894SMarouene Boubakri { 320fc5e0894SMarouene Boubakri return pool && addr >= pool->lo && 321fc5e0894SMarouene Boubakri addr <= (pool->lo + (pool->size - 1)); 322fc5e0894SMarouene Boubakri } 323fc5e0894SMarouene Boubakri 324fc5e0894SMarouene Boubakri bool tee_mm_is_empty(tee_mm_pool_t *pool) 325fc5e0894SMarouene Boubakri { 326fc5e0894SMarouene Boubakri bool ret; 327fc5e0894SMarouene Boubakri uint32_t exceptions; 328fc5e0894SMarouene Boubakri 329fc5e0894SMarouene Boubakri if (pool == NULL || pool->entry == NULL) 330fc5e0894SMarouene Boubakri return true; 331fc5e0894SMarouene Boubakri 332fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&pool->lock); 333fc5e0894SMarouene Boubakri ret = pool->entry == NULL || pool->entry->next == NULL; 334fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&pool->lock, exceptions); 335fc5e0894SMarouene Boubakri 336fc5e0894SMarouene Boubakri return ret; 337fc5e0894SMarouene Boubakri } 338fc5e0894SMarouene Boubakri 339fc5e0894SMarouene Boubakri tee_mm_entry_t *tee_mm_find(const tee_mm_pool_t *pool, paddr_t addr) 340fc5e0894SMarouene Boubakri { 341fc5e0894SMarouene Boubakri tee_mm_entry_t *entry = pool->entry; 342fc5e0894SMarouene Boubakri uint16_t offset = (addr - pool->lo) >> pool->shift; 343fc5e0894SMarouene Boubakri uint32_t exceptions; 344fc5e0894SMarouene Boubakri 345fc5e0894SMarouene Boubakri if (!tee_mm_addr_is_within_range(pool, addr)) 346fc5e0894SMarouene Boubakri return NULL; 347fc5e0894SMarouene Boubakri 348fc5e0894SMarouene Boubakri exceptions = cpu_spin_lock_xsave(&((tee_mm_pool_t *)pool)->lock); 349fc5e0894SMarouene Boubakri 350fc5e0894SMarouene Boubakri while (entry->next != NULL) { 351fc5e0894SMarouene Boubakri entry = entry->next; 352fc5e0894SMarouene Boubakri 353fc5e0894SMarouene Boubakri if ((offset >= entry->offset) && 354fc5e0894SMarouene Boubakri (offset < (entry->offset + entry->size))) { 355fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&((tee_mm_pool_t *)pool)->lock, 356fc5e0894SMarouene Boubakri exceptions); 357fc5e0894SMarouene Boubakri return entry; 358fc5e0894SMarouene Boubakri } 359fc5e0894SMarouene Boubakri } 360fc5e0894SMarouene Boubakri 361fc5e0894SMarouene Boubakri cpu_spin_unlock_xrestore(&((tee_mm_pool_t *)pool)->lock, exceptions); 362fc5e0894SMarouene Boubakri return NULL; 363fc5e0894SMarouene Boubakri } 364fc5e0894SMarouene Boubakri 365fc5e0894SMarouene Boubakri uintptr_t tee_mm_get_smem(const tee_mm_entry_t *mm) 366fc5e0894SMarouene Boubakri { 367fc5e0894SMarouene Boubakri return (mm->offset << mm->pool->shift) + mm->pool->lo; 368fc5e0894SMarouene Boubakri } 369