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