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