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