On 8/8/2025 4:16 AM, Sagi Shahar wrote:
From: Ackerley Tng <ackerley...@google.com>

This tests the use of guest memory without explicit TDG.VP.VMCALL<MapGPA>
calls.

Provide a 2MB memory region to the TDX guest with a 40KB focus area at
offset 1MB intended to be shared between host and guest. The guest does
not request memory to be shared or private using TDG.VP.VMCALL<MapGPA> but
instead relies on memory to be converted automatically based on its
access via shared or private mapping. The host automatically
converts the memory when guest exits with KVM_EXIT_MEMORY_FAULT.

The 2MB region starts out as private with the guest filling it with a
pattern, followed by a check from the host to ensure the host is not able
to see the pattern. The guest then accesses the 40KB focus area via
its shared mapping to trigger implicit conversion followed by checks that
the host and guest has the same view of the memory. Finally the guest
accesses the 40KB memory via its private mapping to trigger the implicit
conversion to private followed by checks to confirm this is the case.

Signed-off-by: Ackerley Tng <ackerley...@google.com>
Signed-off-by: Sagi Shahar <sa...@google.com>
---
  .../testing/selftests/kvm/x86/tdx_upm_test.c  | 88 ++++++++++++++++---
  1 file changed, 76 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86/tdx_upm_test.c 
b/tools/testing/selftests/kvm/x86/tdx_upm_test.c
index 387258ab1a62..2ea5bf6d24b7 100644
--- a/tools/testing/selftests/kvm/x86/tdx_upm_test.c
+++ b/tools/testing/selftests/kvm/x86/tdx_upm_test.c
@@ -150,10 +150,10 @@ 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);
+               _vcpu_run(vcpu);
Why this change?


                if (vcpu->run->exit_reason == KVM_EXIT_HYPERCALL &&
                    vcpu->run->hypercall.nr == KVM_HC_MAP_GPA_RANGE) {
                        uint64_t gpa = vcpu->run->hypercall.args[0];
@@ -164,6 +164,13 @@ void vcpu_run_and_manage_memory_conversions(struct kvm_vm 
*vm,
                                                  KVM_MAP_GPA_RANGE_ENCRYPTED);
                        vcpu->run->hypercall.ret = 0;
                        continue;
+               } else if (handle_conversions &&
+                       vcpu->run->exit_reason == KVM_EXIT_MEMORY_FAULT) {
+                       handle_memory_conversion(vm, vcpu->id, 
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) {
                        uint64_t gpa = tdx_test_read_64bit(vcpu,
@@ -241,8 +248,48 @@ static void guest_upm_explicit(void)
        tdx_test_success();
  }
[...]

Reply via email to