Steven Rostedt | 81d68a9 | 2008-05-12 21:20:42 +0200 | [diff] [blame] | 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 |