File Index
Files and directories
Sign in
FILE

mcount.S

File preview with syntax highlighting.

linux-6.19.14/arch/microblaze/kernel/mcount.S S
  1/*
  2 * Low-level ftrace handling
  3 *
  4 * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
  5 * Copyright (C) 2009 PetaLogix
  6 *
  7 * This file is subject to the terms and conditions of the GNU General
  8 * Public License. See the file COPYING in the main directory of this
  9 * archive for more details.
 10 */
 11
 12#include <linux/linkage.h>
 13
 14#define NOALIGN_ENTRY(name)	.globl name; name:
 15
 16/* FIXME MS: I think that I don't need to save all regs */
 17#define SAVE_REGS		\
 18	addik	r1, r1, -120;	\
 19	swi	r2, r1, 4;	\
 20	swi	r3, r1, 8;	\
 21	swi	r4, r1, 12;	\
 22	swi	r5, r1, 116;	\
 23	swi	r6, r1, 16;	\
 24	swi	r7, r1, 20;	\
 25	swi	r8, r1, 24;	\
 26	swi	r9, r1, 28;	\
 27	swi	r10, r1, 32;	\
 28	swi	r11, r1, 36;	\
 29	swi	r12, r1, 40;	\
 30	swi	r13, r1, 44;	\
 31	swi	r14, r1, 48;	\
 32	swi	r16, r1, 52;	\
 33	swi	r17, r1, 56;	\
 34	swi	r18, r1, 60;	\
 35	swi	r19, r1, 64;	\
 36	swi	r20, r1, 68;	\
 37	swi	r21, r1, 72;	\
 38	swi	r22, r1, 76;	\
 39	swi	r23, r1, 80;	\
 40	swi	r24, r1, 84;	\
 41	swi	r25, r1, 88;	\
 42	swi	r26, r1, 92;	\
 43	swi	r27, r1, 96;	\
 44	swi	r28, r1, 100;	\
 45	swi	r29, r1, 104;	\
 46	swi	r30, r1, 108;	\
 47	swi	r31, r1, 112;
 48
 49#define RESTORE_REGS		\
 50	lwi	r2, r1, 4;	\
 51	lwi	r3, r1, 8;	\
 52	lwi	r4, r1, 12;	\
 53	lwi	r5, r1, 116;	\
 54	lwi	r6, r1, 16;	\
 55	lwi	r7, r1, 20;	\
 56	lwi	r8, r1, 24;	\
 57	lwi	r9, r1, 28;	\
 58	lwi	r10, r1, 32;	\
 59	lwi	r11, r1, 36;	\
 60	lwi	r12, r1, 40;	\
 61	lwi	r13, r1, 44;	\
 62	lwi	r14, r1, 48;	\
 63	lwi	r16, r1, 52;	\
 64	lwi	r17, r1, 56;	\
 65	lwi	r18, r1, 60;	\
 66	lwi	r19, r1, 64;	\
 67	lwi	r20, r1, 68;	\
 68	lwi	r21, r1, 72;	\
 69	lwi	r22, r1, 76;	\
 70	lwi	r23, r1, 80;	\
 71	lwi	r24, r1, 84;	\
 72	lwi	r25, r1, 88;	\
 73	lwi	r26, r1, 92;	\
 74	lwi	r27, r1, 96;	\
 75	lwi	r28, r1, 100;	\
 76	lwi	r29, r1, 104;	\
 77	lwi	r30, r1, 108;	\
 78	lwi	r31, r1, 112;	\
 79	addik	r1, r1, 120;
 80
 81ENTRY(ftrace_stub)
 82	rtsd	r15, 8;
 83	nop;
 84
 85ENTRY(_mcount)
 86#ifdef CONFIG_DYNAMIC_FTRACE
 87ENTRY(ftrace_caller)
 88	/* MS: It is just barrier which is removed from C code */
 89	rtsd	r15, 8
 90	nop
 91#endif /* CONFIG_DYNAMIC_FTRACE */
 92	SAVE_REGS
 93	swi	r15, r1, 0;
 94#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 95#ifndef CONFIG_DYNAMIC_FTRACE
 96	lwi	r5, r0, ftrace_graph_return;
 97	addik	r6, r0, ftrace_stub; /* asm implementation */
 98	cmpu	r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
 99	beqid	r5, end_graph_tracer;
100	nop;
101
102	lwi	r6, r0, ftrace_graph_entry;
103	addik	r5, r0, ftrace_graph_entry_stub; /* implemented in C */
104	cmpu	r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
105	beqid	r5, end_graph_tracer;
106	nop;
107#else /* CONFIG_DYNAMIC_FTRACE */
108NOALIGN_ENTRY(ftrace_call_graph)
109	/* MS: jump over graph function - replaced from C code */
110	bri	end_graph_tracer
111#endif /* CONFIG_DYNAMIC_FTRACE */
112	addik	r5, r1, 120; /* MS: load parent addr */
113	addik	r6, r15, 0; /* MS: load current function addr */
114	bralid	r15, prepare_ftrace_return;
115	nop;
116	/* MS: graph was taken that's why - can jump over function trace */
117	brid	end;
118	nop;
119end_graph_tracer:
120#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
121#ifndef CONFIG_DYNAMIC_FTRACE
122	/* MS: test function trace if is taken or not */
123	lwi	r20, r0, ftrace_trace_function;
124	addik	r6, r0, ftrace_stub;
125	cmpu	r5, r20, r6; /* ftrace_trace_function != ftrace_stub */
126	beqid	r5, end; /* MS: not taken -> jump over */
127	nop;
128#else /* CONFIG_DYNAMIC_FTRACE */
129NOALIGN_ENTRY(ftrace_call)
130/* instruction for setup imm FUNC_part1, addik r20, r0, FUNC_part2 */
131	nop
132	nop
133#endif /* CONFIG_DYNAMIC_FTRACE */
134/* static normal trace */
135	lwi	r6, r1, 120; /* MS: load parent addr */
136	addik	r5, r15, -4; /* MS: load current function addr */
137	/* MS: here is dependency on previous code */
138	brald	r15, r20; /* MS: jump to ftrace handler */
139	nop;
140end:
141	lwi	r15, r1, 0;
142	RESTORE_REGS
143
144	rtsd	r15, 8; /* MS: jump back */
145	nop;
146
147#ifdef CONFIG_FUNCTION_GRAPH_TRACER
148ENTRY(return_to_handler)
149	nop; /* MS: just barrier for rtsd r15, 8 */
150	nop;
151	SAVE_REGS
152	swi	r15, r1, 0;
153
154	/* MS: find out returning address */
155	bralid	r15, ftrace_return_to_handler;
156	nop;
157
158	/* MS: return value from ftrace_return_to_handler is my returning addr
159	 * must be before restore regs because I have to restore r3 content */
160	addik	r15, r3, 0;
161	RESTORE_REGS
162
163	rtsd	r15, 8; /* MS: jump back */
164	nop;
165#endif	/* CONFIG_FUNCTION_TRACER */
~/ Read-only file preview.