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 to 0.

Signed-off-by: Zhenyu Ye <yezhen...@huawei.com>
---
 arch/arm64/include/asm/tlbflush.h | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/include/asm/tlbflush.h 
b/arch/arm64/include/asm/tlbflush.h
index 8adbd6fd8489..969dcf88e2a9 100644
--- a/arch/arm64/include/asm/tlbflush.h
+++ b/arch/arm64/include/asm/tlbflush.h
@@ -88,6 +88,12 @@
        __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
  *     ================
@@ -230,11 +236,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);
-- 
2.19.1


Reply via email to