| 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 | */ | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 8 | #include <linux/linkage.h> | 
|  | 9 | #include <asm/dwarf2.h> | 
|  | 10 | #include <asm/calling.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 |  | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 12 | /* rdi:	arg1 ... normal C conventions. rax is saved/restored. */ | 
|  | 13 | .macro THUNK name, func, put_ret_addr_in_rdi=0 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 14 | .globl \name | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 15 | \name: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 | CFI_STARTPROC | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 17 |  | 
|  | 18 | /* this one pushes 9 elems, the next one would be %rIP */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 | SAVE_ARGS | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 20 |  | 
|  | 21 | .if \put_ret_addr_in_rdi | 
|  | 22 | movq_cfi_restore 9*8, rdi | 
|  | 23 | .endif | 
|  | 24 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | call \func | 
|  | 26 | jmp  restore | 
|  | 27 | CFI_ENDPROC | 
|  | 28 | .endm | 
|  | 29 |  | 
| Ingo Molnar | 6375e2b | 2006-07-03 00:24:45 -0700 | [diff] [blame] | 30 | #ifdef CONFIG_TRACE_IRQFLAGS | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 31 | THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 | 
|  | 32 | THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 | 
| Ingo Molnar | 6375e2b | 2006-07-03 00:24:45 -0700 | [diff] [blame] | 33 | #endif | 
| Peter Zijlstra | 10cd706 | 2007-10-11 22:11:12 +0200 | [diff] [blame] | 34 |  | 
|  | 35 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 36 | THUNK lockdep_sys_exit_thunk,lockdep_sys_exit | 
| Peter Zijlstra | 10cd706 | 2007-10-11 22:11:12 +0200 | [diff] [blame] | 37 | #endif | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 38 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 39 | /* SAVE_ARGS below is used only for the .cfi directives it contains. */ | 
|  | 40 | CFI_STARTPROC | 
|  | 41 | SAVE_ARGS | 
|  | 42 | restore: | 
|  | 43 | RESTORE_ARGS | 
| Borislav Petkov | 38e6b75 | 2011-05-31 22:21:54 +0200 | [diff] [blame] | 44 | ret | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | CFI_ENDPROC |