From: Ackerley Tng <[email protected]>

This tests the use of guest memory without explicit MapGPA calls.

Signed-off-by: Ackerley Tng <[email protected]>
Signed-off-by: Ryan Afranji <[email protected]>
Signed-off-by: Sagi Shahar <[email protected]>
---
 .../selftests/kvm/x86_64/tdx_upm_test.c       | 86 +++++++++++++++++--
 1 file changed, 77 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/tdx_upm_test.c 
b/tools/testing/selftests/kvm/x86_64/tdx_upm_test.c
index 44671874a4f1..bfa921f125a0 100644
--- a/tools/testing/selftests/kvm/x86_64/tdx_upm_test.c
+++ b/tools/testing/selftests/kvm/x86_64/tdx_upm_test.c
@@ -149,7 +149,7 @@ enum {
  * Does vcpu_run, and also manages memory conversions if requested by the TD.
  */
 void vcpu_run_and_manage_memory_conversions(struct kvm_vm *vm,
-                                           struct kvm_vcpu *vcpu)
+                                           struct kvm_vcpu *vcpu, bool 
handle_conversions)
 {
        for (;;) {
                vcpu_run(vcpu);
@@ -163,6 +163,13 @@ void vcpu_run_and_manage_memory_conversions(struct kvm_vm 
*vm,
                                !(vm->arch.s_bit & vmcall_info->in_r12));
                        vmcall_info->status_code = 0;
                        continue;
+               } else if (handle_conversions &&
+                       vcpu->run->exit_reason == KVM_EXIT_MEMORY_FAULT) {
+                       handle_memory_conversion(
+                               vm, vcpu->run->memory_fault.gpa,
+                               vcpu->run->memory_fault.size,
+                               vcpu->run->memory_fault.flags == 
KVM_MEMORY_EXIT_FLAG_PRIVATE);
+                       continue;
                } else if (
                        vcpu->run->exit_reason == KVM_EXIT_IO &&
                        vcpu->run->io.port == TDX_UPM_TEST_ACCEPT_PRINT_PORT) {
@@ -243,8 +250,53 @@ static void guest_upm_explicit(void)
        tdx_test_success();
 }
 
+static void guest_upm_implicit(void)
+{
+       struct tdx_upm_test_area *test_area_gva_private =
+               (struct tdx_upm_test_area *)TDX_UPM_TEST_AREA_GVA_PRIVATE;
+       struct tdx_upm_test_area *test_area_gva_shared =
+               (struct tdx_upm_test_area *)TDX_UPM_TEST_AREA_GVA_SHARED;
+
+       /* Check: host reading private memory does not modify guest's view */
+       fill_test_area(test_area_gva_private, PATTERN_GUEST_GENERAL);
+
+       tdx_test_report_to_user_space(SYNC_CHECK_READ_PRIVATE_MEMORY_FROM_HOST);
+
+       TDX_UPM_TEST_ASSERT(
+               check_test_area(test_area_gva_private, PATTERN_GUEST_GENERAL));
+
+       /* Use focus area as shared */
+       fill_focus_area(test_area_gva_shared, PATTERN_GUEST_FOCUS);
+
+       /* General areas should not be affected */
+       TDX_UPM_TEST_ASSERT(
+               check_general_areas(test_area_gva_private, 
PATTERN_GUEST_GENERAL));
+
+       tdx_test_report_to_user_space(SYNC_CHECK_READ_SHARED_MEMORY_FROM_HOST);
+
+       /* Check that guest has the same view of shared memory */
+       TDX_UPM_TEST_ASSERT(
+               check_focus_area(test_area_gva_shared, PATTERN_HOST_FOCUS));
+
+       /* Use focus area as private */
+       fill_focus_area(test_area_gva_private, PATTERN_GUEST_FOCUS);
+
+       /* General areas should be unaffected by remapping */
+       TDX_UPM_TEST_ASSERT(
+               check_general_areas(test_area_gva_private, 
PATTERN_GUEST_GENERAL));
+
+       
tdx_test_report_to_user_space(SYNC_CHECK_READ_PRIVATE_MEMORY_FROM_HOST_AGAIN);
+
+       /* Check that guest can use private memory after focus area is remapped 
as private */
+       TDX_UPM_TEST_ASSERT(
+               fill_and_check(test_area_gva_private, PATTERN_GUEST_GENERAL));
+
+       tdx_test_success();
+}
+
 static void run_selftest(struct kvm_vm *vm, struct kvm_vcpu *vcpu,
-                        struct tdx_upm_test_area *test_area_base_hva)
+                        struct tdx_upm_test_area *test_area_base_hva,
+                        bool implicit)
 {
        vcpu_run(vcpu);
        TDX_TEST_CHECK_GUEST_FAILURE(vcpu);
@@ -263,7 +315,7 @@ static void run_selftest(struct kvm_vm *vm, struct kvm_vcpu 
*vcpu,
        TEST_ASSERT(check_test_area(test_area_base_hva, 
PATTERN_CONFIDENCE_CHECK),
                "Host should read PATTERN_CONFIDENCE_CHECK from guest's private 
memory.");
 
-       vcpu_run_and_manage_memory_conversions(vm, vcpu);
+       vcpu_run_and_manage_memory_conversions(vm, vcpu, implicit);
        TDX_TEST_CHECK_GUEST_FAILURE(vcpu);
        TDX_TEST_ASSERT_IO(vcpu, TDX_TEST_REPORT_PORT, TDX_TEST_REPORT_SIZE,
                 TDG_VP_VMCALL_INSTRUCTION_IO_WRITE);
@@ -280,7 +332,7 @@ static void run_selftest(struct kvm_vm *vm, struct kvm_vcpu 
*vcpu,
        TEST_ASSERT(check_focus_area(test_area_base_hva, PATTERN_HOST_FOCUS),
                    "Host should be able to use shared memory.");
 
-       vcpu_run_and_manage_memory_conversions(vm, vcpu);
+       vcpu_run_and_manage_memory_conversions(vm, vcpu, implicit);
        TDX_TEST_CHECK_GUEST_FAILURE(vcpu);
        TDX_TEST_ASSERT_IO(vcpu, TDX_TEST_REPORT_PORT, TDX_TEST_REPORT_SIZE,
                 TDG_VP_VMCALL_INSTRUCTION_IO_WRITE);
@@ -329,18 +381,20 @@ static void guest_ve_handler(struct ex_regs *regs)
        TDX_UPM_TEST_ASSERT(!ret);
 }
 
-static void verify_upm_test(void)
+static void verify_upm_test(bool implicit)
 {
        struct kvm_vm *vm;
        struct kvm_vcpu *vcpu;
 
+       void *guest_code;
        vm_vaddr_t test_area_gva_private;
        struct tdx_upm_test_area *test_area_base_hva;
        uint64_t test_area_npages;
 
        vm = td_create();
        td_initialize(vm, VM_MEM_SRC_ANONYMOUS, 0);
-       vcpu = td_vcpu_add(vm, 0, guest_upm_explicit);
+       guest_code = implicit ? guest_upm_implicit : guest_upm_explicit;
+       vcpu = td_vcpu_add(vm, 0, guest_code);
 
        vm_install_exception_handler(vm, VE_VECTOR, guest_ve_handler);
 
@@ -379,13 +433,26 @@ static void verify_upm_test(void)
 
        td_finalize(vm);
 
-       printf("Verifying UPM functionality: explicit MapGPA\n");
+       if (implicit)
+               printf("Verifying UPM functionality: implicit conversion\n");
+       else
+               printf("Verifying UPM functionality: explicit MapGPA\n");
 
-       run_selftest(vm, vcpu, test_area_base_hva);
+       run_selftest(vm, vcpu, test_area_base_hva, implicit);
 
        kvm_vm_free(vm);
 }
 
+void verify_upm_test_explicit(void)
+{
+       verify_upm_test(false);
+}
+
+void verify_upm_test_implicit(void)
+{
+       verify_upm_test(true);
+}
+
 int main(int argc, char **argv)
 {
        /* Disable stdout buffering */
@@ -397,5 +464,6 @@ int main(int argc, char **argv)
                return 0;
        }
 
-       run_in_new_process(&verify_upm_test);
+       run_in_new_process(&verify_upm_test_explicit);
+       run_in_new_process(&verify_upm_test_implicit);
 }
-- 
2.43.0.472.g3155946c3a-goog


Reply via email to