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