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 | */ | |
7 | ||
8 | #include <linux/linkage.h> | |
9 | ||
10 | #define ARCH_TRACE_IRQS_ON \ | |
11 | pushl %eax; \ | |
12 | pushl %ecx; \ | |
13 | pushl %edx; \ | |
14 | call trace_hardirqs_on; \ | |
15 | popl %edx; \ | |
16 | popl %ecx; \ | |
17 | popl %eax; | |
18 | ||
19 | #define ARCH_TRACE_IRQS_OFF \ | |
20 | pushl %eax; \ | |
21 | pushl %ecx; \ | |
22 | pushl %edx; \ | |
23 | call trace_hardirqs_off; \ | |
24 | popl %edx; \ | |
25 | popl %ecx; \ | |
26 | popl %eax; | |
27 | ||
28 | #ifdef CONFIG_TRACE_IRQFLAGS | |
29 | /* put return address in eax (arg1) */ | |
30 | .macro thunk_ra name,func | |
31 | .globl \name | |
32 | \name: | |
33 | pushl %eax | |
34 | pushl %ecx | |
35 | pushl %edx | |
36 | /* Place EIP in the arg1 */ | |
37 | movl 3*4(%esp), %eax | |
38 | call \func | |
39 | popl %edx | |
40 | popl %ecx | |
41 | popl %eax | |
42 | ret | |
43 | .endm | |
44 | ||
45 | thunk_ra trace_hardirqs_on_thunk,trace_hardirqs_on_caller | |
46 | thunk_ra trace_hardirqs_off_thunk,trace_hardirqs_off_caller | |
47 | #endif |