| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Trampoline to trace irqs off. (otherwise CALLER_ADDR1 might crash) | 
					
						
							|  |  |  |  * Copyright 2008 by Steven Rostedt, Red Hat, Inc | 
					
						
							|  |  |  |  *  (inspired by Andi Kleen's thunk_64.S) | 
					
						
							|  |  |  |  * Subject to the GNU public license, v.2. No warranty of any kind. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 	#include <linux/linkage.h> | 
					
						
							| 
									
										
										
										
											2014-04-17 17:17:26 +09:00
										 |  |  | 	#include <asm/asm.h> | 
					
						
							| 
									
										
										
										
											2014-09-24 08:41:30 +01:00
										 |  |  | 	#include <asm/dwarf2.h> | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* put return address in eax (arg1) */ | 
					
						
							| 
									
										
										
										
											2014-09-21 20:41:53 +02:00
										 |  |  | 	.macro THUNK name, func, put_ret_addr_in_eax=0 | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 	.globl \name | 
					
						
							|  |  |  | \name: | 
					
						
							| 
									
										
										
										
											2014-09-24 08:41:30 +01:00
										 |  |  | 	CFI_STARTPROC | 
					
						
							|  |  |  | 	pushl_cfi %eax | 
					
						
							|  |  |  | 	CFI_REL_OFFSET eax, 0 | 
					
						
							|  |  |  | 	pushl_cfi %ecx | 
					
						
							|  |  |  | 	CFI_REL_OFFSET ecx, 0 | 
					
						
							|  |  |  | 	pushl_cfi %edx | 
					
						
							|  |  |  | 	CFI_REL_OFFSET edx, 0 | 
					
						
							| 
									
										
										
										
											2014-09-21 20:41:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.if \put_ret_addr_in_eax | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 	/* Place EIP in the arg1 */ | 
					
						
							|  |  |  | 	movl 3*4(%esp), %eax | 
					
						
							| 
									
										
										
										
											2014-09-21 20:41:53 +02:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 	call \func | 
					
						
							| 
									
										
										
										
											2014-09-24 08:41:30 +01:00
										 |  |  | 	popl_cfi %edx | 
					
						
							|  |  |  | 	CFI_RESTORE edx | 
					
						
							|  |  |  | 	popl_cfi %ecx | 
					
						
							|  |  |  | 	CFI_RESTORE ecx | 
					
						
							|  |  |  | 	popl_cfi %eax | 
					
						
							|  |  |  | 	CFI_RESTORE eax | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2014-09-24 08:41:30 +01:00
										 |  |  | 	CFI_ENDPROC | 
					
						
							| 
									
										
										
										
											2014-04-17 17:17:26 +09:00
										 |  |  | 	_ASM_NOKPROBE(\name) | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | 	.endm | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-21 20:41:53 +02:00
										 |  |  | #ifdef CONFIG_TRACE_IRQFLAGS | 
					
						
							|  |  |  | 	THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 | 
					
						
							|  |  |  | 	THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_PREEMPT | 
					
						
							|  |  |  | 	THUNK ___preempt_schedule, preempt_schedule | 
					
						
							|  |  |  | #ifdef CONFIG_CONTEXT_TRACKING | 
					
						
							|  |  |  | 	THUNK ___preempt_schedule_context, preempt_schedule_context | 
					
						
							| 
									
										
										
										
											2008-05-12 21:20:42 +02:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2014-09-21 20:41:53 +02:00
										 |  |  | #endif | 
					
						
							|  |  |  | 
 |