#ifndef _MMU_H_INCLUDE #define _MMU_H_INCLUDE #include #include #include #define KERNELSPACE_START (void *)0xffff800000000000 #define KERNELSPACE_END (void *)0xffffffffffffffff #define USERSPACE_START (void *)0x0000000000001000 #define USERSPACE_END (void *)0x0000800000000000 #define USERSPACE_MMAP_START (void *)0x0000100000000000 #define IS_USER_ADDRESS(a) ((void *)a < USERSPACE_END) #define PAGE_SIZE 4096 #define ARCH_MMU_FLAGS_READ (uint64_t)1 #define ARCH_MMU_FLAGS_WRITE (uint64_t)2 #define ARCH_MMU_FLAGS_USER (uint64_t)4 #define ARCH_MMU_FLAGS_NOEXEC ((uint64_t)1 << 63) #define ARCH_MMU_FLAGS_GLOBAL ((uint64_t)1 << 8) #define ARCH_MMU_FLAGS_WB 0 #define ARCH_MMU_FLAGS_WT (1 << 3) #define ARCH_MMU_FLAGS_UC (1 << 4) #define ARCH_MMU_FLAGS_WC ((1 << 7) | (1 << 3)) // PAT5 (limine sets up the 5th PAT entry as WC) #define PAGE_MASK 0xfffffffffffff000lu #define ARCH_MMU_REQUIRED_FLAGS ARCH_MMU_FLAGS_READ typedef uint64_t mmuflags_t; typedef uint64_t * pagetableptr_t; // physical address void arch_mmu_destroytable(pagetableptr_t table); bool arch_mmu_map(pagetableptr_t table, void *paddr, void *vaddr, mmuflags_t flags); void arch_mmu_unmap(pagetableptr_t table, void *vaddr); void arch_mmu_remap(pagetableptr_t table, void *paddr, void *vaddr, mmuflags_t flags); void arch_mmu_switch(pagetableptr_t table); void *arch_mmu_getphysical(pagetableptr_t table, void *vaddr); bool arch_mmu_ispresent(pagetableptr_t table, void *vaddr); bool arch_mmu_iswritable(pagetableptr_t table, void *vaddr); bool arch_mmu_isdirty(pagetableptr_t table, void *vaddr); pagetableptr_t arch_mmu_newtable(); void arch_mmu_init(); void arch_mmu_apswitch(); void arch_mmu_invalidate_range(void *page, size_t size); bool arch_mmu_getflags(pagetableptr_t table, void *vaddr, mmuflags_t *mmuflagsp); void x86_64_mmu_enable_global_pages(void); void x86_64_mmu_disable_global_pages(void); #endif