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