xref: /linux/arch/sparc/lib/mcount.S (revision 0d456bad36d42d16022be045c8a53ddbb59ee478)
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(function_trace_stop), %g1
28	lduw		[%g1 + %lo(function_trace_stop)], %g2
29	brnz,pn		%g2, 2f
30	 sethi		%hi(ftrace_trace_function), %g1
31	sethi		%hi(ftrace_stub), %g2
32	ldx		[%g1 + %lo(ftrace_trace_function)], %g1
33	or		%g2, %lo(ftrace_stub), %g2
34	cmp		%g1, %g2
35	be,pn		%icc, 1f
36	 mov		%i7, %g3
37	save		%sp, -176, %sp
38	mov		%g3, %o1
39	jmpl		%g1, %o7
40	 mov		%i7, %o0
41	ret
42	 restore
43	/* not reached */
441:
45#ifdef CONFIG_FUNCTION_GRAPH_TRACER
46	sethi		%hi(ftrace_graph_return), %g1
47	ldx		[%g1 + %lo(ftrace_graph_return)], %g3
48	cmp		%g2, %g3
49	bne,pn		%xcc, 5f
50	 sethi		%hi(ftrace_graph_entry_stub), %g2
51	sethi		%hi(ftrace_graph_entry), %g1
52	or		%g2, %lo(ftrace_graph_entry_stub), %g2
53	ldx		[%g1 + %lo(ftrace_graph_entry)], %g1
54	cmp		%g1, %g2
55	be,pt		%xcc, 2f
56	 nop
575:	mov		%i7, %g2
58	mov		%fp, %g3
59	save		%sp, -176, %sp
60	mov		%g2, %l0
61	ba,pt		%xcc, ftrace_graph_caller
62	 mov		%g3, %l1
63#endif
642:
65#endif
66#endif
67	retl
68	 nop
69	.size		_mcount,.-_mcount
70	.size		mcount,.-mcount
71
72#ifdef CONFIG_FUNCTION_TRACER
73	.globl		ftrace_stub
74	.type		ftrace_stub,#function
75ftrace_stub:
76	retl
77	 nop
78	.size		ftrace_stub,.-ftrace_stub
79#ifdef CONFIG_DYNAMIC_FTRACE
80	.globl		ftrace_caller
81	.type		ftrace_caller,#function
82ftrace_caller:
83	sethi		%hi(function_trace_stop), %g1
84	mov		%i7, %g2
85	lduw		[%g1 + %lo(function_trace_stop)], %g1
86	brnz,pn		%g1, ftrace_stub
87	 mov		%fp, %g3
88	save		%sp, -176, %sp
89	mov		%g2, %o1
90	mov		%g2, %l0
91	mov		%g3, %l1
92	.globl		ftrace_call
93ftrace_call:
94	call		ftrace_stub
95	 mov		%i7, %o0
96#ifdef CONFIG_FUNCTION_GRAPH_TRACER
97	.globl		ftrace_graph_call
98ftrace_graph_call:
99	call		ftrace_stub
100	 nop
101#endif
102	ret
103	 restore
104#ifdef CONFIG_FUNCTION_GRAPH_TRACER
105	.size		ftrace_graph_call,.-ftrace_graph_call
106#endif
107	.size		ftrace_call,.-ftrace_call
108	.size		ftrace_caller,.-ftrace_caller
109#endif
110#endif
111
112#ifdef CONFIG_FUNCTION_GRAPH_TRACER
113ENTRY(ftrace_graph_caller)
114	mov		%l0, %o0
115	mov		%i7, %o1
116	call		prepare_ftrace_return
117	 mov		%l1, %o2
118	ret
119	 restore	%o0, -8, %i7
120END(ftrace_graph_caller)
121
122ENTRY(return_to_handler)
123	save		%sp, -176, %sp
124	call		ftrace_return_to_handler
125	 mov		%fp, %o0
126	jmpl		%o0 + 8, %g0
127	 restore
128END(return_to_handler)
129#endif
130