Skip to content

Virtual memory management

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);