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