xref: /kvm-unit-tests/lib/x86/vm.h (revision 4363f1d9a646a5c7ea673bee8fc33ca6f2cddbd8)
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