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_PREEMPTION 46 THUNK preempt_schedule_thunk, preempt_schedule 47 THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace 48 EXPORT_SYMBOL(preempt_schedule_thunk) 49 EXPORT_SYMBOL(preempt_schedule_notrace_thunk) 50#endif 51 52#if defined(CONFIG_TRACE_IRQFLAGS) \ 53 || defined(CONFIG_PREEMPTION) 54SYM_CODE_START_LOCAL_NOALIGN(.L_restore) 55 popq %r11 56 popq %r10 57 popq %r9 58 popq %r8 59 popq %rax 60 popq %rcx 61 popq %rdx 62 popq %rsi 63 popq %rdi 64 popq %rbp 65 ret 66 _ASM_NOKPROBE(.L_restore) 67SYM_CODE_END(.L_restore) 68#endif 69