Introduce a set of macros that allow to generate wrappers for TDCALL leafs. There are three macros differentiated by number of return parameters. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> --- arch/x86/include/asm/shared/tdx.h | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/shared/tdx.h index 46c299dc9cf0..70190ebc63ca 100644 --- a/arch/x86/include/asm/shared/tdx.h +++ b/arch/x86/include/asm/shared/tdx.h @@ -80,6 +80,64 @@ #include <linux/compiler_attributes.h> +#define TDCALL ".byte 0x66,0x0f,0x01,0xcc\n\t" + +#define TDCALL_0(reason, in_rcx, in_rdx, in_r8, in_r9) \ +({ \ + long __ret; \ + \ + asm( \ + "movq %[r8_in], %%r8\n\t" \ + "movq %[r9_in], %%r9\n\t" \ + TDCALL \ + : "=a" (__ret), ASM_CALL_CONSTRAINT \ + : "a" (reason), "c" (in_rcx), "d" (in_rdx), \ + [r8_in] "rm" ((u64)in_r8), [r9_in] "rm" ((u64)in_r9) \ + : "r8", "r9" \ + ); \ + __ret; \ +}) + +#define TDCALL_1(reason, in_rcx, in_rdx, in_r8, in_r9, out_r8) \ +({ \ + long __ret; \ + \ + asm( \ + "movq %[r8_in], %%r8\n\t" \ + "movq %[r9_in], %%r9\n\t" \ + TDCALL \ + "movq %%r8, %[r8_out]\n\t" \ + : "=a" (__ret), ASM_CALL_CONSTRAINT, [r8_out] "=rm" (out_r8) \ + : "a" (reason), "c" (in_rcx), "d" (in_rdx), \ + [r8_in] "rm" ((u64)in_r8), [r9_in] "rm" ((u64)in_r9) \ + : "r8", "r9" \ + ); \ + __ret; \ +}) + +#define TDCALL_5(reason, in_rcx, in_rdx, in_r8, in_r9, \ + out_rcx, out_rdx, out_r8, out_r9, out_r10) \ +({ \ + long __ret; \ + \ + asm( \ + "movq %[r8_in], %%r8\n\t" \ + "movq %[r9_in], %%r9\n\t" \ + TDCALL \ + "movq %%r8, %[r8_out]\n\t" \ + "movq %%r9, %[r9_out]\n\t" \ + "movq %%r10, %[r10_out]\n\t" \ + : "=a" (__ret), ASM_CALL_CONSTRAINT, \ + "=c" (out_rcx), "=d" (out_rdx), \ + [r8_out] "=rm" (out_r8), [r9_out] "=rm" (out_r9), \ + [r10_out] "=rm" (out_r10) \ + : "a" (reason), "c" (in_rcx), "d" (in_rdx), \ + [r8_in] "rm" ((u64)in_r8), [r9_in] "rm" ((u64)in_r9) \ + : "r8", "r9", "r10" \ + ); \ + __ret; \ +}) + #define TDVMCALL_0(reason, in_r12, in_r13, in_r14, in_r15) \ ({ \ long __ret; \ -- 2.43.0