]> git.karo-electronics.de Git - mv-sheeva.git/blob - arch/mips/kernel/mcount.S
MIPS: Tracing: Add dynamic function tracer support
[mv-sheeva.git] / arch / mips / kernel / mcount.S
1 /*
2  * MIPS specific _mcount support
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License.  See the file "COPYING" in the main directory of this archive for
6  * more details.
7  *
8  * Copyright (C) 2009 Lemote Inc. & DSLab, Lanzhou University, China
9  * Author: Wu Zhangjin <wuzj@lemote.com>
10  */
11
12 #include <asm/regdef.h>
13 #include <asm/stackframe.h>
14 #include <asm/ftrace.h>
15
16         .text
17         .set noreorder
18         .set noat
19
20         .macro MCOUNT_SAVE_REGS
21         PTR_SUBU        sp, PT_SIZE
22         PTR_S   ra, PT_R31(sp)
23         PTR_S   AT, PT_R1(sp)
24         PTR_S   a0, PT_R4(sp)
25         PTR_S   a1, PT_R5(sp)
26         PTR_S   a2, PT_R6(sp)
27         PTR_S   a3, PT_R7(sp)
28 #ifdef CONFIG_64BIT
29         PTR_S   a4, PT_R8(sp)
30         PTR_S   a5, PT_R9(sp)
31         PTR_S   a6, PT_R10(sp)
32         PTR_S   a7, PT_R11(sp)
33 #endif
34         .endm
35
36         .macro MCOUNT_RESTORE_REGS
37         PTR_L   ra, PT_R31(sp)
38         PTR_L   AT, PT_R1(sp)
39         PTR_L   a0, PT_R4(sp)
40         PTR_L   a1, PT_R5(sp)
41         PTR_L   a2, PT_R6(sp)
42         PTR_L   a3, PT_R7(sp)
43 #ifdef CONFIG_64BIT
44         PTR_L   a4, PT_R8(sp)
45         PTR_L   a5, PT_R9(sp)
46         PTR_L   a6, PT_R10(sp)
47         PTR_L   a7, PT_R11(sp)
48 #endif
49 #ifdef CONFIG_64BIT
50         PTR_ADDIU       sp, PT_SIZE
51 #else
52         PTR_ADDIU       sp, (PT_SIZE + 8)
53 #endif
54 .endm
55
56         .macro RETURN_BACK
57         jr ra
58          move ra, AT
59         .endm
60
61 #ifdef CONFIG_DYNAMIC_FTRACE
62
63 NESTED(ftrace_caller, PT_SIZE, ra)
64         .globl _mcount
65 _mcount:
66         b       ftrace_stub
67          nop
68         lw      t0, function_trace_stop
69         bnez    t0, ftrace_stub
70          nop
71
72         MCOUNT_SAVE_REGS
73
74         move    a0, ra          /* arg1: next ip, selfaddr */
75         .globl ftrace_call
76 ftrace_call:
77         nop     /* a placeholder for the call to a real tracing function */
78          move   a1, AT          /* arg2: the caller's next ip, parent */
79
80         MCOUNT_RESTORE_REGS
81         .globl ftrace_stub
82 ftrace_stub:
83         RETURN_BACK
84         END(ftrace_caller)
85
86 #else   /* ! CONFIG_DYNAMIC_FTRACE */
87
88 NESTED(_mcount, PT_SIZE, ra)
89         lw      t0, function_trace_stop
90         bnez    t0, ftrace_stub
91          nop
92         PTR_LA  t0, ftrace_stub
93         PTR_L   t1, ftrace_trace_function /* Prepare t1 for (1) */
94         bne     t0, t1, static_trace
95          nop
96         b       ftrace_stub
97          nop
98
99 static_trace:
100         MCOUNT_SAVE_REGS
101
102         move    a0, ra          /* arg1: next ip, selfaddr */
103         jalr    t1      /* (1) call *ftrace_trace_function */
104          move   a1, AT          /* arg2: the caller's next ip, parent */
105
106         MCOUNT_RESTORE_REGS
107         .globl ftrace_stub
108 ftrace_stub:
109         RETURN_BACK
110         END(_mcount)
111
112 #endif  /* ! CONFIG_DYNAMIC_FTRACE */
113
114         .set at
115         .set reorder