Rewrite hv_tdx_hypercall() in assembly to remove one more __tdx_hypercall() user. tdvmcall_trampoline() cannot be used here as Hyper-V uses R8 and RDX to pass down parameters which is incompatible with tdvmcall_trampoline() The rewrite cuts code bloat substantially: Function old new delta hv_tdx_hypercall 171 42 -129 Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> --- arch/x86/coco/tdx/tdcall.S | 30 ++++++++++++++++++++++++++++++ arch/x86/hyperv/ivm.c | 14 -------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/arch/x86/coco/tdx/tdcall.S b/arch/x86/coco/tdx/tdcall.S index 269e5789672a..5b60b9c8799f 100644 --- a/arch/x86/coco/tdx/tdcall.S +++ b/arch/x86/coco/tdx/tdcall.S @@ -138,3 +138,33 @@ SYM_FUNC_START(tdvmcall_report_fatal_error) ud2 SYM_FUNC_END(tdvmcall_report_fatal_error) + +#ifdef CONFIG_HYPERV +/* + * hv_tdx_hypercall() - Issue Hyper-V hypercall + * + * RDI - Hypercall ID + * RSI - Parameter 1 + * RCX - Parameter 2 + */ +SYM_FUNC_START(hv_tdx_hypercall) + movq %rdi, %r10 + movq %rsi, %rdx + movq %rcx, %r8 + + movq $TDG_VP_VMCALL, %rax + movq $(TDX_R8 | TDX_R10 | TDX_RDX), %rcx + + tdcall + + /* TDG.VP.VMCALL never fails on correct use. Panic if it fails. */ + testq %rax, %rax + jnz .Lpanic_hv + + movq %r11, %rax + + RET +.Lpanic_hv: + ud2 +SYM_FUNC_END(hv_tdx_hypercall) +#endif diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c index 18d0892d9fc4..562980e19d68 100644 --- a/arch/x86/hyperv/ivm.c +++ b/arch/x86/hyperv/ivm.c @@ -401,20 +401,6 @@ static void hv_tdx_msr_read(u64 msr, u64 *val) if (WARN_ONCE(ret, "Failed to emulate MSR read: %lld\n", ret)) *val = 0; } - -u64 hv_tdx_hypercall(u64 control, u64 param1, u64 param2) -{ - struct tdx_module_args args = { }; - - args.r10 = control; - args.rdx = param1; - args.r8 = param2; - - (void)__tdx_hypercall(&args); - - return args.r11; -} - #else static inline void hv_tdx_msr_write(u64 msr, u64 value) {} static inline void hv_tdx_msr_read(u64 msr, u64 *value) {} -- 2.43.0