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
                                                       ^
The patch actually adds __tdvmcall().

> 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]>

Also one nit below.

Otherwise,
Reviewed-by: Binbin Wu <[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 */

Nit:
xorl is more used then moving 0 to a register.

xorl %eax,  %eax
...
xorl %r10d, %r10d


> +
> +     /* 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
> 


Reply via email to