|  | /* | 
|  | * 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. | 
|  | * Subject to the GNU public license, v.2. No warranty of any kind. | 
|  | */ | 
|  |  | 
|  | #include <linux/linkage.h> | 
|  | #include <asm/dwarf2.h> | 
|  | #include <asm/calling.h> | 
|  | #include <asm/rwlock.h> | 
|  |  | 
|  | /* rdi:	arg1 ... normal C conventions. rax is saved/restored. */ | 
|  | .macro thunk name,func | 
|  | .globl \name | 
|  | \name: | 
|  | CFI_STARTPROC | 
|  | SAVE_ARGS | 
|  | call \func | 
|  | jmp  restore | 
|  | CFI_ENDPROC | 
|  | .endm | 
|  |  | 
|  | /* rdi:	arg1 ... normal C conventions. rax is passed from C. */ | 
|  | .macro thunk_retrax name,func | 
|  | .globl \name | 
|  | \name: | 
|  | CFI_STARTPROC | 
|  | SAVE_ARGS | 
|  | call \func | 
|  | jmp  restore_norax | 
|  | CFI_ENDPROC | 
|  | .endm | 
|  |  | 
|  |  | 
|  | .section .sched.text, "ax" | 
|  | #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM | 
|  | thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed | 
|  | thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed | 
|  | thunk rwsem_wake_thunk,rwsem_wake | 
|  | thunk rwsem_downgrade_thunk,rwsem_downgrade_wake | 
|  | #endif | 
|  |  | 
|  | #ifdef CONFIG_TRACE_IRQFLAGS | 
|  | /* put return address in rdi (arg1) */ | 
|  | .macro thunk_ra name,func | 
|  | .globl \name | 
|  | \name: | 
|  | CFI_STARTPROC | 
|  | SAVE_ARGS | 
|  | /* SAVE_ARGS pushs 9 elements */ | 
|  | /* the next element would be the rip */ | 
|  | movq 9*8(%rsp), %rdi | 
|  | call \func | 
|  | jmp  restore | 
|  | CFI_ENDPROC | 
|  | .endm | 
|  |  | 
|  | thunk_ra trace_hardirqs_on_thunk,trace_hardirqs_on_caller | 
|  | thunk_ra trace_hardirqs_off_thunk,trace_hardirqs_off_caller | 
|  | #endif | 
|  |  | 
|  | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 
|  | thunk lockdep_sys_exit_thunk,lockdep_sys_exit | 
|  | #endif | 
|  |  | 
|  | /* SAVE_ARGS below is used only for the .cfi directives it contains. */ | 
|  | CFI_STARTPROC | 
|  | SAVE_ARGS | 
|  | restore: | 
|  | RESTORE_ARGS | 
|  | ret | 
|  | CFI_ENDPROC | 
|  |  | 
|  | CFI_STARTPROC | 
|  | SAVE_ARGS | 
|  | restore_norax: | 
|  | RESTORE_ARGS 1 | 
|  | ret | 
|  | CFI_ENDPROC |