Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */