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 48