GNU Linux-libre 6.5.10-gnu
[releases.git] / arch / powerpc / kernel / trace / ftrace_low.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Split from entry_64.S
4  */
5
6 #include <linux/magic.h>
7 #include <asm/ppc_asm.h>
8 #include <asm/asm-offsets.h>
9 #include <asm/ftrace.h>
10 #include <asm/ppc-opcode.h>
11 #include <asm/export.h>
12
13 #ifdef CONFIG_PPC64
14 .pushsection ".tramp.ftrace.text","aw",@progbits;
15 .globl ftrace_tramp_text
16 ftrace_tramp_text:
17         .space 64
18 .popsection
19
20 .pushsection ".tramp.ftrace.init","aw",@progbits;
21 .globl ftrace_tramp_init
22 ftrace_tramp_init:
23         .space 64
24 .popsection
25 #endif
26
27 _GLOBAL(mcount)
28 _GLOBAL(_mcount)
29 EXPORT_SYMBOL(_mcount)
30         mflr    r12
31         mtctr   r12
32         mtlr    r0
33         bctr
34
35 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
36 _GLOBAL(return_to_handler)
37         /* need to save return values */
38 #ifdef CONFIG_PPC64
39         std     r4,  -32(r1)
40         std     r3,  -24(r1)
41         /* save TOC */
42         std     r2,  -16(r1)
43         std     r31, -8(r1)
44         mr      r31, r1
45         stdu    r1, -112(r1)
46
47         /*
48          * We might be called from a module.
49          * Switch to our TOC to run inside the core kernel.
50          */
51         LOAD_PACA_TOC()
52 #else
53         stwu    r1, -16(r1)
54         stw     r3, 8(r1)
55         stw     r4, 12(r1)
56 #endif
57
58         bl      ftrace_return_to_handler
59         nop
60
61         /* return value has real return address */
62         mtlr    r3
63
64 #ifdef CONFIG_PPC64
65         ld      r1, 0(r1)
66         ld      r4,  -32(r1)
67         ld      r3,  -24(r1)
68         ld      r2,  -16(r1)
69         ld      r31, -8(r1)
70 #else
71         lwz     r3, 8(r1)
72         lwz     r4, 12(r1)
73         addi    r1, r1, 16
74 #endif
75
76         /* Jump back to real return address */
77         blr
78 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */