xref: /kvm-unit-tests/x86/rmap_chain.c (revision 002d1830a7928c3cfcd35dc6607b8309c62e4730)
17d36db35SAvi Kivity /* test long rmap chains */
27d36db35SAvi Kivity 
37d36db35SAvi Kivity #include "libcflat.h"
4*002d1830SGleb Natapov #include "fwcfg.h"
57d36db35SAvi Kivity #include "vm.h"
67d36db35SAvi Kivity #include "smp.h"
77d36db35SAvi Kivity 
87d36db35SAvi Kivity void print(const char *s);
97d36db35SAvi Kivity 
107d36db35SAvi Kivity static unsigned int inl(unsigned short port)
117d36db35SAvi Kivity {
127d36db35SAvi Kivity     unsigned int val;
137d36db35SAvi Kivity     asm volatile ("inl %w1, %0":"=a" (val):"Nd" (port));
147d36db35SAvi Kivity     return val;
157d36db35SAvi Kivity }
167d36db35SAvi Kivity 
177d36db35SAvi Kivity int main (void)
187d36db35SAvi Kivity {
197d36db35SAvi Kivity     int i;
207d36db35SAvi Kivity     int nr_pages;
217d36db35SAvi Kivity     void *target_page, *virt_addr;
227d36db35SAvi Kivity 
237d36db35SAvi Kivity     setup_vm();
247d36db35SAvi Kivity 
25*002d1830SGleb Natapov     nr_pages = fwcfg_get_u64(FW_CFG_RAM_SIZE) / PAGE_SIZE;
267d36db35SAvi Kivity     nr_pages -= 1000;
277d36db35SAvi Kivity     target_page = alloc_page();
287d36db35SAvi Kivity 
297d36db35SAvi Kivity     virt_addr = (void *) 0xfffffa000;
307d36db35SAvi Kivity     for (i = 0; i < nr_pages; i++) {
317d36db35SAvi Kivity         install_page(phys_to_virt(read_cr3()), virt_to_phys(target_page),
327d36db35SAvi Kivity                      virt_addr);
337d36db35SAvi Kivity         virt_addr += PAGE_SIZE;
347d36db35SAvi Kivity     }
357d36db35SAvi Kivity     printf("created %d mappings\n", nr_pages);
367d36db35SAvi Kivity 
377d36db35SAvi Kivity     virt_addr = (void *) 0xfffffa000;
387d36db35SAvi Kivity     for (i = 0; i < nr_pages; i++) {
397d36db35SAvi Kivity         unsigned long *touch = virt_addr;
407d36db35SAvi Kivity 
417d36db35SAvi Kivity         *touch = 0;
427d36db35SAvi Kivity         virt_addr += PAGE_SIZE;
437d36db35SAvi Kivity     }
447d36db35SAvi Kivity     printf("instantiated mappings\n");
457d36db35SAvi Kivity 
467d36db35SAvi Kivity     virt_addr += PAGE_SIZE;
477d36db35SAvi Kivity     install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
487d36db35SAvi Kivity                 0 | PTE_PRESENT | PTE_WRITE, target_page);
497d36db35SAvi Kivity 
507d36db35SAvi Kivity     *(unsigned long *)virt_addr = 0;
517d36db35SAvi Kivity     printf("PASS\n");
527d36db35SAvi Kivity 
537d36db35SAvi Kivity     return 0;
547d36db35SAvi Kivity }
55