1 /* test long rmap chains */ 2 3 #include "libcflat.h" 4 #include "vm.h" 5 #include "smp.h" 6 7 void print(const char *s); 8 9 static unsigned int inl(unsigned short port) 10 { 11 unsigned int val; 12 asm volatile ("inl %w1, %0":"=a" (val):"Nd" (port)); 13 return val; 14 } 15 16 int main (void) 17 { 18 int i; 19 int nr_pages; 20 void *target_page, *virt_addr; 21 22 setup_vm(); 23 24 nr_pages = inl(0xd1) / PAGE_SIZE; 25 nr_pages -= 1000; 26 target_page = alloc_page(); 27 28 virt_addr = (void *) 0xfffffa000; 29 for (i = 0; i < nr_pages; i++) { 30 install_page(phys_to_virt(read_cr3()), virt_to_phys(target_page), 31 virt_addr); 32 virt_addr += PAGE_SIZE; 33 } 34 printf("created %d mappings\n", nr_pages); 35 36 virt_addr = (void *) 0xfffffa000; 37 for (i = 0; i < nr_pages; i++) { 38 unsigned long *touch = virt_addr; 39 40 *touch = 0; 41 virt_addr += PAGE_SIZE; 42 } 43 printf("instantiated mappings\n"); 44 45 virt_addr += PAGE_SIZE; 46 install_pte(phys_to_virt(read_cr3()), 1, virt_addr, 47 0 | PTE_PRESENT | PTE_WRITE, target_page); 48 49 *(unsigned long *)virt_addr = 0; 50 printf("PASS\n"); 51 52 return 0; 53 } 54