#pragma once #include #ifdef ARCH_X86_64 #include "arch/x86_64/MMU.h" #else #error "Unknown architecture." #endif constexpr u64 PAGES_PER_HUGE_PAGE = ARCH_HUGE_PAGE_SIZE / ARCH_PAGE_SIZE; namespace MMU { enum Flags { None = 0, ReadWrite = 1, User = 2, NoExecute = 4, WriteThrough = 8, CacheDisable = 16, }; enum class UseHugePages { No = 0, Yes = 1 }; u64 translate_physical_address(u64 phys); Result map(u64 virt, u64 phys, int flags, UseHugePages use_huge_pages); Result unmap(u64 virt); Result get_physical(u64 virt); Result get_flags(u64 virt); Result remap(u64 virt, int flags); void switch_page_directory(PageDirectory* dir); PageDirectory* get_page_directory(); void flush_all(); Result create_page_directory_for_userspace(); Result delete_userspace_page_directory(PageDirectory* directory); Result clone_userspace_page_directory(PageDirectory* directory); void setup_initial_page_directory(); PageDirectory* kernel_page_directory(); }