Commit | Line | Data |
---|---|---|
81d68a96 SR |
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 | */ | |
81d68a96 | 7 | #include <linux/linkage.h> |
98def1de | 8 | #include <asm/asm.h> |
784d5699 | 9 | #include <asm/export.h> |
81d68a96 | 10 | |
81d68a96 | 11 | /* put return address in eax (arg1) */ |
0ad6e3c5 | 12 | .macro THUNK name, func, put_ret_addr_in_eax=0 |
81d68a96 SR |
13 | .globl \name |
14 | \name: | |
131484c8 IM |
15 | pushl %eax |
16 | pushl %ecx | |
17 | pushl %edx | |
0ad6e3c5 ON |
18 | |
19 | .if \put_ret_addr_in_eax | |
81d68a96 SR |
20 | /* Place EIP in the arg1 */ |
21 | movl 3*4(%esp), %eax | |
0ad6e3c5 ON |
22 | .endif |
23 | ||
81d68a96 | 24 | call \func |
131484c8 IM |
25 | popl %edx |
26 | popl %ecx | |
27 | popl %eax | |
81d68a96 | 28 | ret |
98def1de | 29 | _ASM_NOKPROBE(\name) |
81d68a96 SR |
30 | .endm |
31 | ||
0ad6e3c5 ON |
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 | |
35 | #endif | |
36 | ||
37 | #ifdef CONFIG_PREEMPT | |
38 | THUNK ___preempt_schedule, preempt_schedule | |
4eaca0a8 | 39 | THUNK ___preempt_schedule_notrace, preempt_schedule_notrace |
784d5699 AV |
40 | EXPORT_SYMBOL(___preempt_schedule) |
41 | EXPORT_SYMBOL(___preempt_schedule_notrace) | |
0ad6e3c5 ON |
42 | #endif |
43 |