xref: /kvm-unit-tests/lib/x86/vm.h (revision 4a18bde1663489b27e679142e56809c1fd49b90d)
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