uint32_t tee_mmu_user_get_cache_attr(struct tee_ta_ctx *ctx, void *va) { TEE_Result res; paddr_t pa; uint32_t attr; res = tee_mmu_user_va2pa_attr(ctx, va, &pa, &attr); assert(res == TEE_SUCCESS); return mattr_to_teesmc_cache_attr(attr); }
uint32_t tee_mmu_user_get_cache_attr(struct user_ta_ctx *utc, void *va) { TEE_Result res; paddr_t pa; uint32_t attr; res = tee_mmu_user_va2pa_attr(utc, va, &pa, &attr); assert(res == TEE_SUCCESS); return (attr >> TEE_MATTR_CACHE_SHIFT) & TEE_MATTR_CACHE_MASK; }
TEE_Result tee_mmu_check_access_rights(const struct tee_ta_ctx *ctx, uint32_t flags, tee_uaddr_t uaddr, size_t len) { tee_uaddr_t a; size_t addr_incr = MIN(CORE_MMU_USER_CODE_SIZE, CORE_MMU_USER_PARAM_SIZE); /* Address wrap */ if ((uaddr + len) < uaddr) return TEE_ERROR_ACCESS_DENIED; for (a = uaddr; a < (uaddr + len); a += addr_incr) { paddr_t pa; uint32_t attr; TEE_Result res; res = tee_mmu_user_va2pa_attr(ctx, (void *)a, &pa, &attr); if (res != TEE_SUCCESS) return res; if (!(flags & TEE_MEMORY_ACCESS_ANY_OWNER)) { /* * Strict check that no one else (wich equal or * less trust) may can access this memory. * * Parameters are shared with normal world if they * aren't in secure DDR. * * If the parameters are in secure DDR it's because one * TA is invoking another TA and in that case there's * new memory allocated privately for the paramters to * this TA. * * If we do this check for an address on TA * internal memory it's harmless as it will always * be in secure DDR. */ if (!tee_mm_addr_is_within_range(&tee_mm_sec_ddr, pa)) return TEE_ERROR_ACCESS_DENIED; } if ((flags & TEE_MEMORY_ACCESS_WRITE) && !(attr & TEE_MATTR_UW)) return TEE_ERROR_ACCESS_DENIED; if ((flags & TEE_MEMORY_ACCESS_READ) && !(attr & TEE_MATTR_UR)) return TEE_ERROR_ACCESS_DENIED; } return TEE_SUCCESS; }
TEE_Result tee_mmu_user_va2pa_helper(const struct tee_ta_ctx *ctx, void *ua, paddr_t *pa) { return tee_mmu_user_va2pa_attr(ctx, ua, pa, NULL); }