On 8/8/2025 4:16 AM, Sagi Shahar wrote:
From: Ackerley Tng ackerleytng@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 ackerleytng@google.com Signed-off-by: Sagi Shahar sagis@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)
{ for (;;) {struct kvm_vcpu *vcpu, bool handle_conversions)
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);
} 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,continue;
@@ -241,8 +248,48 @@ static void guest_upm_explicit(void) tdx_test_success(); }
[...]