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" 7*c85124d2SManali Shukla #include "asm/bitops.h" 87d36db35SAvi Kivity 97db17e21SThomas Huth void setup_5level_page_table(void); 107d36db35SAvi Kivity 111df80b57SPeter Feiner struct pte_search { 121df80b57SPeter Feiner int level; 134363f1d9SPaolo Bonzini pteval_t *pte; 141df80b57SPeter Feiner }; 151df80b57SPeter Feiner 161df80b57SPeter Feiner static inline bool found_huge_pte(struct pte_search search) 171df80b57SPeter Feiner { 181df80b57SPeter Feiner return (search.level == 2 || search.level == 3) && 191df80b57SPeter Feiner (*search.pte & PT_PRESENT_MASK) && 201df80b57SPeter Feiner (*search.pte & PT_PAGE_SIZE_MASK); 211df80b57SPeter Feiner } 221df80b57SPeter Feiner 231df80b57SPeter Feiner static inline bool found_leaf_pte(struct pte_search search) 241df80b57SPeter Feiner { 251df80b57SPeter Feiner return search.level == 1 || found_huge_pte(search); 261df80b57SPeter Feiner } 271df80b57SPeter Feiner 284363f1d9SPaolo Bonzini struct pte_search find_pte_level(pgd_t *cr3, void *virt, 291df80b57SPeter Feiner int lowest_level); 304363f1d9SPaolo Bonzini pteval_t *get_pte(pgd_t *cr3, void *virt); 314363f1d9SPaolo Bonzini pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level); 324363f1d9SPaolo Bonzini pteval_t *install_pte(pgd_t *cr3, 337d36db35SAvi Kivity int pte_level, 347d36db35SAvi Kivity void *virt, 354363f1d9SPaolo Bonzini pteval_t pte, 364363f1d9SPaolo Bonzini pteval_t *pt_page); 377d36db35SAvi Kivity 384363f1d9SPaolo Bonzini pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt); 394363f1d9SPaolo Bonzini void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt); 404363f1d9SPaolo Bonzini bool any_present_pages(pgd_t *cr3, void *virt, size_t len); 41*c85124d2SManali Shukla void set_pte_opt_mask(void); 42*c85124d2SManali Shukla void reset_pte_opt_mask(void); 43*c85124d2SManali Shukla 44*c85124d2SManali Shukla enum x86_mmu_flags { 45*c85124d2SManali Shukla X86_MMU_MAP_USER = BIT(0), 46*c85124d2SManali Shukla X86_MMU_MAP_HUGE = BIT(1), 47*c85124d2SManali Shukla }; 48*c85124d2SManali Shukla void __setup_mmu_range(pgd_t *cr3, phys_addr_t start, size_t len, 49*c85124d2SManali Shukla enum x86_mmu_flags mmu_flags); 507d36db35SAvi Kivity 511df80b57SPeter Feiner static inline void *current_page_table(void) 521df80b57SPeter Feiner { 531df80b57SPeter Feiner return phys_to_virt(read_cr3()); 541df80b57SPeter Feiner } 555868743aSMarc Orr 565868743aSMarc Orr void split_large_page(unsigned long *ptep, int level); 575868743aSMarc Orr void force_4k_page(void *addr); 5848f67910SCathy Avery 5948f67910SCathy Avery struct vm_vcpu_info { 6048f67910SCathy Avery u64 cr3; 6148f67910SCathy Avery u64 cr4; 6248f67910SCathy Avery u64 cr0; 6348f67910SCathy Avery }; 6448f67910SCathy Avery 65f3e081d7SAaron Lewis typedef void (*pte_callback_t)(struct pte_search search, void *va); 66f3e081d7SAaron Lewis void walk_pte(void *virt, size_t len, pte_callback_t callback); 67f3e081d7SAaron Lewis 687d36db35SAvi Kivity #endif 69