struct vmm_map_request {
struct page_table *pml4;
vaddr_t virt;
paddr_t phys;
size_t len;
page_flags_t page_flags;
enum vmm_flags vmm_flags;
enum vmm_map_page_size page_size;
bool is_unmap_internal;
};
enum vmm_map_page_size : uint8_t {
VMM_MAP_PAGE_SIZE_4KB,
VMM_MAP_PAGE_SIZE_2MB,
VMM_MAP_PAGE_SIZE_1GB,
};
enum vmm_flags : uint64_t {
VMM_FLAG_NONE = 0,
VMM_FLAG_NO_TLB_SHOOTDOWN = 1 << 0,
VMM_FLAG_USER = 1 << 1,
VMM_FLAG_MODIFY_LEAF = 1 << 2,
VMM_FLAG_CLEAR_LEAF = 1 << 3,
VMM_FLAG_HANDLE_PTE_EXISTING = 1 << 4,
};
void vmm_init(struct limine_memmap_response *memmap, struct limine_executable_address_response *xa);
enum errno vmm_map_page_full(struct vmm_map_request *rq);
void vmm_unmap_page_full(struct vmm_map_request *rq);
enum errno vmm_map_page_internal(vaddr_t virt, paddr_t phys, page_flags_t flags, enum vmm_flags vflags, enum vmm_map_page_size size);
enum errno vmm_map_page_user_internal(struct page_table *pml4, vaddr_t virt, paddr_t phys, page_flags_t flags, enum vmm_flags vflags, enum vmm_map_page_size size);
void vmm_unmap_page_internal(vaddr_t virt, enum vmm_flags vflags, enum vmm_map_page_size size);
enum errno vmm_mark_demand_page_internal(vaddr_t virt, enum demand_page_flags flags, enum vmm_map_page_size size);
enum errno vmm_mark_demand_page_user_internal(struct page_table *pml4, vaddr_t virt, enum demand_page_flags flags, enum vmm_map_page_size size);
enum errno vmm_map_demand_page_internal(vaddr_t virt, paddr_t phys, enum demand_page_flags flags, enum vmm_map_page_size size);
paddr_t vmm_get_phys_internal(vaddr_t virt, enum vmm_flags flags);
pte_t vmm_get_leaf_pte_internal(vaddr_t virt, enum vmm_flags flags);
void vmm_unmap(void *addr, uint64_t len, enum vmm_flags vflags);
void * vmm_map(paddr_t paddr, vaddr_t vaddr, uint64_t len, uint64_t flags, enum vmm_flags vflags);
void * vmm_map_bump_internal(uint64_t addr, uint64_t len, uint64_t flags, enum vmm_flags vflags);
void vmm_unmap_virt(void *addr, uint64_t len, enum vmm_flags vflags);
uintptr_t vmm_make_user_pml4(void);
void vmm_unmap_all_user_pages(struct page_table *pml4, enum vmm_flags vflags);
void vmm_reclaim_page_tables(void);
struct page_table * vmm_phys_to_pml4(paddr_t paddr);