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