X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/76175f34b86c84044cd2b944a581575ade056f7b..9b840d9c5c0db5e621e475dc8414edd98497ed36:/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 index 0000000..11690d3 --- /dev/null +++ b/lunaix-os/arch/aarch64/includes/asm/tlb.h @@ -0,0 +1,122 @@ +#ifndef __LUNAIX_ARCH_TLB_H +#define __LUNAIX_ARCH_TLB_H + +#include + +#include +#include + +#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 + +#endif /* __LUNAIX_VMTLB_H */