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