• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/microblaze/kernel/
1/*
2 * Low-level ftrace handling
3 *
4 * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
5 * Copyright (C) 2009 PetaLogix
6 *
7 * This file is subject to the terms and conditions of the GNU General
8 * Public License. See the file COPYING in the main directory of this
9 * archive for more details.
10 */
11
12#include <linux/linkage.h>
13
14#define NOALIGN_ENTRY(name)	.globl name; name:
15
16#define SAVE_REGS		\
17	addik	r1, r1, -120;	\
18	swi	r2, r1, 4;	\
19	swi	r3, r1, 8;	\
20	swi	r4, r1, 12;	\
21	swi	r5, r1, 116;	\
22	swi	r6, r1, 16;	\
23	swi	r7, r1, 20;	\
24	swi	r8, r1, 24;	\
25	swi	r9, r1, 28;	\
26	swi	r10, r1, 32;	\
27	swi	r11, r1, 36;	\
28	swi	r12, r1, 40;	\
29	swi	r13, r1, 44;	\
30	swi	r14, r1, 48;	\
31	swi	r16, r1, 52;	\
32	swi	r17, r1, 56;	\
33	swi	r18, r1, 60;	\
34	swi	r19, r1, 64;	\
35	swi	r20, r1, 68;	\
36	swi	r21, r1, 72;	\
37	swi	r22, r1, 76;	\
38	swi	r23, r1, 80;	\
39	swi	r24, r1, 84;	\
40	swi	r25, r1, 88;	\
41	swi	r26, r1, 92;	\
42	swi	r27, r1, 96;	\
43	swi	r28, r1, 100;	\
44	swi	r29, r1, 104;	\
45	swi	r30, r1, 108;	\
46	swi	r31, r1, 112;
47
48#define RESTORE_REGS		\
49	lwi	r2, r1, 4;	\
50	lwi	r3, r1, 8;	\
51	lwi	r4, r1, 12;	\
52	lwi	r5, r1, 116;	\
53	lwi	r6, r1, 16;	\
54	lwi	r7, r1, 20;	\
55	lwi	r8, r1, 24;	\
56	lwi	r9, r1, 28;	\
57	lwi	r10, r1, 32;	\
58	lwi	r11, r1, 36;	\
59	lwi	r12, r1, 40;	\
60	lwi	r13, r1, 44;	\
61	lwi	r14, r1, 48;	\
62	lwi	r16, r1, 52;	\
63	lwi	r17, r1, 56;	\
64	lwi	r18, r1, 60;	\
65	lwi	r19, r1, 64;	\
66	lwi	r20, r1, 68;	\
67	lwi	r21, r1, 72;	\
68	lwi	r22, r1, 76;	\
69	lwi	r23, r1, 80;	\
70	lwi	r24, r1, 84;	\
71	lwi	r25, r1, 88;	\
72	lwi	r26, r1, 92;	\
73	lwi	r27, r1, 96;	\
74	lwi	r28, r1, 100;	\
75	lwi	r29, r1, 104;	\
76	lwi	r30, r1, 108;	\
77	lwi	r31, r1, 112;	\
78	addik	r1, r1, 120;
79
80ENTRY(ftrace_stub)
81	rtsd	r15, 8;
82	nop;
83
84ENTRY(_mcount)
85#ifdef CONFIG_DYNAMIC_FTRACE
86ENTRY(ftrace_caller)
87	/* MS: It is just barrier which is removed from C code */
88	rtsd	r15, 8
89	nop
90#endif /* CONFIG_DYNAMIC_FTRACE */
91	SAVE_REGS
92	swi	r15, r1, 0;
93	/* MS: HAVE_FUNCTION_TRACE_MCOUNT_TEST begin of checking */
94	lwi	r5, r0, function_trace_stop;
95	bneid	r5, end;
96	nop;
97	/* MS: HAVE_FUNCTION_TRACE_MCOUNT_TEST end of checking */
98#ifdef CONFIG_FUNCTION_GRAPH_TRACER
99#ifndef CONFIG_DYNAMIC_FTRACE
100	lwi	r5, r0, ftrace_graph_return;
101	addik	r6, r0, ftrace_stub; /* asm implementation */
102	cmpu	r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
103	beqid	r5, end_graph_tracer;
104	nop;
105
106	lwi	r6, r0, ftrace_graph_entry;
107	addik	r5, r0, ftrace_graph_entry_stub; /* implemented in C */
108	cmpu	r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
109	beqid	r5, end_graph_tracer;
110	nop;
111#else /* CONFIG_DYNAMIC_FTRACE */
112NOALIGN_ENTRY(ftrace_call_graph)
113	/* MS: jump over graph function - replaced from C code */
114	bri	end_graph_tracer
115#endif /* CONFIG_DYNAMIC_FTRACE */
116	addik	r5, r1, 120; /* MS: load parent addr */
117	addik	r6, r15, 0; /* MS: load current function addr */
118	bralid	r15, prepare_ftrace_return;
119	nop;
120	/* MS: graph was taken that's why - can jump over function trace */
121	brid	end;
122	nop;
123end_graph_tracer:
124#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
125#ifndef CONFIG_DYNAMIC_FTRACE
126	/* MS: test function trace if is taken or not */
127	lwi	r20, r0, ftrace_trace_function;
128	addik	r6, r0, ftrace_stub;
129	cmpu	r5, r20, r6; /* ftrace_trace_function != ftrace_stub */
130	beqid	r5, end; /* MS: not taken -> jump over */
131	nop;
132#else /* CONFIG_DYNAMIC_FTRACE */
133NOALIGN_ENTRY(ftrace_call)
134/* instruction for setup imm FUNC_part1, addik r20, r0, FUNC_part2 */
135	nop
136	nop
137#endif /* CONFIG_DYNAMIC_FTRACE */
138/* static normal trace */
139	lwi	r6, r1, 120; /* MS: load parent addr */
140	addik	r5, r15, 0; /* MS: load current function addr */
141	/* MS: here is dependency on previous code */
142	brald	r15, r20; /* MS: jump to ftrace handler */
143	nop;
144end:
145	lwi	r15, r1, 0;
146	RESTORE_REGS
147
148	rtsd	r15, 8; /* MS: jump back */
149	nop;
150
151#ifdef CONFIG_FUNCTION_GRAPH_TRACER
152ENTRY(return_to_handler)
153	nop; /* MS: just barrier for rtsd r15, 8 */
154	nop;
155	SAVE_REGS
156	swi	r15, r1, 0;
157
158	/* MS: find out returning address */
159	bralid	r15, ftrace_return_to_handler;
160	nop;
161
162	/* MS: return value from ftrace_return_to_handler is my returning addr
163	 * must be before restore regs because I have to restore r3 content */
164	addik	r15, r3, 0;
165	RESTORE_REGS
166
167	rtsd	r15, 8; /* MS: jump back */
168	nop;
169#endif	/* CONFIG_FUNCTION_TRACER */
170