Use newly introduced TDVMCALL_0() instead of __tdx_hypercall() to handle HLT instruction emulation. It cuts code bloat substantially: Function old new delta tdx_safe_halt 58 88 +30 tdx_handle_virt_exception 2023 2052 +29 __pfx___halt 16 - -16 __halt 171 - -171 Total: Before=6350, After=6222, chg -2.02% Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> --- arch/x86/coco/tdx/tdx.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 6e0e5648ebd1..dce7d6f9f895 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -350,18 +350,12 @@ static int ve_instr_len(struct ve_info *ve) } } -static u64 __cpuidle __halt(const bool irq_disabled) +static int handle_halt(struct ve_info *ve) { - struct tdx_module_args args = { - .r10 = TDX_HYPERCALL_STANDARD, - .r11 = hcall_func(EXIT_REASON_HLT), - .r12 = irq_disabled, - }; - /* * Emulate HLT operation via hypercall. More info about ABI * can be found in TDX Guest-Host-Communication Interface - * (GHCI), section 3.8 TDG.VP.VMCALL<Instruction.HLT>. + * (GHCI), section TDG.VP.VMCALL<Instruction.HLT>. * * The VMM uses the "IRQ disabled" param to understand IRQ * enabled status (RFLAGS.IF) of the TD guest and to determine @@ -370,14 +364,7 @@ static u64 __cpuidle __halt(const bool irq_disabled) * can keep the vCPU in virtual HLT, even if an IRQ is * pending, without hanging/breaking the guest. */ - return __tdx_hypercall(&args); -} - -static int handle_halt(struct ve_info *ve) -{ - const bool irq_disabled = irqs_disabled(); - - if (__halt(irq_disabled)) + if (TDVMCALL_0(hcall_func(EXIT_REASON_HLT), irqs_disabled(), 0, 0, 0)) return -EIO; return ve_instr_len(ve); @@ -385,13 +372,9 @@ static int handle_halt(struct ve_info *ve) void __cpuidle tdx_safe_halt(void) { - const bool irq_disabled = false; - - /* - * Use WARN_ONCE() to report the failure. - */ - if (__halt(irq_disabled)) - WARN_ONCE(1, "HLT instruction emulation failed\n"); + /* See comment in handle_halt() */ + WARN_ONCE(TDVMCALL_0(hcall_func(EXIT_REASON_HLT), false, 0, 0, 0), + "HLT instruction emulation failed"); } static int read_msr(struct pt_regs *regs, struct ve_info *ve) -- 2.43.0