From: Sagi Shahar 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 Signed-off-by: Ackerley Tng Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang Reviewed-by: Binbin Wu Reviewed-by: Xiaoyao Li --- 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