| 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 | */ |
| 7 | #include <linux/linkage.h> |
| 8 | #include <asm/asm.h> |
| 9 | |
| 10 | /* put return address in eax (arg1) */ |
| 11 | .macro THUNK name, func, put_ret_addr_in_eax=0 |
| 12 | .globl \name |
| 13 | \name: |
| 14 | pushl %eax |
| 15 | pushl %ecx |
| 16 | pushl %edx |
| 17 | |
| 18 | .if \put_ret_addr_in_eax |
| 19 | /* Place EIP in the arg1 */ |
| 20 | movl 3*4(%esp), %eax |
| 21 | .endif |
| 22 | |
| 23 | call \func |
| 24 | popl %edx |
| 25 | popl %ecx |
| 26 | popl %eax |
| 27 | ret |
| 28 | _ASM_NOKPROBE(\name) |
| 29 | .endm |
| 30 | |
| 31 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 32 | THUNK trace_hardirqs_on_thunk,trace_hardirqs_on_caller,1 |
| 33 | THUNK trace_hardirqs_off_thunk,trace_hardirqs_off_caller,1 |
| 34 | #endif |
| 35 | |
| 36 | #ifdef CONFIG_PREEMPT |
| 37 | THUNK ___preempt_schedule, preempt_schedule |
| 38 | THUNK ___preempt_schedule_notrace, preempt_schedule_notrace |
| 39 | #endif |
| 40 | |