1 #ifndef VM_H 2 #define VM_H 3 4 #include "processor.h" 5 #include "asm/page.h" 6 #include "asm/io.h" 7 8 void setup_5level_page_table(); 9 10 void *vmalloc(unsigned long size); 11 void vfree(void *mem); 12 void *vmap(unsigned long long phys, unsigned long size); 13 uint64_t virt_to_phys_cr3(void *mem); 14 15 struct pte_search { 16 int level; 17 pteval_t *pte; 18 }; 19 20 static inline bool found_huge_pte(struct pte_search search) 21 { 22 return (search.level == 2 || search.level == 3) && 23 (*search.pte & PT_PRESENT_MASK) && 24 (*search.pte & PT_PAGE_SIZE_MASK); 25 } 26 27 static inline bool found_leaf_pte(struct pte_search search) 28 { 29 return search.level == 1 || found_huge_pte(search); 30 } 31 32 struct pte_search find_pte_level(pgd_t *cr3, void *virt, 33 int lowest_level); 34 pteval_t *get_pte(pgd_t *cr3, void *virt); 35 pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level); 36 pteval_t *install_pte(pgd_t *cr3, 37 int pte_level, 38 void *virt, 39 pteval_t pte, 40 pteval_t *pt_page); 41 42 pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt); 43 pteval_t *install_page(pgd_t *cr3, phys_addr_t phys, void *virt); 44 void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt); 45 bool any_present_pages(pgd_t *cr3, void *virt, size_t len); 46 47 static inline void *current_page_table(void) 48 { 49 return phys_to_virt(read_cr3()); 50 } 51 #endif 52