From: Sean Christopherson <seanjc@google.com>
To: Binbin Wu <binbin.wu@linux.intel.com>
Cc: Sagi Shahar <sagis@google.com>,
linux-kselftest@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>,
Shuah Khan <shuah@kernel.org>,
Ackerley Tng <ackerleytng@google.com>,
Ryan Afranji <afranji@google.com>,
Andrew Jones <ajones@ventanamicro.com>,
Isaku Yamahata <isaku.yamahata@intel.com>,
Erdem Aktas <erdemaktas@google.com>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Roger Wang <runanwang@google.com>,
Oliver Upton <oliver.upton@linux.dev>,
"Pratik R. Sampat" <pratikrajesh.sampat@amd.com>,
Reinette Chatre <reinette.chatre@intel.com>,
Ira Weiny <ira.weiny@intel.com>, Chao Gao <chao.gao@intel.com>,
Chenyi Qiang <chenyi.qiang@intel.com>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH v9 04/19] KVM: selftests: Expose function to allocate guest vCPU stack
Date: Tue, 26 Aug 2025 10:16:21 -0700 [thread overview]
Message-ID: <aK3r5cjLvF3vmJCi@google.com> (raw)
In-Reply-To: <9ef0d1f4-3257-4821-8241-aedae0957c6a@linux.intel.com>
On Tue, Aug 26, 2025, Binbin Wu wrote:
>
>
> On 8/21/2025 12:28 PM, Sagi Shahar wrote:
> > 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.
> >
> > Expose the function to allocate the guest stack so that TDX
> > initialization code can allocate it itself and skip the allocation in
> > vm_arch_vcpu_add() in that case.
> >
> > Signed-off-by: Sagi Shahar <sagis@google.com>
> > ---
> > .../selftests/kvm/include/x86/processor.h | 2 ++
> > tools/testing/selftests/kvm/lib/x86/processor.c | 17 ++++++++++++-----
> > 2 files changed, 14 insertions(+), 5 deletions(-)
> >
> > diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/testing/selftests/kvm/include/x86/processor.h
> > index 5c16507f9b2d..8fcc5118683e 100644
> > --- a/tools/testing/selftests/kvm/include/x86/processor.h
> > +++ b/tools/testing/selftests/kvm/include/x86/processor.h
> > @@ -1111,6 +1111,8 @@ static inline void vcpu_clear_cpuid_feature(struct kvm_vcpu *vcpu,
> > vcpu_set_or_clear_cpuid_feature(vcpu, feature, false);
> > }
> > +vm_vaddr_t kvm_allocate_vcpu_stack(struct kvm_vm *vm);
> > +
> > uint64_t vcpu_get_msr(struct kvm_vcpu *vcpu, uint64_t msr_index);
> > int _vcpu_set_msr(struct kvm_vcpu *vcpu, uint64_t msr_index, uint64_t msr_value);
> > diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c
> > index b2a4b11ac8c0..1eae92957456 100644
> > --- a/tools/testing/selftests/kvm/lib/x86/processor.c
> > +++ b/tools/testing/selftests/kvm/lib/x86/processor.c
> > @@ -687,12 +687,9 @@ void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code)
> > vcpu_regs_set(vcpu, ®s);
> > }
> > -struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
> > +vm_vaddr_t kvm_allocate_vcpu_stack(struct kvm_vm *vm)
> > {
> > - struct kvm_mp_state mp_state;
> > - struct kvm_regs regs;
> > vm_vaddr_t stack_vaddr;
> > - struct kvm_vcpu *vcpu;
> > stack_vaddr = __vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(),
> > DEFAULT_GUEST_STACK_VADDR_MIN,
> > @@ -713,6 +710,15 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
> > "__vm_vaddr_alloc() did not provide a page-aligned address");
> > stack_vaddr -= 8;
> > + return stack_vaddr;
> > +}
> > +
> > +struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
> > +{
> > + struct kvm_mp_state mp_state;
> > + struct kvm_regs regs;
> > + struct kvm_vcpu *vcpu;
> > +
> > vcpu = __vm_vcpu_add(vm, vcpu_id);
> > vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid());
> > vcpu_init_sregs(vm, vcpu);
> > @@ -721,7 +727,8 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
> > /* Setup guest general purpose registers */
> > vcpu_regs_get(vcpu, ®s);
> > regs.rflags = regs.rflags | 0x2;
> > - regs.rsp = stack_vaddr;
> > + if (vm->type != KVM_X86_TDX_VM)
> > + regs.rsp = kvm_allocate_vcpu_stack(vm);
>
> I am wondering if this could be more generic.
> I.e, make vcpu_regs_get() return the error code.
It would need to be a double-underscores variant, i.e. __vcpu_regs_get(). But
even then, I don't think it's worth getting that clever, because then to ensure
selftests aren't hitting KVM bugs, we'd want to assert that failure only occurs
for a TDX VM, i.e. we'd end up with:
if (__vcpu_regs_get(vcpu, ®s)) {
TEST_ASERT(is_tdx_vm(vm), "blah blah blah"
} else {
}
which doesn't really "save" anything relative to Sagi's proposed version of:
if (is_tdx_vm(vm)) {
vm_tdx_vcpu_add(vm, vcpu);
} else {
vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid());
vcpu_init_sregs(vm, vcpu);
vcpu_init_xcrs(vm, vcpu);
/* Setup guest general purpose registers */
vcpu_regs_get(vcpu, ®s);
regs.rflags = regs.rflags | 0x2;
regs.rsp = kvm_allocate_vcpu_stack(vm);
vcpu_regs_set(vcpu, ®s);
}
> If vcpu_regs_get() failed (for TDX, since it's guest state is protected, the
> ioctl will return -EINVAL), the vcpu_regs_set(), including the allocation for
> the vcpu stack, could be skipped.
>
> > vcpu_regs_set(vcpu, ®s);
> > /* Setup the MP state */
>
next prev parent reply other threads:[~2025-08-26 17:16 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-21 4:28 [PATCH v9 00/19] TDX KVM selftests Sagi Shahar
2025-08-21 4:28 ` [PATCH v9 01/19] KVM: selftests: Include overflow.h instead of redefining is_signed_type() Sagi Shahar
2025-08-21 14:16 ` Sean Christopherson
2025-08-21 14:37 ` Ira Weiny
2025-08-21 14:42 ` Sean Christopherson
2025-08-21 4:28 ` [PATCH v9 02/19] KVM: selftests: Allocate pgd in virt_map() as necessary Sagi Shahar
2025-08-21 14:45 ` Ira Weiny
2025-08-26 2:36 ` Binbin Wu
2025-08-21 4:28 ` [PATCH v9 03/19] KVM: selftests: Expose functions to get default sregs values Sagi Shahar
2025-08-26 2:36 ` Binbin Wu
2025-08-26 14:05 ` Sean Christopherson
2025-08-21 4:28 ` [PATCH v9 04/19] KVM: selftests: Expose function to allocate guest vCPU stack Sagi Shahar
2025-08-21 22:00 ` Ira Weiny
2025-08-21 22:24 ` Sagi Shahar
2025-08-26 5:39 ` Binbin Wu
2025-08-26 16:00 ` Sagi Shahar
2025-08-26 17:16 ` Sean Christopherson [this message]
2025-08-21 4:28 ` [PATCH v9 05/19] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Sagi Shahar
2025-08-21 22:05 ` Ira Weiny
2025-08-21 22:30 ` Sagi Shahar
2025-08-26 5:51 ` Binbin Wu
2025-08-26 16:04 ` Sagi Shahar
2025-08-21 4:28 ` [PATCH v9 06/19] KVM: selftests: Expose segment definitons to assembly files Sagi Shahar
2025-08-21 20:04 ` Ira Weiny
2025-08-21 4:29 ` [PATCH v9 07/19] KVM: selftests: Add kbuild definitons Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 08/19] KVM: selftests: Define structs to pass parameters to TDX boot code Sagi Shahar
2025-08-26 6:52 ` Binbin Wu
2025-08-26 16:10 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 09/19] KVM: selftests: Add " Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 10/19] KVM: selftests: Set up TDX boot code region Sagi Shahar
2025-08-25 5:32 ` Yan Zhao
2025-08-26 16:38 ` Sean Christopherson
2025-08-27 1:36 ` Yan Zhao
2025-08-21 4:29 ` [PATCH v9 11/19] KVM: selftests: Set up TDX boot parameters region Sagi Shahar
2025-08-26 8:36 ` Binbin Wu
2025-08-26 16:17 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 12/19] KVM: selftests: Add helper to initialize TDX VM Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 13/19] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Sagi Shahar
2025-08-26 9:22 ` Binbin Wu
2025-09-04 3:57 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 14/19] KVM: selftests: Add helpers to init TDX memory and finalize VM Sagi Shahar
2025-08-25 8:40 ` Yan Zhao
2025-08-25 19:02 ` Sagi Shahar
2025-08-26 1:07 ` Yan Zhao
2025-08-27 2:24 ` Binbin Wu
2025-08-27 2:44 ` Yan Zhao
2025-08-27 3:52 ` Yan Zhao
2025-08-21 4:29 ` [PATCH v9 15/19] KVM: selftests: Hook TDX support to vm and vcpu creation Sagi Shahar
2025-08-26 8:28 ` Chenyi Qiang
2025-08-26 16:12 ` Sagi Shahar
2025-08-26 17:31 ` Sean Christopherson
2025-08-26 20:16 ` Ira Weiny
2025-08-26 20:29 ` Sagi Shahar
2025-08-26 20:30 ` Sagi Shahar
2025-08-26 21:31 ` Sean Christopherson
2025-08-26 21:38 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 16/19] KVM: selftests: Add support for TDX TDCALL from guest Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 17/19] KVM: selftests: Add wrapper for TDX MMIO " Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 18/19] KVM: selftests: Add ucall support for TDX Sagi Shahar
2025-08-27 7:18 ` Binbin Wu
2025-09-02 15:45 ` Sean Christopherson
2025-09-03 1:07 ` Binbin Wu
2025-08-21 4:29 ` [PATCH v9 19/19] KVM: selftests: Add TDX lifecycle test Sagi Shahar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aK3r5cjLvF3vmJCi@google.com \
--to=seanjc@google.com \
--cc=ackerleytng@google.com \
--cc=afranji@google.com \
--cc=ajones@ventanamicro.com \
--cc=binbin.wu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=chenyi.qiang@intel.com \
--cc=erdemaktas@google.com \
--cc=ira.weiny@intel.com \
--cc=isaku.yamahata@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=oliver.upton@linux.dev \
--cc=pbonzini@redhat.com \
--cc=pratikrajesh.sampat@amd.com \
--cc=reinette.chatre@intel.com \
--cc=rick.p.edgecombe@intel.com \
--cc=runanwang@google.com \
--cc=sagis@google.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.