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