xref: /kvm-unit-tests/lib/x86/vm.h (revision 5868743a312d0492efda222f6b1c507dd9595abc)
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 
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 }
45*5868743aSMarc Orr 
46*5868743aSMarc Orr void split_large_page(unsigned long *ptep, int level);
47*5868743aSMarc Orr void force_4k_page(void *addr);
487d36db35SAvi Kivity #endif
49