1c865f654SCornelia Huck #ifndef _X86_VM_H_ 2c865f654SCornelia Huck #define _X86_VM_H_ 37d36db35SAvi Kivity 47d36db35SAvi Kivity #include "processor.h" 53e394a58SAlexander Gordeev #include "asm/page.h" 655601383SAlexander Gordeev #include "asm/io.h" 77d36db35SAvi Kivity 87db17e21SThomas Huth void setup_5level_page_table(void); 97d36db35SAvi Kivity 101df80b57SPeter Feiner struct pte_search { 111df80b57SPeter Feiner int level; 124363f1d9SPaolo Bonzini pteval_t *pte; 131df80b57SPeter Feiner }; 141df80b57SPeter Feiner 151df80b57SPeter Feiner static inline bool found_huge_pte(struct pte_search search) 161df80b57SPeter Feiner { 171df80b57SPeter Feiner return (search.level == 2 || search.level == 3) && 181df80b57SPeter Feiner (*search.pte & PT_PRESENT_MASK) && 191df80b57SPeter Feiner (*search.pte & PT_PAGE_SIZE_MASK); 201df80b57SPeter Feiner } 211df80b57SPeter Feiner 221df80b57SPeter Feiner static inline bool found_leaf_pte(struct pte_search search) 231df80b57SPeter Feiner { 241df80b57SPeter Feiner return search.level == 1 || found_huge_pte(search); 251df80b57SPeter Feiner } 261df80b57SPeter Feiner 274363f1d9SPaolo Bonzini struct pte_search find_pte_level(pgd_t *cr3, void *virt, 281df80b57SPeter Feiner int lowest_level); 294363f1d9SPaolo Bonzini pteval_t *get_pte(pgd_t *cr3, void *virt); 304363f1d9SPaolo Bonzini pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level); 314363f1d9SPaolo Bonzini pteval_t *install_pte(pgd_t *cr3, 327d36db35SAvi Kivity int pte_level, 337d36db35SAvi Kivity void *virt, 344363f1d9SPaolo Bonzini pteval_t pte, 354363f1d9SPaolo Bonzini pteval_t *pt_page); 367d36db35SAvi Kivity 374363f1d9SPaolo Bonzini pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt); 384363f1d9SPaolo Bonzini void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt); 394363f1d9SPaolo Bonzini bool any_present_pages(pgd_t *cr3, void *virt, size_t len); 407d36db35SAvi Kivity 411df80b57SPeter Feiner static inline void *current_page_table(void) 421df80b57SPeter Feiner { 431df80b57SPeter Feiner return phys_to_virt(read_cr3()); 441df80b57SPeter Feiner } 455868743aSMarc Orr 465868743aSMarc Orr void split_large_page(unsigned long *ptep, int level); 475868743aSMarc Orr void force_4k_page(void *addr); 4848f67910SCathy Avery 4948f67910SCathy Avery struct vm_vcpu_info { 5048f67910SCathy Avery u64 cr3; 5148f67910SCathy Avery u64 cr4; 5248f67910SCathy Avery u64 cr0; 5348f67910SCathy Avery }; 5448f67910SCathy Avery 55*f3e081d7SAaron Lewis typedef void (*pte_callback_t)(struct pte_search search, void *va); 56*f3e081d7SAaron Lewis void walk_pte(void *virt, size_t len, pte_callback_t callback); 57*f3e081d7SAaron Lewis 587d36db35SAvi Kivity #endif 59