1 #ifndef _ASM_X86_FTRACE_H 2 #define _ASM_X86_FTRACE_H 3 4 #ifdef __ASSEMBLY__ 5 6 .macro MCOUNT_SAVE_FRAME 7 /* taken from glibc */ 8 subq $0x38, %rsp 9 movq %rax, (%rsp) 10 movq %rcx, 8(%rsp) 11 movq %rdx, 16(%rsp) 12 movq %rsi, 24(%rsp) 13 movq %rdi, 32(%rsp) 14 movq %r8, 40(%rsp) 15 movq %r9, 48(%rsp) 16 .endm 17 18 .macro MCOUNT_RESTORE_FRAME 19 movq 48(%rsp), %r9 20 movq 40(%rsp), %r8 21 movq 32(%rsp), %rdi 22 movq 24(%rsp), %rsi 23 movq 16(%rsp), %rdx 24 movq 8(%rsp), %rcx 25 movq (%rsp), %rax 26 addq $0x38, %rsp 27 .endm 28 29 #endif 30 31 #ifdef CONFIG_FUNCTION_TRACER 32 #define MCOUNT_ADDR ((long)(mcount)) 33 #define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ 34 35 #ifndef __ASSEMBLY__ 36 extern void mcount(void); 37 extern atomic_t modifying_ftrace_code; 38 39 static inline unsigned long ftrace_call_adjust(unsigned long addr) 40 { 41 /* 42 * addr is the address of the mcount call instruction. 43 * recordmcount does the necessary offset calculation. 44 */ 45 return addr; 46 } 47 48 #ifdef CONFIG_DYNAMIC_FTRACE 49 50 struct dyn_arch_ftrace { 51 /* No extra data needed for x86 */ 52 }; 53 54 int ftrace_int3_handler(struct pt_regs *regs); 55 56 #endif /* CONFIG_DYNAMIC_FTRACE */ 57 #endif /* __ASSEMBLY__ */ 58 #endif /* CONFIG_FUNCTION_TRACER */ 59 60 #endif /* _ASM_X86_FTRACE_H */ 61