1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _ASM_RISCV_TLBFLUSH_H
16#define _ASM_RISCV_TLBFLUSH_H
17
18#include <linux/mm_types.h>
19
20
21
22
23
24static inline void local_flush_tlb_all(void)
25{
26 __asm__ __volatile__ ("sfence.vma" : : : "memory");
27}
28
29
30static inline void local_flush_tlb_page(unsigned long addr)
31{
32 __asm__ __volatile__ ("sfence.vma %0" : : "r" (addr) : "memory");
33}
34
35#ifndef CONFIG_SMP
36
37#define flush_tlb_all() local_flush_tlb_all()
38#define flush_tlb_page(vma, addr) local_flush_tlb_page(addr)
39
40static inline void flush_tlb_range(struct vm_area_struct *vma,
41 unsigned long start, unsigned long end)
42{
43 local_flush_tlb_all();
44}
45
46#define flush_tlb_mm(mm) flush_tlb_all()
47
48#else
49
50#include <asm/sbi.h>
51
52#define flush_tlb_all() sbi_remote_sfence_vma(NULL, 0, -1)
53#define flush_tlb_page(vma, addr) flush_tlb_range(vma, addr, 0)
54#define flush_tlb_range(vma, start, end) \
55 sbi_remote_sfence_vma(mm_cpumask((vma)->vm_mm)->bits, \
56 start, (end) - (start))
57#define flush_tlb_mm(mm) \
58 sbi_remote_sfence_vma(mm_cpumask(mm)->bits, 0, -1)
59
60#endif
61
62
63static inline void flush_tlb_kernel_range(unsigned long start,
64 unsigned long end)
65{
66 flush_tlb_all();
67}
68
69#endif
70