aa64: finalise context switch, page fault handler and syscall
[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 & 0xffffUL) << 48)            | \
11          ((ttl  & 0b1111UL) << 44)            | \
12          (pfn(va) & ((1UL << 44) - 1)))
13
14 #define pack_rva(asid, ttl, base, n, scale)   \
15         (((asid    & 0xffffUL) << 48)         | \
16          ((_MMU_TG & 0b11UL) << 46)           | \
17          ((n       & 0x1fUL) << 39)           | \
18          ((scale   & 0b11UL) << 37)           | \
19          ((ttl     & 0b1111UL) << 44)         | \
20          (pfn(base)& ((1UL << 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     data_barrier;
32 }
33
34 /**
35  * @brief Invalidate an entry of an address space indetified
36  *        by ASID
37  * 
38  * @param va 
39  */
40 static inline void must_inline
41 __tlb_flush_asid(unsigned int asid, ptr_t va) 
42 {
43     sys_a1(tlbi_vae1, pack_va(asid, 0, va));
44     data_barrier;
45 }
46
47 /**
48  * @brief Invalidate an entry of global address space
49  * 
50  * @param va 
51  */
52 static inline void must_inline
53 __tlb_flush_global(ptr_t va) 
54 {
55     __tlb_flush_asid(0, va);
56 }
57
58 /**
59  * @brief Invalidate an entire TLB
60  * 
61  * @param va 
62  */
63 static inline void must_inline
64 __tlb_flush_all() 
65 {
66     sys_a0(tlbi_alle1);
67     data_barrier;
68 }
69
70 /**
71  * @brief Invalidate an entire address space
72  * 
73  * @param va 
74  */
75 static inline void must_inline
76 __tlb_flush_asid_all(unsigned int asid) 
77 {
78     sys_a1(tlbi_aside1, pack_va(asid, 0, 0));
79     data_barrier;
80 }
81
82
83 /**
84  * @brief Invalidate entries of all address spaces
85  * 
86  * @param asid 
87  * @param addr 
88  * @param npages 
89  */
90 static inline void 
91 tlb_flush_range(ptr_t addr, unsigned int npages)
92 {
93 #ifdef _MMU_USE_OA52
94     for (unsigned int i = 0; i < npages; i++)
95     {
96         __tlb_invalidate(addr + i * PAGE_SIZE);
97     }
98 #else
99     sys_a1(tlbi_rvaae1, pack_rva(0, 0, addr, npages, 0));
100     data_barrier;
101 #endif
102 }
103
104 /**
105  * @brief Invalidate entries of an address space identified
106  *        by ASID
107  * 
108  * @param asid 
109  * @param addr 
110  * @param npages 
111  */
112 static inline void 
113 tlb_flush_asid_range(unsigned int asid, ptr_t addr, unsigned int npages)
114 {
115 #ifdef _MMU_USE_OA52
116     for (unsigned int i = 0; i < npages; i++)
117     {
118         __tlb_flush_asid(asid, addr + i * PAGE_SIZE);
119     }
120 #else
121     sys_a1(tlbi_rvae1, pack_rva(asid, 0, addr, npages, 0));
122     data_barrier;
123 #endif
124 }
125
126 #include <asm-generic/tlb-shared.h>
127
128 #endif /* __LUNAIX_VMTLB_H */