xref: /kvm-unit-tests/x86/rmap_chain.c (revision dcda215bee0e3d21eefba1b3658ba384952b5576)
17d36db35SAvi Kivity /* test long rmap chains */
27d36db35SAvi Kivity 
37d36db35SAvi Kivity #include "libcflat.h"
4002d1830SGleb Natapov #include "fwcfg.h"
57d36db35SAvi Kivity #include "vm.h"
6*dcda215bSPaolo Bonzini #include "vmalloc.h"
77d36db35SAvi Kivity #include "smp.h"
85aca024eSPaolo Bonzini #include "alloc_page.h"
97d36db35SAvi Kivity 
main(void)107d36db35SAvi Kivity int main (void)
117d36db35SAvi Kivity {
127d36db35SAvi Kivity     int i;
137d36db35SAvi Kivity     int nr_pages;
147d36db35SAvi Kivity     void *target_page, *virt_addr;
157d36db35SAvi Kivity 
167d36db35SAvi Kivity     setup_vm();
177d36db35SAvi Kivity 
18002d1830SGleb Natapov     nr_pages = fwcfg_get_u64(FW_CFG_RAM_SIZE) / PAGE_SIZE;
197d36db35SAvi Kivity     nr_pages -= 1000;
207d36db35SAvi Kivity     target_page = alloc_page();
217d36db35SAvi Kivity 
227d36db35SAvi Kivity     virt_addr = (void *) 0xfffffa000;
237d36db35SAvi Kivity     for (i = 0; i < nr_pages; i++) {
247d36db35SAvi Kivity         install_page(phys_to_virt(read_cr3()), virt_to_phys(target_page),
257d36db35SAvi Kivity                      virt_addr);
267d36db35SAvi Kivity         virt_addr += PAGE_SIZE;
277d36db35SAvi Kivity     }
287d36db35SAvi Kivity     printf("created %d mappings\n", nr_pages);
297d36db35SAvi Kivity 
307d36db35SAvi Kivity     virt_addr = (void *) 0xfffffa000;
317d36db35SAvi Kivity     for (i = 0; i < nr_pages; i++) {
327d36db35SAvi Kivity         unsigned long *touch = virt_addr;
337d36db35SAvi Kivity 
347d36db35SAvi Kivity         *touch = 0;
357d36db35SAvi Kivity         virt_addr += PAGE_SIZE;
367d36db35SAvi Kivity     }
377d36db35SAvi Kivity     printf("instantiated mappings\n");
387d36db35SAvi Kivity 
397d36db35SAvi Kivity     virt_addr += PAGE_SIZE;
407d36db35SAvi Kivity     install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
41d10d16e1SAlexander Gordeev                 0 | PT_PRESENT_MASK | PT_WRITABLE_MASK, target_page);
427d36db35SAvi Kivity 
437d36db35SAvi Kivity     *(unsigned long *)virt_addr = 0;
447d36db35SAvi Kivity     printf("PASS\n");
457d36db35SAvi Kivity 
467d36db35SAvi Kivity     return 0;
477d36db35SAvi Kivity }
48