[PATCH v16 13/20] KVM: selftests: Load per-vCPU guest stack in TDX boot parameters
From: Lisa Wang
Date: Thu Nov 05 2026 - 18:58:32 EST
From: Sagi Shahar <sagis@xxxxxxxxxx>
Allocate a guest stack for each vCPU and record the GVA in the TDX boot
parameters region to allow proper vCPU initialization.
Co-developed-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Signed-off-by: Sagi Shahar <sagis@xxxxxxxxxx>
Signed-off-by: Lisa Wang <wyihan@xxxxxxxxxx>
Reviewed-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx>
Reviewed-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx>
---
tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
index 1719dc1bb060..84127618f05c 100644
--- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
+++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
@@ -91,6 +91,20 @@ void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm)
params->gdtr.limit = kvm_get_default_gdt_limit();
}
+static void tdx_vcpu_load_boot_parameters(struct kvm_vcpu *vcpu)
+{
+ struct td_boot_parameters *params =
+ addr_gpa2hva(vcpu->vm, TD_BOOT_PARAMETERS_GPA);
+ struct td_per_vcpu_parameters *vcpu_params =
+ ¶ms->per_vcpu[vcpu->id];
+ gva_t esp_gva;
+
+ esp_gva = vm_alloc_stack(vcpu->vm, DEFAULT_STACK_PGS);
+ TEST_ASSERT(esp_gva < (1ULL << 32),
+ "ESP GVA must be within 32-bit address space for 32-bit boot code");
+ vcpu_params->esp_gva = esp_gva;
+}
+
void tdx_vcpu_init(struct kvm_vcpu *vcpu)
{
struct kvm_cpuid2 *cpuid;
@@ -100,6 +114,8 @@ void tdx_vcpu_init(struct kvm_vcpu *vcpu)
vcpu_init_cpuid(vcpu, cpuid);
free(cpuid);
tdx_vcpu_ioctl(vcpu, KVM_TDX_INIT_VCPU, 0, NULL);
+
+ tdx_vcpu_load_boot_parameters(vcpu);
}
static const struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *vm)
--
2.56.0.455.g6c5a503b38-goog