add asm headers and linker scripts for aarch64
[lunaix-os.git] / lunaix-os / arch / aarch64 / includes / asm / tlb.h
diff --git a/lunaix-os/arch/aarch64/includes/asm/tlb.h b/lunaix-os/arch/aarch64/includes/asm/tlb.h
new file mode 100644 (file)
index 0000000..11690d3
--- /dev/null
@@ -0,0 +1,122 @@
+#ifndef __LUNAIX_ARCH_TLB_H
+#define __LUNAIX_ARCH_TLB_H
+
+#include <lunaix/types.h>
+
+#include <asm/aa64_mmu.h>
+#include <asm/aa64_sysinst.h>
+
+#define pack_va(asid, ttl, va)                \
+        (((asid & 0xffff) << 48)            | \
+         ((ttl  & 0b1111) << 44)            | \
+         (pfn(va) & ((1 << 44) - 1)))
+
+#define pack_rva(asid, ttl, base, n, scale)   \
+        (((asid    & 0xffff) << 48)         | \
+         ((_MMU_TG & 0b11) << 46)           | \
+         ((n       & 0x1f) << 39)           | \
+         ((scale   & 0b11) << 37)           | \
+         ((ttl     & 0b1111) << 44)         | \
+         (pfn(base)& ((1 << 37) - 1)))
+
+/**
+ * @brief Invalidate an entry of all address space
+ * 
+ * @param va 
+ */
+static inline void must_inline
+__tlb_invalidate(ptr_t va) 
+{
+    sys_a1(tlbi_vaae1, pack_va(0, 0, va));
+}
+
+/**
+ * @brief Invalidate an entry of an address space indetified
+ *        by ASID
+ * 
+ * @param va 
+ */
+static inline void must_inline
+__tlb_flush_asid(unsigned int asid, ptr_t va) 
+{
+    sys_a1(tlbi_vae1, pack_va(asid, 0, va));
+}
+
+/**
+ * @brief Invalidate an entry of global address space
+ * 
+ * @param va 
+ */
+static inline void must_inline
+__tlb_flush_global(ptr_t va) 
+{
+    __tlb_flush_asid(0, va);
+}
+
+/**
+ * @brief Invalidate an entire TLB
+ * 
+ * @param va 
+ */
+static inline void must_inline
+__tlb_flush_all() 
+{
+    sys_a0(tlbi_alle1);
+}
+
+/**
+ * @brief Invalidate an entire address space
+ * 
+ * @param va 
+ */
+static inline void must_inline
+__tlb_flush_asid_all(unsigned int asid) 
+{
+    sys_a1(tlbi_aside1, pack_va(asid, 0, 0));
+}
+
+
+/**
+ * @brief Invalidate entries of all address spaces
+ * 
+ * @param asid 
+ * @param addr 
+ * @param npages 
+ */
+static inline void 
+tlb_flush_range(ptr_t addr, unsigned int npages)
+{
+#ifdef _MMU_USE_OA52
+    for (unsigned int i = 0; i < npages; i++)
+    {
+        __tlb_invalidate(addr + i * PAGE_SIZE);
+    }
+#else
+    sys_a1(tlbi_rvaae1, pack_rva(0, 0, addr, npages, 0));
+#endif
+}
+
+/**
+ * @brief Invalidate entries of an address space identified
+ *        by ASID
+ * 
+ * @param asid 
+ * @param addr 
+ * @param npages 
+ */
+static inline void 
+tlb_flush_asid_range(unsigned int asid, ptr_t addr, unsigned int npages)
+{
+#ifdef _MMU_USE_OA52
+    for (unsigned int i = 0; i < npages; i++)
+    {
+        __tlb_flush_asid(asid, addr + i * PAGE_SIZE);
+    }
+#else
+    sys_a1(tlbi_rvae1, pack_rva(asid, 0, addr, npages, 0));
+#endif
+}
+
+#include <asm-generic/tlb-shared.h>
+
+#endif /* __LUNAIX_VMTLB_H */