1 #ifndef VM_H 2 #define VM_H 3 4 #include "processor.h" 5 #include "asm/page.h" 6 #include "asm/io.h" 7 8 void setup_vm(); 9 10 void *vmalloc(unsigned long size); 11 void vfree(void *mem); 12 void *vmap(unsigned long long phys, unsigned long size); 13 void *alloc_vpage(void); 14 void *alloc_vpages(ulong nr); 15 uint64_t virt_to_phys_cr3(void *mem); 16 17 struct pte_search { 18 int level; 19 unsigned long *pte; 20 }; 21 22 static inline bool found_huge_pte(struct pte_search search) 23 { 24 return (search.level == 2 || search.level == 3) && 25 (*search.pte & PT_PRESENT_MASK) && 26 (*search.pte & PT_PAGE_SIZE_MASK); 27 } 28 29 static inline bool found_leaf_pte(struct pte_search search) 30 { 31 return search.level == 1 || found_huge_pte(search); 32 } 33 34 struct pte_search find_pte_level(unsigned long *cr3, void *virt, 35 int lowest_level); 36 unsigned long *get_pte(unsigned long *cr3, void *virt); 37 unsigned long *get_pte_level(unsigned long *cr3, void *virt, int pte_level); 38 unsigned long *install_pte(unsigned long *cr3, 39 int pte_level, 40 void *virt, 41 unsigned long pte, 42 unsigned long *pt_page); 43 44 void *alloc_page(); 45 void *alloc_pages(unsigned long order); 46 void free_page(void *page); 47 48 unsigned long *install_large_page(unsigned long *cr3,unsigned long phys, 49 void *virt); 50 unsigned long *install_page(unsigned long *cr3, unsigned long phys, void *virt); 51 void install_pages(unsigned long *cr3, unsigned long phys, unsigned long len, 52 void *virt); 53 bool any_present_pages(unsigned long *cr3, void *virt, unsigned long len); 54 55 static inline void *current_page_table(void) 56 { 57 return phys_to_virt(read_cr3()); 58 } 59 #endif 60