xref: /kvm-unit-tests/lib/x86/vm.h (revision 1df80b5711b9339a5e3423d9b1f683dd02a0b75b)
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 
87d36db35SAvi Kivity void setup_vm();
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);
13a4b87a16SGleb Natapov void *alloc_vpage(void);
14524ae896SAvi Kivity void *alloc_vpages(ulong nr);
15334cd2bfSGleb Natapov uint64_t virt_to_phys_cr3(void *mem);
167d36db35SAvi Kivity 
17*1df80b57SPeter Feiner struct pte_search {
18*1df80b57SPeter Feiner 	int level;
19*1df80b57SPeter Feiner 	unsigned long *pte;
20*1df80b57SPeter Feiner };
21*1df80b57SPeter Feiner 
22*1df80b57SPeter Feiner static inline bool found_huge_pte(struct pte_search search)
23*1df80b57SPeter Feiner {
24*1df80b57SPeter Feiner 	return (search.level == 2 || search.level == 3) &&
25*1df80b57SPeter Feiner 	       (*search.pte & PT_PRESENT_MASK) &&
26*1df80b57SPeter Feiner 	       (*search.pte & PT_PAGE_SIZE_MASK);
27*1df80b57SPeter Feiner }
28*1df80b57SPeter Feiner 
29*1df80b57SPeter Feiner static inline bool found_leaf_pte(struct pte_search search)
30*1df80b57SPeter Feiner {
31*1df80b57SPeter Feiner 	return search.level == 1 || found_huge_pte(search);
32*1df80b57SPeter Feiner }
33*1df80b57SPeter Feiner 
34*1df80b57SPeter Feiner struct pte_search find_pte_level(unsigned long *cr3, void *virt,
35*1df80b57SPeter Feiner 				 int lowest_level);
3604262816SPaolo Bonzini unsigned long *get_pte(unsigned long *cr3, void *virt);
37*1df80b57SPeter Feiner unsigned long *get_pte_level(unsigned long *cr3, void *virt, int pte_level);
3804262816SPaolo Bonzini unsigned long *install_pte(unsigned long *cr3,
397d36db35SAvi Kivity                            int pte_level,
407d36db35SAvi Kivity                            void *virt,
417d36db35SAvi Kivity                            unsigned long pte,
427d36db35SAvi Kivity                            unsigned long *pt_page);
437d36db35SAvi Kivity 
447d36db35SAvi Kivity void *alloc_page();
458e32da1bSPeter Feiner void *alloc_pages(unsigned long order);
461597d09dSAndrey Smetanin void free_page(void *page);
477d36db35SAvi Kivity 
4804262816SPaolo Bonzini unsigned long *install_large_page(unsigned long *cr3,unsigned long phys,
497d36db35SAvi Kivity                                   void *virt);
5004262816SPaolo Bonzini unsigned long *install_page(unsigned long *cr3, unsigned long phys, void *virt);
51*1df80b57SPeter Feiner void install_pages(unsigned long *cr3, unsigned long phys, unsigned long len,
52*1df80b57SPeter Feiner 		   void *virt);
53*1df80b57SPeter Feiner bool any_present_pages(unsigned long *cr3, void *virt, unsigned long len);
547d36db35SAvi Kivity 
55*1df80b57SPeter Feiner static inline void *current_page_table(void)
56*1df80b57SPeter Feiner {
57*1df80b57SPeter Feiner 	return phys_to_virt(read_cr3());
58*1df80b57SPeter Feiner }
597d36db35SAvi Kivity #endif
60