1/*
2 * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
3 *
4 * This file implements mcount(), which is used to collect profiling data.
5 * This can also be tweaked for kernel stack overflow detection.
6 */
7
8#include <linux/linkage.h>
9
10/*
11 * This is the main variant and is called by C code.  GCC's -pg option
12 * automatically instruments every C function with a call to this.
13 */
14
15	.text
16	.align		32
17	.globl		_mcount
18	.type		_mcount,#function
19	.globl		mcount
20	.type		mcount,#function
21_mcount:
22mcount:
23#ifdef CONFIG_FUNCTION_TRACER
24#ifdef CONFIG_DYNAMIC_FTRACE
25	/* Do nothing, the retl/nop below is all we need.  */
26#else
27	sethi		%hi(ftrace_trace_function), %g1
28	sethi		%hi(ftrace_stub), %g2
29	ldx		[%g1 + %lo(ftrace_trace_function)], %g1
30	or		%g2, %lo(ftrace_stub), %g2
31	cmp		%g1, %g2
32	be,pn		%icc, 1f
33	 mov		%i7, %g3
34	save		%sp, -176, %sp
35	mov		%g3, %o1
36	jmpl		%g1, %o7
37	 mov		%i7, %o0
38	ret
39	 restore
40	/* not reached */
411:
42#ifdef CONFIG_FUNCTION_GRAPH_TRACER
43	sethi		%hi(ftrace_graph_return), %g1
44	ldx		[%g1 + %lo(ftrace_graph_return)], %g3
45	cmp		%g2, %g3
46	bne,pn		%xcc, 5f
47	 sethi		%hi(ftrace_graph_entry_stub), %g2
48	sethi		%hi(ftrace_graph_entry), %g1
49	or		%g2, %lo(ftrace_graph_entry_stub), %g2
50	ldx		[%g1 + %lo(ftrace_graph_entry)], %g1
51	cmp		%g1, %g2
52	be,pt		%xcc, 2f
53	 nop
545:	mov		%i7, %g2
55	mov		%fp, %g3
56	save		%sp, -176, %sp
57	mov		%g2, %l0
58	ba,pt		%xcc, ftrace_graph_caller
59	 mov		%g3, %l1
60#endif
612:
62#endif
63#endif
64	retl
65	 nop
66	.size		_mcount,.-_mcount
67	.size		mcount,.-mcount
68
69#ifdef CONFIG_FUNCTION_TRACER
70	.globl		ftrace_stub
71	.type		ftrace_stub,#function
72ftrace_stub:
73	retl
74	 nop
75	.size		ftrace_stub,.-ftrace_stub
76#ifdef CONFIG_DYNAMIC_FTRACE
77	.globl		ftrace_caller
78	.type		ftrace_caller,#function
79ftrace_caller:
80	mov		%i7, %g2
81	mov		%fp, %g3
82	save		%sp, -176, %sp
83	mov		%g2, %o1
84	mov		%g2, %l0
85	mov		%g3, %l1
86	.globl		ftrace_call
87ftrace_call:
88	call		ftrace_stub
89	 mov		%i7, %o0
90#ifdef CONFIG_FUNCTION_GRAPH_TRACER
91	.globl		ftrace_graph_call
92ftrace_graph_call:
93	call		ftrace_stub
94	 nop
95#endif
96	ret
97	 restore
98#ifdef CONFIG_FUNCTION_GRAPH_TRACER
99	.size		ftrace_graph_call,.-ftrace_graph_call
100#endif
101	.size		ftrace_call,.-ftrace_call
102	.size		ftrace_caller,.-ftrace_caller
103#endif
104#endif
105
106#ifdef CONFIG_FUNCTION_GRAPH_TRACER
107ENTRY(ftrace_graph_caller)
108	mov		%l0, %o0
109	mov		%i7, %o1
110	call		prepare_ftrace_return
111	 mov		%l1, %o2
112	ret
113	 restore	%o0, -8, %i7
114END(ftrace_graph_caller)
115
116ENTRY(return_to_handler)
117	save		%sp, -176, %sp
118	call		ftrace_return_to_handler
119	 mov		%fp, %o0
120	jmpl		%o0 + 8, %g0
121	 restore
122END(return_to_handler)
123#endif
124