xref: /kvm-unit-tests/lib/x86/vm.h (revision 4363f1d9a646a5c7ea673bee8fc33ca6f2cddbd8)
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_5level_page_table();
9 
10 void *vmalloc(unsigned long size);
11 void vfree(void *mem);
12 void *vmap(unsigned long long phys, unsigned long size);
13 uint64_t virt_to_phys_cr3(void *mem);
14 
15 struct pte_search {
16 	int level;
17 	pteval_t *pte;
18 };
19 
20 static inline bool found_huge_pte(struct pte_search search)
21 {
22 	return (search.level == 2 || search.level == 3) &&
23 	       (*search.pte & PT_PRESENT_MASK) &&
24 	       (*search.pte & PT_PAGE_SIZE_MASK);
25 }
26 
27 static inline bool found_leaf_pte(struct pte_search search)
28 {
29 	return search.level == 1 || found_huge_pte(search);
30 }
31 
32 struct pte_search find_pte_level(pgd_t *cr3, void *virt,
33 				 int lowest_level);
34 pteval_t *get_pte(pgd_t *cr3, void *virt);
35 pteval_t *get_pte_level(pgd_t *cr3, void *virt, int pte_level);
36 pteval_t *install_pte(pgd_t *cr3,
37 		      int pte_level,
38 		      void *virt,
39 		      pteval_t pte,
40 		      pteval_t *pt_page);
41 
42 pteval_t *install_large_page(pgd_t *cr3, phys_addr_t phys, void *virt);
43 pteval_t *install_page(pgd_t *cr3, phys_addr_t phys, void *virt);
44 void install_pages(pgd_t *cr3, phys_addr_t phys, size_t len, void *virt);
45 bool any_present_pages(pgd_t *cr3, void *virt, size_t len);
46 
47 static inline void *current_page_table(void)
48 {
49 	return phys_to_virt(read_cr3());
50 }
51 #endif
52