xref: /openbmc/linux/arch/sparc/lib/mcount.S (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2478b8fecSSam Ravnborg/*
3478b8fecSSam Ravnborg * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
4478b8fecSSam Ravnborg *
5478b8fecSSam Ravnborg * This file implements mcount(), which is used to collect profiling data.
6478b8fecSSam Ravnborg * This can also be tweaked for kernel stack overflow detection.
7478b8fecSSam Ravnborg */
8478b8fecSSam Ravnborg
9*4cdb71b6SMasahiro Yamada#include <linux/export.h>
10478b8fecSSam Ravnborg#include <linux/linkage.h>
11478b8fecSSam Ravnborg
12478b8fecSSam Ravnborg/*
13478b8fecSSam Ravnborg * This is the main variant and is called by C code.  GCC's -pg option
14478b8fecSSam Ravnborg * automatically instruments every C function with a call to this.
15478b8fecSSam Ravnborg */
16478b8fecSSam Ravnborg
17478b8fecSSam Ravnborg	.text
18478b8fecSSam Ravnborg	.align		32
19478b8fecSSam Ravnborg	.globl		_mcount
20478b8fecSSam Ravnborg	.type		_mcount,#function
21d3867f04SAl Viro	EXPORT_SYMBOL(_mcount)
22478b8fecSSam Ravnborg	.globl		mcount
23478b8fecSSam Ravnborg	.type		mcount,#function
24478b8fecSSam Ravnborg_mcount:
25478b8fecSSam Ravnborgmcount:
26478b8fecSSam Ravnborg#ifdef CONFIG_FUNCTION_TRACER
27478b8fecSSam Ravnborg#ifdef CONFIG_DYNAMIC_FTRACE
2863b75495SDavid S. Miller	/* Do nothing, the retl/nop below is all we need.  */
29478b8fecSSam Ravnborg#else
30478b8fecSSam Ravnborg	sethi		%hi(ftrace_trace_function), %g1
31478b8fecSSam Ravnborg	sethi		%hi(ftrace_stub), %g2
32478b8fecSSam Ravnborg	ldx		[%g1 + %lo(ftrace_trace_function)], %g1
33478b8fecSSam Ravnborg	or		%g2, %lo(ftrace_stub), %g2
34478b8fecSSam Ravnborg	cmp		%g1, %g2
35478b8fecSSam Ravnborg	be,pn		%icc, 1f
369960e9e8SDavid S. Miller	 mov		%i7, %g3
37035df35dSDavid S. Miller	save		%sp, -176, %sp
389960e9e8SDavid S. Miller	mov		%g3, %o1
39a71d1d6bSDavid S. Miller	jmpl		%g1, %o7
40a71d1d6bSDavid S. Miller	 mov		%i7, %o0
41a71d1d6bSDavid S. Miller	ret
42a71d1d6bSDavid S. Miller	 restore
43478b8fecSSam Ravnborg	/* not reached */
44478b8fecSSam Ravnborg1:
459960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER
469960e9e8SDavid S. Miller	sethi		%hi(ftrace_graph_return), %g1
479960e9e8SDavid S. Miller	ldx		[%g1 + %lo(ftrace_graph_return)], %g3
489960e9e8SDavid S. Miller	cmp		%g2, %g3
499960e9e8SDavid S. Miller	bne,pn		%xcc, 5f
509960e9e8SDavid S. Miller	 sethi		%hi(ftrace_graph_entry_stub), %g2
519960e9e8SDavid S. Miller	sethi		%hi(ftrace_graph_entry), %g1
529960e9e8SDavid S. Miller	or		%g2, %lo(ftrace_graph_entry_stub), %g2
539960e9e8SDavid S. Miller	ldx		[%g1 + %lo(ftrace_graph_entry)], %g1
549960e9e8SDavid S. Miller	cmp		%g1, %g2
559960e9e8SDavid S. Miller	be,pt		%xcc, 2f
569960e9e8SDavid S. Miller	 nop
579960e9e8SDavid S. Miller5:	mov		%i7, %g2
589960e9e8SDavid S. Miller	mov		%fp, %g3
59035df35dSDavid S. Miller	save		%sp, -176, %sp
609960e9e8SDavid S. Miller	mov		%g2, %l0
619960e9e8SDavid S. Miller	ba,pt		%xcc, ftrace_graph_caller
629960e9e8SDavid S. Miller	 mov		%g3, %l1
639960e9e8SDavid S. Miller#endif
649960e9e8SDavid S. Miller2:
65478b8fecSSam Ravnborg#endif
66478b8fecSSam Ravnborg#endif
67478b8fecSSam Ravnborg	retl
68478b8fecSSam Ravnborg	 nop
69478b8fecSSam Ravnborg	.size		_mcount,.-_mcount
70478b8fecSSam Ravnborg	.size		mcount,.-mcount
71478b8fecSSam Ravnborg
72478b8fecSSam Ravnborg#ifdef CONFIG_FUNCTION_TRACER
73478b8fecSSam Ravnborg	.globl		ftrace_stub
74478b8fecSSam Ravnborg	.type		ftrace_stub,#function
75478b8fecSSam Ravnborgftrace_stub:
76478b8fecSSam Ravnborg	retl
77478b8fecSSam Ravnborg	 nop
78478b8fecSSam Ravnborg	.size		ftrace_stub,.-ftrace_stub
79478b8fecSSam Ravnborg#ifdef CONFIG_DYNAMIC_FTRACE
80478b8fecSSam Ravnborg	.globl		ftrace_caller
81478b8fecSSam Ravnborg	.type		ftrace_caller,#function
82478b8fecSSam Ravnborgftrace_caller:
83a71d1d6bSDavid S. Miller	mov		%i7, %g2
849960e9e8SDavid S. Miller	mov		%fp, %g3
85035df35dSDavid S. Miller	save		%sp, -176, %sp
86a71d1d6bSDavid S. Miller	mov		%g2, %o1
879960e9e8SDavid S. Miller	mov		%g2, %l0
889960e9e8SDavid S. Miller	mov		%g3, %l1
89478b8fecSSam Ravnborg	.globl		ftrace_call
90478b8fecSSam Ravnborgftrace_call:
91478b8fecSSam Ravnborg	call		ftrace_stub
92a71d1d6bSDavid S. Miller	 mov		%i7, %o0
939960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER
949960e9e8SDavid S. Miller	.globl		ftrace_graph_call
959960e9e8SDavid S. Millerftrace_graph_call:
969960e9e8SDavid S. Miller	call		ftrace_stub
979960e9e8SDavid S. Miller	 nop
989960e9e8SDavid S. Miller#endif
99a71d1d6bSDavid S. Miller	ret
100a71d1d6bSDavid S. Miller	 restore
1019960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER
1029960e9e8SDavid S. Miller	.size		ftrace_graph_call,.-ftrace_graph_call
1039960e9e8SDavid S. Miller#endif
10463b75495SDavid S. Miller	.size		ftrace_call,.-ftrace_call
105478b8fecSSam Ravnborg	.size		ftrace_caller,.-ftrace_caller
106478b8fecSSam Ravnborg#endif
107478b8fecSSam Ravnborg#endif
1089960e9e8SDavid S. Miller
1099960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER
1109960e9e8SDavid S. MillerENTRY(ftrace_graph_caller)
1119960e9e8SDavid S. Miller	mov		%l0, %o0
1129960e9e8SDavid S. Miller	mov		%i7, %o1
1139960e9e8SDavid S. Miller	call		prepare_ftrace_return
1149960e9e8SDavid S. Miller	 mov		%l1, %o2
1159960e9e8SDavid S. Miller	ret
1169960e9e8SDavid S. Miller	 restore	%o0, -8, %i7
1179960e9e8SDavid S. MillerEND(ftrace_graph_caller)
1189960e9e8SDavid S. Miller
1199960e9e8SDavid S. MillerENTRY(return_to_handler)
120035df35dSDavid S. Miller	save		%sp, -176, %sp
1219960e9e8SDavid S. Miller	call		ftrace_return_to_handler
1229960e9e8SDavid S. Miller	 mov		%fp, %o0
1239960e9e8SDavid S. Miller	jmpl		%o0 + 8, %g0
1249960e9e8SDavid S. Miller	 restore
1259960e9e8SDavid S. MillerEND(return_to_handler)
1269960e9e8SDavid S. Miller#endif
127