1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Save registers before calling assembly functions. This avoids 4 * disturbance of register allocation in some inline assembly constructs. 5 * Copyright 2001,2002 by Andi Kleen, SuSE Labs. 6 * Added trace_hardirqs callers - Copyright 2007 Steven Rostedt, Red Hat, Inc. 7 */ 8#include <linux/linkage.h> 9#include "calling.h" 10#include <asm/asm.h> 11#include <asm/export.h> 12 13 /* rdi: arg1 ... normal C conventions. rax is saved/restored. */ 14 .macro THUNK name, func, put_ret_addr_in_rdi=0 15SYM_FUNC_START_NOALIGN(\name) 16 pushq %rbp 17 movq %rsp, %rbp 18 19 pushq %rdi 20 pushq %rsi 21 pushq %rdx 22 pushq %rcx 23 pushq %rax 24 pushq %r8 25 pushq %r9 26 pushq %r10 27 pushq %r11 28 29 .if \put_ret_addr_in_rdi 30 /* 8(%rbp) is return addr on stack */ 31 movq 8(%rbp), %rdi 32 .endif 33 34 call \func 35 jmp .L_restore 36SYM_FUNC_END(\name) 37 _ASM_NOKPROBE(\name) 38 .endm 39 40#ifdef CONFIG_TRACE_IRQFLAGS 41 THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 42 THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 43#endif 44 45#ifdef CONFIG_DEBUG_LOCK_ALLOC 46 THUNK lockdep_sys_exit_thunk,lockdep_sys_exit 47#endif 48 49#ifdef CONFIG_PREEMPTION 50 THUNK ___preempt_schedule, preempt_schedule 51 THUNK ___preempt_schedule_notrace, preempt_schedule_notrace 52 EXPORT_SYMBOL(___preempt_schedule) 53 EXPORT_SYMBOL(___preempt_schedule_notrace) 54#endif 55 56#if defined(CONFIG_TRACE_IRQFLAGS) \ 57 || defined(CONFIG_DEBUG_LOCK_ALLOC) \ 58 || defined(CONFIG_PREEMPTION) 59SYM_CODE_START_LOCAL_NOALIGN(.L_restore) 60 popq %r11 61 popq %r10 62 popq %r9 63 popq %r8 64 popq %rax 65 popq %rcx 66 popq %rdx 67 popq %rsi 68 popq %rdi 69 popq %rbp 70 ret 71 _ASM_NOKPROBE(.L_restore) 72SYM_CODE_END(.L_restore) 73#endif 74