diff options
Diffstat (limited to 'arch/x86/lib/thunk_32.S')
-rw-r--r-- | arch/x86/lib/thunk_32.S | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/arch/x86/lib/thunk_32.S b/arch/x86/lib/thunk_32.S index 28f85c916712..e9acf5f4fc92 100644 --- a/arch/x86/lib/thunk_32.S +++ b/arch/x86/lib/thunk_32.S | |||
@@ -7,16 +7,19 @@ | |||
7 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
8 | #include <asm/asm.h> | 8 | #include <asm/asm.h> |
9 | 9 | ||
10 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
11 | /* put return address in eax (arg1) */ | 10 | /* put return address in eax (arg1) */ |
12 | .macro thunk_ra name,func | 11 | .macro THUNK name, func, put_ret_addr_in_eax=0 |
13 | .globl \name | 12 | .globl \name |
14 | \name: | 13 | \name: |
15 | pushl %eax | 14 | pushl %eax |
16 | pushl %ecx | 15 | pushl %ecx |
17 | pushl %edx | 16 | pushl %edx |
17 | |||
18 | .if \put_ret_addr_in_eax | ||
18 | /* Place EIP in the arg1 */ | 19 | /* Place EIP in the arg1 */ |
19 | movl 3*4(%esp), %eax | 20 | movl 3*4(%esp), %eax |
21 | .endif | ||
22 | |||
20 | call \func | 23 | call \func |
21 | popl %edx | 24 | popl %edx |
22 | popl %ecx | 25 | popl %ecx |
@@ -25,6 +28,15 @@ | |||
25 | _ASM_NOKPROBE(\name) | 28 | _ASM_NOKPROBE(\name) |
26 | .endm | 29 | .endm |
27 | 30 | ||
28 | thunk_ra trace_hardirqs_on_thunk,trace_hardirqs_on_caller | 31 | #ifdef CONFIG_TRACE_IRQFLAGS |
29 | thunk_ra trace_hardirqs_off_thunk,trace_hardirqs_off_caller | 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 | #ifdef CONFIG_CONTEXT_TRACKING | ||
39 | THUNK ___preempt_schedule_context, preempt_schedule_context | ||
30 | #endif | 40 | #endif |
41 | #endif | ||
42 | |||