1ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedt#ifndef _ASM_POWERPC_FTRACE
2ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedt#define _ASM_POWERPC_FTRACE
3ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedt
4606576ce816603d9fe1fb453a88bc6eea16ca709Steven Rostedt#ifdef CONFIG_FUNCTION_TRACER
5395a59d0f8e86bb39cd700c3d185d30c670bb958Abhishek Sagar#define MCOUNT_ADDR		((long)(_mcount))
6395a59d0f8e86bb39cd700c3d185d30c670bb958Abhishek Sagar#define MCOUNT_INSN_SIZE	4 /* sizeof mcount call */
7395a59d0f8e86bb39cd700c3d185d30c670bb958Abhishek Sagar
8bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt#ifdef __ASSEMBLY__
9bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt
10bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt/* Based off of objdump optput from glibc */
11bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt
12bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt#define MCOUNT_SAVE_FRAME			\
13bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stwu	r1,-48(r1);			\
14bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r3, 12(r1);			\
15bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r4, 16(r1);			\
16bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r5, 20(r1);			\
17bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r6, 24(r1);			\
18bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	mflr	r3;				\
19bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r4, 52(r1);			\
20bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	mfcr	r5;				\
21bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r7, 28(r1);			\
22bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r8, 32(r1);			\
23bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r9, 36(r1);			\
24bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r10,40(r1);			\
25bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r3, 44(r1);			\
26bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	stw	r5, 8(r1)
27bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt
28bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt#define MCOUNT_RESTORE_FRAME			\
29bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r6, 8(r1);			\
30bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r0, 44(r1);			\
31bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r3, 12(r1);			\
32bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	mtctr	r0;				\
33bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r4, 16(r1);			\
34bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	mtcr	r6;				\
35bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r5, 20(r1);			\
36bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r6, 24(r1);			\
37bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r0, 52(r1);			\
38bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r7, 28(r1);			\
39bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r8, 32(r1);			\
40bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	mtlr	r0;				\
41bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r9, 36(r1);			\
42bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	lwz	r10,40(r1);			\
43bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt	addi	r1, r1, 48
44bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt
45bf528a3a9bd11b6ae39684b18c9c0678f23924fdSteven Rostedt#else /* !__ASSEMBLY__ */
46ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedtextern void _mcount(void);
478fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt
488fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt#ifdef CONFIG_DYNAMIC_FTRACE
498fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedtstatic inline unsigned long ftrace_call_adjust(unsigned long addr)
508fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt{
518fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt       /* reloction of mcount call site is the same as the address */
528fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt       return addr;
538fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt}
548fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt
558fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedtstruct dyn_arch_ftrace {
56f48cb8b48b0b10025ca9c451b9b32cac3fcd33baSteven Rostedt	struct module *mod;
578fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt};
588fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt#endif /*  CONFIG_DYNAMIC_FTRACE */
598fd6e5a8c81e2e9b912ea33c8425a10729db469bSteven Rostedt#endif /* __ASSEMBLY__ */
60ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedt
61ccbfac2923c9febaeaf07a50054027a92b502718Steven Rostedt#endif
62395a59d0f8e86bb39cd700c3d185d30c670bb958Abhishek Sagar
6302424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie#if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64) && !defined(__ASSEMBLY__)
6402424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
6502424d8966d803e33cbe51469be56b5d177b4a37Ian Munsiestatic inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
6602424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie{
6702424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	/*
6802424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	 * Compare the symbol name with the system call name. Skip the .sys or .SyS
6902424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	 * prefix from the symbol name and the sys prefix from the system call name and
7002424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	 * just match the rest. This is only needed on ppc64 since symbol names on
7102424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	 * 32bit do not start with a period so the generic function will work.
7202424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	 */
7302424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie	return !strcmp(sym + 4, name + 3);
7402424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie}
7502424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie#endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_PPC64 && !__ASSEMBLY__ */
7602424d8966d803e33cbe51469be56b5d177b4a37Ian Munsie
77395a59d0f8e86bb39cd700c3d185d30c670bb958Abhishek Sagar#endif /* _ASM_POWERPC_FTRACE */
78