Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 1 | /* |
| 2 | * Trampoline to trace irqs off. (otherwise CALLER_ADDR1 might crash) |
| 3 | * Copyright 2008 by Steven Rostedt, Red Hat, Inc |
| 4 | * (inspired by Andi Kleen's thunk_64.S) |
| 5 | * Subject to the GNU public license, v.2. No warranty of any kind. |
| 6 | */ |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 7 | #include <linux/linkage.h> |
Masami Hiramatsu | 98def1d | 2014-04-17 17:17:26 +0900 | [diff] [blame] | 8 | #include <asm/asm.h> |
Al Viro | 784d569 | 2016-01-11 11:04:34 -0500 | [diff] [blame] | 9 | #include <asm/export.h> |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 10 | |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 11 | /* put return address in eax (arg1) */ |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 12 | .macro THUNK name, func, put_ret_addr_in_eax=0 |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 13 | .globl \name |
| 14 | \name: |
Ingo Molnar | 131484c | 2015-05-28 12:21:47 +0200 | [diff] [blame] | 15 | pushl %eax |
| 16 | pushl %ecx |
| 17 | pushl %edx |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 18 | |
| 19 | .if \put_ret_addr_in_eax |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 20 | /* Place EIP in the arg1 */ |
| 21 | movl 3*4(%esp), %eax |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 22 | .endif |
| 23 | |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 24 | call \func |
Ingo Molnar | 131484c | 2015-05-28 12:21:47 +0200 | [diff] [blame] | 25 | popl %edx |
| 26 | popl %ecx |
| 27 | popl %eax |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 28 | ret |
Masami Hiramatsu | 98def1d | 2014-04-17 17:17:26 +0900 | [diff] [blame] | 29 | _ASM_NOKPROBE(\name) |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 30 | .endm |
| 31 | |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 32 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 33 | THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 |
| 34 | THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 |
Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 35 | #endif |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 36 | |
| 37 | #ifdef CONFIG_PREEMPT |
| 38 | THUNK ___preempt_schedule, preempt_schedule |
Frederic Weisbecker | 4eaca0a | 2015-06-04 17:39:08 +0200 | [diff] [blame] | 39 | THUNK ___preempt_schedule_notrace, preempt_schedule_notrace |
Al Viro | 784d569 | 2016-01-11 11:04:34 -0500 | [diff] [blame] | 40 | EXPORT_SYMBOL(___preempt_schedule) |
| 41 | EXPORT_SYMBOL(___preempt_schedule_notrace) |
Oleg Nesterov | 0ad6e3c | 2014-09-21 20:41:53 +0200 | [diff] [blame] | 42 | #endif |
| 43 | |