xref: /openbmc/linux/arch/csky/abiv2/mcount.S (revision d7950be1)
1230c77a5SGuo Ren/* SPDX-License-Identifier: GPL-2.0 */
2230c77a5SGuo Ren// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3230c77a5SGuo Ren
4230c77a5SGuo Ren#include <linux/linkage.h>
5d7950be1SGuo Ren#include <asm/ftrace.h>
6230c77a5SGuo Ren
7d7950be1SGuo Ren/*
8d7950be1SGuo Ren * csky-gcc with -pg will put the following asm after prologue:
9d7950be1SGuo Ren *      push	r15
10d7950be1SGuo Ren *      jsri	_mcount
11d7950be1SGuo Ren *
12d7950be1SGuo Ren * stack layout after mcount_enter in _mcount():
13d7950be1SGuo Ren *
14d7950be1SGuo Ren * current sp => 0:+-------+
15d7950be1SGuo Ren *                 | a0-a3 | -> must save all argument regs
16d7950be1SGuo Ren *             +16:+-------+
17d7950be1SGuo Ren *                 | lr    | -> _mcount lr (instrumente function's pc)
18d7950be1SGuo Ren *             +20:+-------+
19d7950be1SGuo Ren *                 | fp=r8 | -> instrumented function fp
20d7950be1SGuo Ren *             +24:+-------+
21d7950be1SGuo Ren *                 | plr   | -> instrumented function lr (parent's pc)
22d7950be1SGuo Ren *                 +-------+
23d7950be1SGuo Ren */
24d7950be1SGuo Ren
25d7950be1SGuo Ren.macro mcount_enter
26d7950be1SGuo Ren	subi	sp, 24
27230c77a5SGuo Ren	stw	a0, (sp, 0)
28230c77a5SGuo Ren	stw	a1, (sp, 4)
29230c77a5SGuo Ren	stw	a2, (sp, 8)
30230c77a5SGuo Ren	stw	a3, (sp, 12)
31230c77a5SGuo Ren	stw	lr, (sp, 16)
32d7950be1SGuo Ren	stw	r8, (sp, 20)
33d7950be1SGuo Ren.endm
34d7950be1SGuo Ren
35d7950be1SGuo Ren.macro mcount_exit
36230c77a5SGuo Ren	ldw	a0, (sp, 0)
37230c77a5SGuo Ren	ldw	a1, (sp, 4)
38230c77a5SGuo Ren	ldw	a2, (sp, 8)
39230c77a5SGuo Ren	ldw	a3, (sp, 12)
40230c77a5SGuo Ren	ldw	t1, (sp, 16)
41d7950be1SGuo Ren	ldw	r8, (sp, 20)
42d7950be1SGuo Ren	ldw	lr, (sp, 24)
43d7950be1SGuo Ren	addi	sp, 28
44230c77a5SGuo Ren	jmp	t1
45d7950be1SGuo Ren.endm
46d7950be1SGuo Ren
47d7950be1SGuo Ren.macro save_return_regs
48d7950be1SGuo Ren	subi	sp, 16
49d7950be1SGuo Ren	stw	a0, (sp, 0)
50d7950be1SGuo Ren	stw	a1, (sp, 4)
51d7950be1SGuo Ren	stw	a2, (sp, 8)
52d7950be1SGuo Ren	stw	a3, (sp, 12)
53d7950be1SGuo Ren.endm
54d7950be1SGuo Ren
55d7950be1SGuo Ren.macro restore_return_regs
56d7950be1SGuo Ren	mov	lr, a0
57d7950be1SGuo Ren	ldw	a0, (sp, 0)
58d7950be1SGuo Ren	ldw	a1, (sp, 4)
59d7950be1SGuo Ren	ldw	a2, (sp, 8)
60d7950be1SGuo Ren	ldw	a3, (sp, 12)
61d7950be1SGuo Ren	addi	sp, 16
62d7950be1SGuo Ren.endm
63d7950be1SGuo Ren
64d7950be1SGuo RenENTRY(ftrace_stub)
65d7950be1SGuo Ren	jmp	lr
66d7950be1SGuo RenEND(ftrace_stub)
67d7950be1SGuo Ren
68d7950be1SGuo RenENTRY(_mcount)
69d7950be1SGuo Ren	mcount_enter
70d7950be1SGuo Ren
71d7950be1SGuo Ren	/* r26 is link register, only used with jsri translation */
72d7950be1SGuo Ren	lrw	r26, ftrace_trace_function
73d7950be1SGuo Ren	ldw	r26, (r26, 0)
74d7950be1SGuo Ren	lrw	a1, ftrace_stub
75d7950be1SGuo Ren	cmpne	r26, a1
76d7950be1SGuo Ren	bf	skip_ftrace
77d7950be1SGuo Ren
78d7950be1SGuo Ren	mov	a0, lr
79d7950be1SGuo Ren	subi	a0, MCOUNT_INSN_SIZE
80d7950be1SGuo Ren	ldw	a1, (sp, 24)
81d7950be1SGuo Ren
82d7950be1SGuo Ren	jsr	r26
83d7950be1SGuo Ren
84d7950be1SGuo Ren#ifndef CONFIG_FUNCTION_GRAPH_TRACER
85d7950be1SGuo Renskip_ftrace:
86d7950be1SGuo Ren	mcount_exit
87d7950be1SGuo Ren#else
88d7950be1SGuo Renskip_ftrace:
89d7950be1SGuo Ren	lrw	a0, ftrace_graph_return
90d7950be1SGuo Ren	ldw	a0, (a0, 0)
91d7950be1SGuo Ren	lrw	a1, ftrace_stub
92d7950be1SGuo Ren	cmpne	a0, a1
93d7950be1SGuo Ren	bt	ftrace_graph_caller
94d7950be1SGuo Ren
95d7950be1SGuo Ren	lrw	a0, ftrace_graph_entry
96d7950be1SGuo Ren	ldw	a0, (a0, 0)
97d7950be1SGuo Ren	lrw	a1, ftrace_graph_entry_stub
98d7950be1SGuo Ren	cmpne	a0, a1
99d7950be1SGuo Ren	bt	ftrace_graph_caller
100d7950be1SGuo Ren
101d7950be1SGuo Ren	mcount_exit
102d7950be1SGuo Ren#endif
103230c77a5SGuo RenEND(_mcount)
104d7950be1SGuo Ren
105d7950be1SGuo Ren#ifdef CONFIG_FUNCTION_GRAPH_TRACER
106d7950be1SGuo RenENTRY(ftrace_graph_caller)
107d7950be1SGuo Ren	mov	a0, sp
108d7950be1SGuo Ren	addi	a0, 24
109d7950be1SGuo Ren	ldw	a1, (sp, 16)
110d7950be1SGuo Ren	subi	a1, MCOUNT_INSN_SIZE
111d7950be1SGuo Ren	mov	a2, r8
112d7950be1SGuo Ren	lrw	r26, prepare_ftrace_return
113d7950be1SGuo Ren	jsr	r26
114d7950be1SGuo Ren	mcount_exit
115d7950be1SGuo RenEND(ftrace_graph_caller)
116d7950be1SGuo Ren
117d7950be1SGuo RenENTRY(return_to_handler)
118d7950be1SGuo Ren	save_return_regs
119d7950be1SGuo Ren	mov	a0, r8
120d7950be1SGuo Ren	jsri	ftrace_return_to_handler
121d7950be1SGuo Ren	restore_return_regs
122d7950be1SGuo Ren	jmp	lr
123d7950be1SGuo RenEND(return_to_handler)
124d7950be1SGuo Ren#endif
125