46 lines
1 KiB
C
46 lines
1 KiB
C
/* 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;
|
|
}
|