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