diff --git a/core/arch/arm/mm/tee_pager.c b/core/arch/arm/mm/tee_pager.c index 1990d3015e9..09ba22633db 100644 --- a/core/arch/arm/mm/tee_pager.c +++ b/core/arch/arm/mm/tee_pager.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -950,7 +951,7 @@ bool tee_pager_set_uta_area_attr(struct user_ta_ctx *utc, vaddr_t base, cache_op_inner(DCACHE_AREA_CLEAN, va, SMALL_PAGE_SIZE); - cache_op_inner(ICACHE_INVALIDATE, NULL, 0); + icache_inv_user_range(va, SMALL_PAGE_SIZE); } } @@ -1250,6 +1251,7 @@ bool tee_pager_handle_fault(struct abort_info *ai) vaddr_t page_va = ai->va & ~SMALL_PAGE_MASK; uint32_t exceptions; bool ret; + bool clean_user_cache = false; #ifdef TEE_PAGER_DEBUG_PRINT abort_print(ai); @@ -1273,11 +1275,13 @@ bool tee_pager_handle_fault(struct abort_info *ai) /* check if the access is valid */ if (abort_is_user_exception(ai)) { area = find_uta_area(ai->va); - + clean_user_cache = true; } else { area = find_area(&tee_pager_area_head, ai->va); - if (!area) + if (!area) { area = find_uta_area(ai->va); + clean_user_cache = true; + } } if (!area || !area->pgt) { ret = false; @@ -1365,7 +1369,12 @@ bool tee_pager_handle_fault(struct abort_info *ai) */ cache_op_inner(DCACHE_AREA_CLEAN, (void *)page_va, SMALL_PAGE_SIZE); - cache_op_inner(ICACHE_INVALIDATE, NULL, 0); + if (clean_user_cache) + icache_inv_user_range((void *)page_va, + SMALL_PAGE_SIZE); + else + icache_inv_range((void *)page_va, + SMALL_PAGE_SIZE); /* Set the final mapping */ area_set_entry(area, tblidx, pa, attr);