| /* test long rmap chains */ |
| |
| #include "libcflat.h" |
| #include "fwcfg.h" |
| #include "vm.h" |
| #include "smp.h" |
| |
| int main (void) |
| { |
| int i; |
| int nr_pages; |
| void *target_page, *virt_addr; |
| |
| setup_vm(); |
| |
| nr_pages = fwcfg_get_u64(FW_CFG_RAM_SIZE) / PAGE_SIZE; |
| nr_pages -= 1000; |
| target_page = alloc_page(); |
| |
| virt_addr = (void *) 0xfffffa000; |
| for (i = 0; i < nr_pages; i++) { |
| install_page(phys_to_virt(read_cr3()), virt_to_phys(target_page), |
| virt_addr); |
| virt_addr += PAGE_SIZE; |
| } |
| printf("created %d mappings\n", nr_pages); |
| |
| virt_addr = (void *) 0xfffffa000; |
| for (i = 0; i < nr_pages; i++) { |
| unsigned long *touch = virt_addr; |
| |
| *touch = 0; |
| virt_addr += PAGE_SIZE; |
| } |
| printf("instantiated mappings\n"); |
| |
| virt_addr += PAGE_SIZE; |
| install_pte(phys_to_virt(read_cr3()), 1, virt_addr, |
| 0 | PT_PRESENT_MASK | PT_WRITABLE_MASK, target_page); |
| |
| *(unsigned long *)virt_addr = 0; |
| printf("PASS\n"); |
| |
| return 0; |
| } |