Skip to content

Commit

Permalink
arm64: Add tlbi_user_level TLB invalidation helper
Browse files Browse the repository at this point in the history
Add a level-hinted parameter to __tlbi_user, which only gets used
if ARMv8.4-TTL gets detected.

ARMv8.4-TTL provides the TTL field in tlbi instruction to indicate
the level of translation table walk holding the leaf entry for the
address that is being invalidated.

This patch set the default level value of flush_tlb_range() to 0,
which will be updated in future patches.  And set the ttl value of
flush_tlb_page_nosync() to 3 because it is only called to flush a
single pte page.

Signed-off-by: Zhenyu Ye <yezhenyu2@huawei.com>
Link: https://lore.kernel.org/r/20200625080314.230-4-yezhenyu2@huawei.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
  • Loading branch information
Zhenyu Ye authored and Catalin Marinas committed Jul 7, 2020
1 parent c10bc62 commit e735b98
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions arch/arm64/include/asm/tlbflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@
__tlbi(op, arg); \
} while(0)

#define __tlbi_user_level(op, arg, level) do { \
if (arm64_kernel_unmapped_at_el0()) \
__tlbi_level(op, (arg | USER_ASID_FLAG), level); \
} while (0)

/*
* TLB Invalidation
* ================
Expand Down Expand Up @@ -205,8 +210,9 @@ static inline void flush_tlb_page_nosync(struct vm_area_struct *vma,
unsigned long addr = __TLBI_VADDR(uaddr, ASID(vma->vm_mm));

dsb(ishst);
__tlbi(vale1is, addr);
__tlbi_user(vale1is, addr);
/* This function is only called on a small page */
__tlbi_level(vale1is, addr, 3);
__tlbi_user_level(vale1is, addr, 3);
}

static inline void flush_tlb_page(struct vm_area_struct *vma,
Expand Down Expand Up @@ -246,11 +252,11 @@ static inline void __flush_tlb_range(struct vm_area_struct *vma,
dsb(ishst);
for (addr = start; addr < end; addr += stride) {
if (last_level) {
__tlbi(vale1is, addr);
__tlbi_user(vale1is, addr);
__tlbi_level(vale1is, addr, 0);
__tlbi_user_level(vale1is, addr, 0);
} else {
__tlbi(vae1is, addr);
__tlbi_user(vae1is, addr);
__tlbi_level(vae1is, addr, 0);
__tlbi_user_level(vae1is, addr, 0);
}
}
dsb(ish);
Expand Down

0 comments on commit e735b98

Please sign in to comment.