On 10/2/2026 3:37 AM, Lisa Wang wrote: > From: Erdem Aktas <[email protected]> > > TDX VMs need to notify the host, e.g. ucall. Add tdvmcall() to allow VMs > to issue TDG.VP.VMCALL with a single function call instead of > open-coding TDVMCALL registers setup at every call site. > > The helper makes standard GHCI TDVMCALLs: the caller passes the GHCI > sub-function and up to four arguments and returns the TDVMCALL status > from R10. > > Co-developed-by: Sagi Shahar <[email protected]> > Signed-off-by: Sagi Shahar <[email protected]> > Co-developed-by: Lisa Wang <[email protected]> > Signed-off-by: Lisa Wang <[email protected]> > Signed-off-by: Erdem Aktas <[email protected]> > Reviewed-by: Ackerley Tng <[email protected]>
Reviewed-by: Xiaoyao Li <[email protected]> > --- > tools/testing/selftests/kvm/Makefile.kvm | 1 + > tools/testing/selftests/kvm/include/x86/tdx/tdx.h | 9 ++++++ > tools/testing/selftests/kvm/lib/x86/tdx/tdx.S | 39 > +++++++++++++++++++++++ > 3 files changed, 49 insertions(+) > > diff --git a/tools/testing/selftests/kvm/Makefile.kvm > b/tools/testing/selftests/kvm/Makefile.kvm > index 9464168e361a..495de8ef8166 100644 > --- a/tools/testing/selftests/kvm/Makefile.kvm > +++ b/tools/testing/selftests/kvm/Makefile.kvm > @@ -34,6 +34,7 @@ LIBKVM_x86 += lib/x86/tdx/tdx_util.c > LIBKVM_x86 += lib/x86/ucall.c > LIBKVM_x86 += lib/x86/vmx.c > LIBKVM_x86 += lib/x86/tdx/td_boot.S > +LIBKVM_x86 += lib/x86/tdx/tdx.S > > LIBKVM_arm64 += lib/arm64/gic.c > LIBKVM_arm64 += lib/arm64/gic_v3.c > diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx.h > b/tools/testing/selftests/kvm/include/x86/tdx/tdx.h > new file mode 100644 > index 000000000000..d41a1efc8a63 > --- /dev/null > +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx.h > @@ -0,0 +1,9 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +#ifndef SELFTEST_KVM_TDX_TDX_H > +#define SELFTEST_KVM_TDX_TDX_H > + > +#include <linux/types.h> > + > +u64 __tdvmcall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15); > + > +#endif /* SELFTEST_KVM_TDX_TDX_H */ > diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx.S > b/tools/testing/selftests/kvm/lib/x86/tdx/tdx.S > new file mode 100644 > index 000000000000..e3f0f7f2232b > --- /dev/null > +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx.S > @@ -0,0 +1,39 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > + > +.globl __tdvmcall > +/* > + * u64 __tdvmcall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15) > + */ > +__tdvmcall: > + push %r12 > + push %r13 > + push %r14 > + push %r15 > + > + /* > + * Map C ABI fast arguments to TDX GHCI payload registers > + * RDI=fn, RSI=r12, RDX=r13, RCX=r14, R8=r15 > + */ > + mov %rdi, %r11 > + mov %rsi, %r12 > + mov %rdx, %r13 > + mov %rcx, %r14 > + mov %r8, %r15 > + > + mov $0, %rax /* TDCALL leaf 0: TDG.VP.VMCALL */ > + mov $0xFC00, %rcx /* Expose R10-R15 */ > + mov $0, %r10 /* Standard GHCI call */ > + > + /* TDCALL instruction */ > + .byte 0x66, 0x0f, 0x01, 0xcc > + > + /* Extract status */ > + mov %r10, %rax > + > + pop %r15 > + pop %r14 > + pop %r13 > + pop %r12 > + ret > + > +.section .note.GNU-stack,"",%progbits >

