[PATCH v4 03/28] KVM: selftests: Store initial stack address in struct kvm_vcpu

From: Ryan Afranji
Date: Tue Jul 25 2023 - 18:02:55 EST


From: Ackerley Tng <ackerleytng@xxxxxxxxxx>

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 <ackerleytng@xxxxxxxxxx>
Change-Id: I54e7bde72c5c21e7d8944415ac5818d9443e2b70
Signed-off-by: Ryan Afranji <afranji@xxxxxxxxxx>
---
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 a07ce5f5244a..12524d94a4eb 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -67,6 +67,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 e3a9366d4f80..78dd918b9a92 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -607,10 +607,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.41.0.487.g6d72f3e995-goog