From: Ackerley Tng <ackerley...@google.com>

TDX guests' registers cannot be initialized directly using
vcpu_regs_set(), hence the stack pointer needs to be initialized by
the guest itself, running boot code beginning at the reset vector.

We store the stack address as part of struct kvm_vcpu so that it can
be accessible later to be passed to the boot code for rsp
initialization.

Signed-off-by: Ackerley Tng <ackerley...@google.com>
Signed-off-by: Ryan Afranji <afra...@google.com>
Signed-off-by: Sagi Shahar <sa...@google.com>
---
 tools/testing/selftests/kvm/include/kvm_util_base.h | 1 +
 tools/testing/selftests/kvm/lib/x86_64/processor.c  | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h 
b/tools/testing/selftests/kvm/include/kvm_util_base.h
index c2e5c5f25dfc..b353617fcdd1 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -68,6 +68,7 @@ struct kvm_vcpu {
        int fd;
        struct kvm_vm *vm;
        struct kvm_run *run;
+       vm_vaddr_t initial_stack_addr;
 #ifdef __x86_64__
        struct kvm_cpuid2 *cpuid;
 #endif
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c 
b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index f130f78a4974..b6b9438e0a33 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -621,10 +621,12 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, 
uint32_t vcpu_id,
        vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid());
        vcpu_setup(vm, vcpu);
 
+       vcpu->initial_stack_addr = stack_vaddr;
+
        /* Setup guest general purpose registers */
        vcpu_regs_get(vcpu, &regs);
        regs.rflags = regs.rflags | 0x2;
-       regs.rsp = stack_vaddr;
+       regs.rsp = vcpu->initial_stack_addr;
        regs.rip = (unsigned long) guest_code;
        vcpu_regs_set(vcpu, &regs);
 
-- 
2.43.0.472.g3155946c3a-goog


Reply via email to