1 #ifndef __LUNAIX_ARCH_TLB_H
2 #define __LUNAIX_ARCH_TLB_H
4 #include <lunaix/compiler.h>
5 #include <lunaix/mm/procvm.h>
6 #include <lunaix/mm/physical.h>
9 * @brief Invalidate an entry of all address space
13 static inline void must_inline
14 __tlb_invalidate(ptr_t va)
16 asm volatile("invlpg (%0)" ::"r"(va) : "memory");
20 * @brief Invalidate an entry of an address space indetified
25 static inline void must_inline
26 __tlb_flush_asid(unsigned int asid, ptr_t va)
28 // not supported on x86_32
29 asm volatile("invlpg (%0)" ::"r"(va) : "memory");
33 * @brief Invalidate an entry of global address space
37 static inline void must_inline
38 __tlb_flush_global(ptr_t va)
40 // not supported on x86_32
41 asm volatile("invlpg (%0)" ::"r"(va) : "memory");
45 * @brief Invalidate an entire TLB
49 static inline void must_inline
60 * @brief Invalidate an entire address space
64 static inline void must_inline
65 __tlb_flush_asid_all(unsigned int asid)
67 // not supported on x86_32
73 * @brief Invalidate entries of all address spaces
80 tlb_flush_range(ptr_t addr, unsigned int npages)
82 for (unsigned int i = 0; i < npages; i++)
84 __tlb_invalidate(addr + i * PAGE_SIZE);
89 * @brief Invalidate entries of an address space identified
97 tlb_flush_asid_range(unsigned int asid, ptr_t addr, unsigned int npages)
99 for (unsigned int i = 0; i < npages; i++)
101 __tlb_flush_asid(asid, addr + i * PAGE_SIZE);
106 * @brief Invalidate an entry of kernel address spaces
113 tlb_flush_kernel(ptr_t addr)
115 __tlb_flush_global(addr);
119 * @brief Invalidate entries of kernel address spaces
126 tlb_flush_kernel_ranged(ptr_t addr, unsigned int npages)
128 for (unsigned int i = 0; i < npages; i++)
130 tlb_flush_kernel(addr + i * PAGE_SIZE);
135 * @brief Invalidate an entry within a process memory space
142 tlb_flush_mm(struct proc_mm* mm, ptr_t addr);
145 * @brief Invalidate entries within a process memory space
152 tlb_flush_mm_range(struct proc_mm* mm, ptr_t addr, unsigned int npages);
155 * @brief Invalidate an entry within a vm region
162 tlb_flush_vmr(struct mm_region* vmr, ptr_t va);
165 * @brief Invalidate all entries within a vm region
172 tlb_flush_vmr_all(struct mm_region* vmr);
175 * @brief Invalidate entries within a vm region
182 tlb_flush_vmr_range(struct mm_region* vmr, ptr_t addr, unsigned int npages);
184 #endif /* __LUNAIX_VMTLB_H */