Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ftrace.h
Go to the documentation of this file.
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License. See the file "COPYING" in the main directory of this archive for
4  * more details.
5  *
6  * Copyright (C) 2009 DSLab, Lanzhou University, China
7  * Author: Wu Zhangjin <[email protected]>
8  */
9 
10 #ifndef _ASM_MIPS_FTRACE_H
11 #define _ASM_MIPS_FTRACE_H
12 
13 #ifdef CONFIG_FUNCTION_TRACER
14 
15 #define MCOUNT_ADDR ((unsigned long)(_mcount))
16 #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
17 
18 #ifndef __ASSEMBLY__
19 extern void _mcount(void);
20 #define mcount _mcount
21 
22 #define safe_load(load, src, dst, error) \
23 do { \
24  asm volatile ( \
25  "1: " load " %[" STR(dst) "], 0(%[" STR(src) "])\n"\
26  " li %[" STR(error) "], 0\n" \
27  "2:\n" \
28  \
29  ".section .fixup, \"ax\"\n" \
30  "3: li %[" STR(error) "], 1\n" \
31  " j 2b\n" \
32  ".previous\n" \
33  \
34  ".section\t__ex_table,\"a\"\n\t" \
35  STR(PTR) "\t1b, 3b\n\t" \
36  ".previous\n" \
37  \
38  : [dst] "=&r" (dst), [error] "=r" (error)\
39  : [src] "r" (src) \
40  : "memory" \
41  ); \
42 } while (0)
43 
44 #define safe_store(store, src, dst, error) \
45 do { \
46  asm volatile ( \
47  "1: " store " %[" STR(src) "], 0(%[" STR(dst) "])\n"\
48  " li %[" STR(error) "], 0\n" \
49  "2:\n" \
50  \
51  ".section .fixup, \"ax\"\n" \
52  "3: li %[" STR(error) "], 1\n" \
53  " j 2b\n" \
54  ".previous\n" \
55  \
56  ".section\t__ex_table,\"a\"\n\t"\
57  STR(PTR) "\t1b, 3b\n\t" \
58  ".previous\n" \
59  \
60  : [error] "=r" (error) \
61  : [dst] "r" (dst), [src] "r" (src)\
62  : "memory" \
63  ); \
64 } while (0)
65 
66 #define safe_load_code(dst, src, error) \
67  safe_load(STR(lw), src, dst, error)
68 #define safe_store_code(src, dst, error) \
69  safe_store(STR(sw), src, dst, error)
70 
71 #define safe_load_stack(dst, src, error) \
72  safe_load(STR(PTR_L), src, dst, error)
73 
74 #define safe_store_stack(src, dst, error) \
75  safe_store(STR(PTR_S), src, dst, error)
76 
77 
78 #ifdef CONFIG_DYNAMIC_FTRACE
79 static inline unsigned long ftrace_call_adjust(unsigned long addr)
80 {
81  return addr;
82 }
83 
84 struct dyn_arch_ftrace {
85 };
86 
87 #endif /* CONFIG_DYNAMIC_FTRACE */
88 #endif /* __ASSEMBLY__ */
89 #endif /* CONFIG_FUNCTION_TRACER */
90 #endif /* _ASM_MIPS_FTRACE_H */