11690d39d4f6153fe1f3104ce4b15b6ea7150c37
[lunaix-os.git] / lunaix-os / arch / aarch64 / includes / asm / tlb.h
1 #ifndef __LUNAIX_ARCH_TLB_H
2 #define __LUNAIX_ARCH_TLB_H
3
4 #include <lunaix/types.h>
5
6 #include <asm/aa64_mmu.h>
7 #include <asm/aa64_sysinst.h>
8
9 #define pack_va(asid, ttl, va)                \
10         (((asid & 0xffff) << 48)            | \
11          ((ttl  & 0b1111) << 44)            | \
12          (pfn(va) & ((1 << 44) - 1)))
13
14 #define pack_rva(asid, ttl, base, n, scale)   \
15         (((asid    & 0xffff) << 48)         | \
16          ((_MMU_TG & 0b11) << 46)           | \
17          ((n       & 0x1f) << 39)           | \
18          ((scale   & 0b11) << 37)           | \
19          ((ttl     & 0b1111) << 44)         | \
20          (pfn(base)& ((1 << 37) - 1)))
21
22 /**
23  * @brief Invalidate an entry of all address space
24  * 
25  * @param va 
26  */
27 static inline void must_inline
28 __tlb_invalidate(ptr_t va) 
29 {
30     sys_a1(tlbi_vaae1, pack_va(0, 0, va));
31 }
32
33 /**
34  * @brief Invalidate an entry of an address space indetified
35  *        by ASID
36  * 
37  * @param va 
38  */
39 static inline void must_inline
40 __tlb_flush_asid(unsigned int asid, ptr_t va) 
41 {
42     sys_a1(tlbi_vae1, pack_va(asid, 0, va));
43 }
44
45 /**
46  * @brief Invalidate an entry of global address space
47  * 
48  * @param va 
49  */
50 static inline void must_inline
51 __tlb_flush_global(ptr_t va) 
52 {
53     __tlb_flush_asid(0, va);
54 }
55
56 /**
57  * @brief Invalidate an entire TLB
58  * 
59  * @param va 
60  */
61 static inline void must_inline
62 __tlb_flush_all() 
63 {
64     sys_a0(tlbi_alle1);
65 }
66
67 /**
68  * @brief Invalidate an entire address space
69  * 
70  * @param va 
71  */
72 static inline void must_inline
73 __tlb_flush_asid_all(unsigned int asid) 
74 {
75     sys_a1(tlbi_aside1, pack_va(asid, 0, 0));
76 }
77
78
79 /**
80  * @brief Invalidate entries of all address spaces
81  * 
82  * @param asid 
83  * @param addr 
84  * @param npages 
85  */
86 static inline void 
87 tlb_flush_range(ptr_t addr, unsigned int npages)
88 {
89 #ifdef _MMU_USE_OA52
90     for (unsigned int i = 0; i < npages; i++)
91     {
92         __tlb_invalidate(addr + i * PAGE_SIZE);
93     }
94 #else
95     sys_a1(tlbi_rvaae1, pack_rva(0, 0, addr, npages, 0));
96 #endif
97 }
98
99 /**
100  * @brief Invalidate entries of an address space identified
101  *        by ASID
102  * 
103  * @param asid 
104  * @param addr 
105  * @param npages 
106  */
107 static inline void 
108 tlb_flush_asid_range(unsigned int asid, ptr_t addr, unsigned int npages)
109 {
110 #ifdef _MMU_USE_OA52
111     for (unsigned int i = 0; i < npages; i++)
112     {
113         __tlb_flush_asid(asid, addr + i * PAGE_SIZE);
114     }
115 #else
116     sys_a1(tlbi_rvae1, pack_rva(asid, 0, addr, npages, 0));
117 #endif
118 }
119
120 #include <asm-generic/tlb-shared.h>
121
122 #endif /* __LUNAIX_VMTLB_H */