xref: /kvm-unit-tests/x86/rmap_chain.c (revision 7d36db351752e29ad27eaafe3f102de7064e429b)
1 /* test long rmap chains */
2 
3 #include "libcflat.h"
4 #include "vm.h"
5 #include "smp.h"
6 
7 void print(const char *s);
8 
9 static unsigned int inl(unsigned short port)
10 {
11     unsigned int val;
12     asm volatile ("inl %w1, %0":"=a" (val):"Nd" (port));
13     return val;
14 }
15 
16 int main (void)
17 {
18     int i;
19     int nr_pages;
20     void *target_page, *virt_addr;
21 
22     setup_vm();
23 
24     nr_pages = inl(0xd1) / PAGE_SIZE;
25     nr_pages -= 1000;
26     target_page = alloc_page();
27 
28     virt_addr = (void *) 0xfffffa000;
29     for (i = 0; i < nr_pages; i++) {
30         install_page(phys_to_virt(read_cr3()), virt_to_phys(target_page),
31                      virt_addr);
32         virt_addr += PAGE_SIZE;
33     }
34     printf("created %d mappings\n", nr_pages);
35 
36     virt_addr = (void *) 0xfffffa000;
37     for (i = 0; i < nr_pages; i++) {
38         unsigned long *touch = virt_addr;
39 
40         *touch = 0;
41         virt_addr += PAGE_SIZE;
42     }
43     printf("instantiated mappings\n");
44 
45     virt_addr += PAGE_SIZE;
46     install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
47                 0 | PTE_PRESENT | PTE_WRITE, target_page);
48 
49     *(unsigned long *)virt_addr = 0;
50     printf("PASS\n");
51 
52     return 0;
53 }
54