17d36db35SAvi Kivity #ifndef VM_H 27d36db35SAvi Kivity #define VM_H 37d36db35SAvi Kivity 47d36db35SAvi Kivity #include "processor.h" 53e394a58SAlexander Gordeev #include "asm/page.h" 655601383SAlexander Gordeev #include "asm/io.h" 77d36db35SAvi Kivity 8af928b22SYu Zhang void setup_5level_page_table(); 97d36db35SAvi Kivity 107d36db35SAvi Kivity void *vmalloc(unsigned long size); 117d36db35SAvi Kivity void vfree(void *mem); 127d36db35SAvi Kivity void *vmap(unsigned long long phys, unsigned long size); 13334cd2bfSGleb Natapov uint64_t virt_to_phys_cr3(void *mem); 147d36db35SAvi Kivity 151df80b57SPeter Feiner struct pte_search { 161df80b57SPeter Feiner int level; 17*4363f1d9SPaolo Bonzini pteval_t *pte; 181df80b57SPeter Feiner }; 191df80b57SPeter Feiner 201df80b57SPeter Feiner static inline bool found_huge_pte(struct pte_search search) 211df80b57SPeter Feiner { 221df80b57SPeter Feiner return (search.level == 2 || search.level == 3) && 231df80b57SPeter Feiner (*search.pte & PT_PRESENT_MASK) && 241df80b57SPeter Feiner (*search.pte & PT_PAGE_SIZE_MASK); 251df80b57SPeter Feiner } 261df80b57SPeter Feiner 271df80b57SPeter Feiner static inline bool found_leaf_pte(struct pte_search search) 281df80b57SPeter Feiner { 291df80b57SPeter Feiner return search.level == 1 || found_huge_pte(search); 301df80b57SPeter Feiner } 311df80b57SPeter Feiner 32*4363f1d9SPaolo Bonzini struct pte_search find_pte_level(pgd_t *cr3, void *virt, 331df80b57SPeter Feiner int lowest_level); 34*4363f1d9SPaolo Bonzini pteval_t *get_pte(pgd_t *cr3, void *virt); 35*4363f1d9SPaolo Bonzini pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level); 36*4363f1d9SPaolo Bonzini pteval_t *install_pte(pgd_t *cr3, 377d36db35SAvi Kivity int pte_level, 387d36db35SAvi Kivity void *virt, 39*4363f1d9SPaolo Bonzini pteval_t pte, 40*4363f1d9SPaolo Bonzini pteval_t *pt_page); 417d36db35SAvi Kivity 42*4363f1d9SPaolo Bonzini pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt); 43*4363f1d9SPaolo Bonzini pteval_t *install_page(pgd_t *cr3, phys_addr_t phys, void *virt); 44*4363f1d9SPaolo Bonzini void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt); 45*4363f1d9SPaolo Bonzini bool any_present_pages(pgd_t *cr3, void *virt, size_t len); 467d36db35SAvi Kivity 471df80b57SPeter Feiner static inline void *current_page_table(void) 481df80b57SPeter Feiner { 491df80b57SPeter Feiner return phys_to_virt(read_cr3()); 501df80b57SPeter Feiner } 517d36db35SAvi Kivity #endif 52