From: Ackerley Tng <[email protected]> Test that a guest vCPU can execute instructions and read/write memory mapped into a guest_memfd instance that is backed by a tmpfs resource pool descriptor.
Signed-off-by: Ackerley Tng <[email protected]> --- tools/testing/selftests/kvm/guest_memfd_test.c | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c index 345b41c912a18..bf369874f2647 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -829,6 +829,62 @@ static void test_guest_memfd_guest(void) kvm_vm_free(vm); } +static void test_guest_memfd_guest_resource(void) +{ + const gpa_t gpa = SZ_4G; + const int slot = 1; + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + int pool_fd, fd, i; + size_t size; + u8 *mem; + + if (!kvm_check_cap(KVM_CAP_GUEST_MEMFD_FLAGS)) + return; + + pool_fd = create_tmpfs_pool_fd("never", true, page_size); + if (pool_fd < 0) + TEST_REQUIRE(false); + + vm = __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, &vcpu, 1, guest_code); + + TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLAG_MMAP, + "Default VM type should support MMAP, supported flags = 0x%x", + vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS)); + TEST_ASSERT(vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS) & GUEST_MEMFD_FLAG_INIT_SHARED, + "Default VM type should support INIT_SHARED, supported flags = 0x%x", + vm_check_cap(vm, KVM_CAP_GUEST_MEMFD_FLAGS)); + + size = max_t(size_t, vm->page_size, page_size); + fd = __vm_create_guest_memfd_resource(vm, size, + GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED | + GUEST_MEMFD_FLAG_USE_RESOURCE, + pool_fd); + TEST_ASSERT(fd >= 0, "guest_memfd with tmpfs pool should succeed"); + + vm_set_user_memory_region2(vm, slot, KVM_MEM_GUEST_MEMFD, gpa, size, NULL, fd, 0); + + mem = kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); + memset(mem, 0xaa, size); + kvm_munmap(mem, size); + + virt_map(vm, gpa, gpa, size / vm->page_size); + vcpu_args_set(vcpu, 2, gpa, size); + vcpu_run(vcpu); + + TEST_ASSERT_EQ(get_ucall(vcpu, NULL), UCALL_DONE); + + mem = kvm_mmap(size, PROT_READ | PROT_WRITE, MAP_SHARED, fd); + for (i = 0; i < size; i++) + TEST_ASSERT_EQ(mem[i], 0xff); + + close(fd); + close(pool_fd); + kvm_vm_free(vm); +} + + int main(int argc, char *argv[]) { unsigned long vm_types, vm_type; @@ -849,4 +905,5 @@ int main(int argc, char *argv[]) test_guest_memfd(vm_type); test_guest_memfd_guest(); + test_guest_memfd_guest_resource(); } -- 2.56.0.rc1.315.gc6ed9934b7-goog

