On 05/09/2012 12:33 PM, Gleb Natapov wrote:
The test checks that when hypervisor prefaults swapped in page it does not generates spurious #PFs in case page was unmapped while it was swapped out. diff --git a/config-x86-common.mak b/config-x86-common.mak index c8fbda7..6976f78 100644 --- a/config-x86-common.mak +++ b/config-x86-common.mak @@ -34,7 +34,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \ $(TEST_DIR)/realmode.flat $(TEST_DIR)/msr.flat \ $(TEST_DIR)/hypercall.flat $(TEST_DIR)/sieve.flat \ $(TEST_DIR)/kvmclock_test.flat $(TEST_DIR)/eventinj.flat \ - $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat + $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat $(TEST_DIR)/asyncpf.flat ifdef API tests-common += api/api-sample @@ -90,6 +90,8 @@ $(TEST_DIR)/s3.elf: $(cstart.o) $(TEST_DIR)/s3.o $(TEST_DIR)/pmu.elf: $(cstart.o) $(TEST_DIR)/pmu.o +$(TEST_DIR)/asyncpf.elf: $(cstart.o) $(TEST_DIR)/asyncpf.o + arch_clean: $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ $(TEST_DIR)/.*.d $(TEST_DIR)/lib/.*.d $(TEST_DIR)/lib/*.o diff --git a/lib/x86/processor.h b/lib/x86/processor.h index c7e1afb..e46d8d0 100644 --- a/lib/x86/processor.h +++ b/lib/x86/processor.h @@ -302,4 +302,9 @@ static inline void invlpg(void *va) { asm volatile("invlpg (%0)" ::"r" (va) : "memory"); } + +static inline void safe_halt(void) +{ + asm volatile("sti; hlt"); +} #endif diff --git a/lib/x86/vm.c b/lib/x86/vm.c index 550ec9b..71b70fd 100644 --- a/lib/x86/vm.c +++ b/lib/x86/vm.c @@ -219,6 +219,11 @@ void *vmalloc(unsigned long size) return mem; } +uint64_t virt_to_phys_cr3(void *mem) +{ + return (get_pte(phys_to_virt(read_cr3()), mem)& PTE_ADDR) + ((ulong)mem& (PAGE_SIZE - 1)); +} + void vfree(void *mem) { unsigned long size = ((unsigned long *)mem)[-1]; diff --git a/lib/x86/vm.h b/lib/x86/vm.h index 71ab4a8..3473f8d 100644 --- a/lib/x86/vm.h +++ b/lib/x86/vm.h @@ -22,6 +22,7 @@ void vfree(void *mem); void *vmap(unsigned long long phys, unsigned long size); void *alloc_vpage(void); void *alloc_vpages(ulong nr); +uint64_t virt_to_phys_cr3(void *mem); void install_pte(unsigned long *cr3, int pte_level, diff --git a/x86/asyncpf.c b/x86/asyncpf.c new file mode 100644 index 0000000..62c0455 --- /dev/null +++ b/x86/asyncpf.c @@ -0,0 +1,113 @@ +/* + * Async PF test. For the test to actually do anywathing it ineeds to be started
^^^^^^^^^^^^^^^^^^^^ typo? -- ----- Igor -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html