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