Skip to content

Commit

Permalink
core: pager: use tlbi_mva_asid() where applicable
Browse files Browse the repository at this point in the history
Instead of invalidating a virtual address for all ASIDs only target the
relevant ones. For kernel mode mappings all ASIDs still needs to be
targeted though.

Signed-off-by: Jens Wiklander <[email protected]>
  • Loading branch information
jenswi-linaro committed May 13, 2019
1 parent 5a76753 commit 20d9510
Showing 1 changed file with 22 additions and 6 deletions.
28 changes: 22 additions & 6 deletions core/arch/arm/mm/tee_pager.c
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,22 @@ static vaddr_t area_idx2va(struct tee_pager_area *area, size_t idx)
return (idx << SMALL_PAGE_SHIFT) + (area->base & ~CORE_MMU_PGDIR_MASK);
}

static void area_tlbi_entry(struct tee_pager_area *area, size_t idx)
{
vaddr_t va = area_idx2va(area, idx);

#if defined(CFG_PAGED_USER_TA)
assert(area->pgt);
if (area->pgt->ctx) {
uint32_t asid = to_user_ta_ctx(area->pgt->ctx)->vm_info->asid;

tlbi_mva_asid(va, asid);
return;
}
#endif
tlbi_mva_allasid(va);
}

static void pmem_unmap(struct tee_pager_pmem *pmem, struct pgt *only_this_pgt)
{
struct tee_pager_area *area = NULL;
Expand All @@ -431,7 +447,7 @@ static void pmem_unmap(struct tee_pager_pmem *pmem, struct pgt *only_this_pgt)
if (a & TEE_MATTR_VALID_BLOCK) {
area_set_entry(area, tblidx, 0, 0);
pgt_dec_used_entries(area->pgt);
tlbi_mva_allasid(area_idx2va(area, tblidx));
area_tlbi_entry(area, tblidx);
}
}
}
Expand Down Expand Up @@ -821,7 +837,7 @@ static void rem_area(struct tee_pager_area_head *area_head,
continue;

area_set_entry(area, idx, 0, 0);
tlbi_mva_allasid(area_idx2va(area, idx));
area_tlbi_entry(area, idx);
pgt_dec_used_entries(area->pgt);
}

Expand Down Expand Up @@ -921,7 +937,7 @@ bool tee_pager_set_uta_area_attr(struct user_ta_ctx *utc, vaddr_t base,
if (a == f)
continue;
area_set_entry(area, tblidx, 0, 0);
tlbi_mva_allasid(area_idx2va(area, tblidx));
area_tlbi_entry(area, tblidx);

pmem->flags &= ~PMEM_FLAG_HIDDEN;
if (pmem_is_dirty(pmem))
Expand Down Expand Up @@ -1190,7 +1206,7 @@ static bool pager_update_permissions(struct tee_pager_area *area,
pmem->flags |= PMEM_FLAG_DIRTY;
area_set_entry(area, pgidx, pa,
get_area_mattr(area->flags));
tlbi_mva_allasid(ai->va & ~SMALL_PAGE_MASK);
area_tlbi_entry(area, pgidx);
}

} else {
Expand Down Expand Up @@ -1361,7 +1377,7 @@ bool tee_pager_handle_fault(struct abort_info *ai)

/* Set a temporary read-only mapping */
area_set_entry(area, tblidx, pa, attr & ~mask);
tlbi_mva_allasid(page_va);
area_tlbi_entry(area, tblidx);

dcache_clean_range_pou(va, SMALL_PAGE_SIZE);
if (clean_user_cache)
Expand All @@ -1371,7 +1387,7 @@ bool tee_pager_handle_fault(struct abort_info *ai)

/* Set the final mapping */
area_set_entry(area, tblidx, pa, attr);
tlbi_mva_allasid(page_va);
area_tlbi_entry(area, tblidx);
} else {
area_set_entry(area, tblidx, pa, attr);
/*
Expand Down

0 comments on commit 20d9510

Please sign in to comment.