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