| 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 |