1c865f654SCornelia Huck #ifndef _X86_VM_H_
2c865f654SCornelia Huck #define _X86_VM_H_
37d36db35SAvi Kivity
47d36db35SAvi Kivity #include "processor.h"
5*95a94088SNicholas Piggin #include "vmalloc.h"
63e394a58SAlexander Gordeev #include "asm/page.h"
755601383SAlexander Gordeev #include "asm/io.h"
8c85124d2SManali Shukla #include "asm/bitops.h"
97d36db35SAvi Kivity
107db17e21SThomas Huth void setup_5level_page_table(void);
117d36db35SAvi Kivity
121df80b57SPeter Feiner struct pte_search {
131df80b57SPeter Feiner int level;
144363f1d9SPaolo Bonzini pteval_t *pte;
151df80b57SPeter Feiner };
161df80b57SPeter Feiner
found_huge_pte(struct pte_search search)171df80b57SPeter Feiner static inline bool found_huge_pte(struct pte_search search)
181df80b57SPeter Feiner {
191df80b57SPeter Feiner return (search.level == 2 || search.level == 3) &&
201df80b57SPeter Feiner (*search.pte & PT_PRESENT_MASK) &&
211df80b57SPeter Feiner (*search.pte & PT_PAGE_SIZE_MASK);
221df80b57SPeter Feiner }
231df80b57SPeter Feiner
found_leaf_pte(struct pte_search search)241df80b57SPeter Feiner static inline bool found_leaf_pte(struct pte_search search)
251df80b57SPeter Feiner {
261df80b57SPeter Feiner return search.level == 1 || found_huge_pte(search);
271df80b57SPeter Feiner }
281df80b57SPeter Feiner
294363f1d9SPaolo Bonzini struct pte_search find_pte_level(pgd_t *cr3, void *virt,
301df80b57SPeter Feiner int lowest_level);
314363f1d9SPaolo Bonzini pteval_t *get_pte(pgd_t *cr3, void *virt);
324363f1d9SPaolo Bonzini pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level);
334363f1d9SPaolo Bonzini pteval_t *install_pte(pgd_t *cr3,
347d36db35SAvi Kivity int pte_level,
357d36db35SAvi Kivity void *virt,
364363f1d9SPaolo Bonzini pteval_t pte,
374363f1d9SPaolo Bonzini pteval_t *pt_page);
387d36db35SAvi Kivity
394363f1d9SPaolo Bonzini pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt);
404363f1d9SPaolo Bonzini void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt);
414363f1d9SPaolo Bonzini bool any_present_pages(pgd_t *cr3, void *virt, size_t len);
42c85124d2SManali Shukla void set_pte_opt_mask(void);
43c85124d2SManali Shukla void reset_pte_opt_mask(void);
44c85124d2SManali Shukla
45c85124d2SManali Shukla enum x86_mmu_flags {
46c85124d2SManali Shukla X86_MMU_MAP_USER = BIT(0),
47c85124d2SManali Shukla X86_MMU_MAP_HUGE = BIT(1),
48c85124d2SManali Shukla };
49c85124d2SManali Shukla void __setup_mmu_range(pgd_t *cr3, phys_addr_t start, size_t len,
50c85124d2SManali Shukla enum x86_mmu_flags mmu_flags);
517d36db35SAvi Kivity
current_page_table(void)521df80b57SPeter Feiner static inline void *current_page_table(void)
531df80b57SPeter Feiner {
541df80b57SPeter Feiner return phys_to_virt(read_cr3());
551df80b57SPeter Feiner }
565868743aSMarc Orr
575868743aSMarc Orr void split_large_page(unsigned long *ptep, int level);
585868743aSMarc Orr void force_4k_page(void *addr);
5948f67910SCathy Avery
6048f67910SCathy Avery struct vm_vcpu_info {
6148f67910SCathy Avery u64 cr3;
6248f67910SCathy Avery u64 cr4;
6348f67910SCathy Avery u64 cr0;
6448f67910SCathy Avery };
6548f67910SCathy Avery
66f3e081d7SAaron Lewis typedef void (*pte_callback_t)(struct pte_search search, void *va);
67f3e081d7SAaron Lewis void walk_pte(void *virt, size_t len, pte_callback_t callback);
68f3e081d7SAaron Lewis
697d36db35SAvi Kivity #endif
70