| Andi Kleen | cc1e684 | 2006-09-26 10:52:29 +0200 | [diff] [blame] | 1 | /* | 
|  | 2 | * Save registers before calling assembly functions. This avoids | 
|  | 3 | * disturbance of register allocation in some inline assembly constructs. | 
|  | 4 | * Copyright 2001,2002 by Andi Kleen, SuSE Labs. | 
| Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 5 | * Added trace_hardirqs callers - Copyright 2007 Steven Rostedt, Red Hat, Inc. | 
| Andi Kleen | cc1e684 | 2006-09-26 10:52:29 +0200 | [diff] [blame] | 6 | * Subject to the GNU public license, v.2. No warranty of any kind. | 
|  | 7 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 | #include <linux/linkage.h> | 
|  | 10 | #include <asm/dwarf2.h> | 
|  | 11 | #include <asm/calling.h> | 
|  | 12 | #include <asm/rwlock.h> | 
|  | 13 |  | 
|  | 14 | /* rdi:	arg1 ... normal C conventions. rax is saved/restored. */ | 
|  | 15 | .macro thunk name,func | 
|  | 16 | .globl \name | 
|  | 17 | \name: | 
|  | 18 | CFI_STARTPROC | 
|  | 19 | SAVE_ARGS | 
|  | 20 | call \func | 
|  | 21 | jmp  restore | 
|  | 22 | CFI_ENDPROC | 
|  | 23 | .endm | 
|  | 24 |  | 
|  | 25 | /* rdi:	arg1 ... normal C conventions. rax is passed from C. */ | 
|  | 26 | .macro thunk_retrax name,func | 
|  | 27 | .globl \name | 
|  | 28 | \name: | 
|  | 29 | CFI_STARTPROC | 
|  | 30 | SAVE_ARGS | 
|  | 31 | call \func | 
|  | 32 | jmp  restore_norax | 
|  | 33 | CFI_ENDPROC | 
|  | 34 | .endm | 
|  | 35 |  | 
|  | 36 |  | 
| Sam Ravnborg | c6c2d7a | 2008-01-30 13:33:37 +0100 | [diff] [blame] | 37 | .section .sched.text, "ax" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM | 
|  | 39 | thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed | 
|  | 40 | thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed | 
|  | 41 | thunk rwsem_wake_thunk,rwsem_wake | 
|  | 42 | thunk rwsem_downgrade_thunk,rwsem_downgrade_wake | 
|  | 43 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 44 |  | 
| Ingo Molnar | 6375e2b | 2006-07-03 00:24:45 -0700 | [diff] [blame] | 45 | #ifdef CONFIG_TRACE_IRQFLAGS | 
| Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 46 | /* put return address in rdi (arg1) */ | 
|  | 47 | .macro thunk_ra name,func | 
|  | 48 | .globl \name | 
|  | 49 | \name: | 
|  | 50 | CFI_STARTPROC | 
|  | 51 | SAVE_ARGS | 
|  | 52 | /* SAVE_ARGS pushs 9 elements */ | 
|  | 53 | /* the next element would be the rip */ | 
|  | 54 | movq 9*8(%rsp), %rdi | 
|  | 55 | call \func | 
|  | 56 | jmp  restore | 
|  | 57 | CFI_ENDPROC | 
|  | 58 | .endm | 
|  | 59 |  | 
|  | 60 | thunk_ra trace_hardirqs_on_thunk,trace_hardirqs_on_caller | 
|  | 61 | thunk_ra trace_hardirqs_off_thunk,trace_hardirqs_off_caller | 
| Ingo Molnar | 6375e2b | 2006-07-03 00:24:45 -0700 | [diff] [blame] | 62 | #endif | 
| Peter Zijlstra | 10cd706 | 2007-10-11 22:11:12 +0200 | [diff] [blame] | 63 |  | 
|  | 64 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 
|  | 65 | thunk lockdep_sys_exit_thunk,lockdep_sys_exit | 
|  | 66 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 |  | 
|  | 68 | /* SAVE_ARGS below is used only for the .cfi directives it contains. */ | 
|  | 69 | CFI_STARTPROC | 
|  | 70 | SAVE_ARGS | 
|  | 71 | restore: | 
|  | 72 | RESTORE_ARGS | 
|  | 73 | ret | 
|  | 74 | CFI_ENDPROC | 
|  | 75 |  | 
|  | 76 | CFI_STARTPROC | 
|  | 77 | SAVE_ARGS | 
|  | 78 | restore_norax: | 
|  | 79 | RESTORE_ARGS 1 | 
|  | 80 | ret | 
|  | 81 | CFI_ENDPROC |