Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[linux-2.6] / arch / x86 / lib / thunk_32.S
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