/* SPDX-License-Identifier: GPL-2.0-only */ /* * Save registers before calling assembly functions. This avoids * disturbance of register allocation in some inline assembly constructs. * Copyright 2001,2002 by Andi Kleen, SuSE Labs. * Added trace_hardirqs callers - Copyright 2007 Steven Rostedt, Red Hat, Inc. */ #include <linux/linkage.h> #include "calling.h" #include <asm/asm.h> #include <asm/export.h> /* rdi: arg1 ... normal C conventions. rax is saved/restored. */ .macro THUNK name, func, put_ret_addr_in_rdi=0 ENTRY(\name) pushq %rbp movq %rsp, %rbp pushq %rdi pushq %rsi pushq %rdx pushq %rcx pushq %rax pushq %r8 pushq %r9 pushq %r10 pushq %r11 .if \put_ret_addr_in_rdi /* 8(%rbp) is return addr on stack */ movq 8(%rbp), %rdi .endif call \func jmp .L_restore ENDPROC(\name) _ASM_NOKPROBE(\name) .endm #ifdef [31mCONFIG_TRACE_IRQFLAGS[0m THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 #endif #ifdef [31mCONFIG_DEBUG_LOCK_ALLOC[0m THUNK lockdep_sys_exit_thunk,lockdep_sys_exit #endif #ifdef [31mCONFIG_PREEMPTION[0m THUNK ___preempt_schedule, preempt_schedule THUNK ___preempt_schedule_notrace, preempt_schedule_notrace EXPORT_SYMBOL(___preempt_schedule) EXPORT_SYMBOL(___preempt_schedule_notrace) #endif #if defined([31mCONFIG_TRACE_IRQFLAGS[0m) \ || defined([31mCONFIG_DEBUG_LOCK_ALLOC[0m) \ || defined([31mCONFIG_PREEMPTION[0m) .L_restore: popq %r11 popq %r10 popq %r9 popq %r8 popq %rax popq %rcx popq %rdx popq %rsi popq %rdi popq %rbp ret _ASM_NOKPROBE(.L_restore) #endif |