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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
| /* SPDX-License-Identifier: GPL-2.0 */
| /*
| * trampoline entry and return code for kretprobes.
| */
|
| #include <linux/linkage.h>
| #include <asm/asm-offsets.h>
| #include <asm/assembler.h>
|
| .text
|
| .macro save_all_base_regs
| stp x0, x1, [sp, #S_X0]
| stp x2, x3, [sp, #S_X2]
| stp x4, x5, [sp, #S_X4]
| stp x6, x7, [sp, #S_X6]
| stp x8, x9, [sp, #S_X8]
| stp x10, x11, [sp, #S_X10]
| stp x12, x13, [sp, #S_X12]
| stp x14, x15, [sp, #S_X14]
| stp x16, x17, [sp, #S_X16]
| stp x18, x19, [sp, #S_X18]
| stp x20, x21, [sp, #S_X20]
| stp x22, x23, [sp, #S_X22]
| stp x24, x25, [sp, #S_X24]
| stp x26, x27, [sp, #S_X26]
| stp x28, x29, [sp, #S_X28]
| add x0, sp, #S_FRAME_SIZE
| stp lr, x0, [sp, #S_LR]
| /*
| * Construct a useful saved PSTATE
| */
| mrs x0, nzcv
| mrs x1, daif
| orr x0, x0, x1
| mrs x1, CurrentEL
| orr x0, x0, x1
| mrs x1, SPSel
| orr x0, x0, x1
| stp xzr, x0, [sp, #S_PC]
| .endm
|
| .macro restore_all_base_regs
| ldr x0, [sp, #S_PSTATE]
| and x0, x0, #(PSR_N_BIT | PSR_Z_BIT | PSR_C_BIT | PSR_V_BIT)
| msr nzcv, x0
| ldp x0, x1, [sp, #S_X0]
| ldp x2, x3, [sp, #S_X2]
| ldp x4, x5, [sp, #S_X4]
| ldp x6, x7, [sp, #S_X6]
| ldp x8, x9, [sp, #S_X8]
| ldp x10, x11, [sp, #S_X10]
| ldp x12, x13, [sp, #S_X12]
| ldp x14, x15, [sp, #S_X14]
| ldp x16, x17, [sp, #S_X16]
| ldp x18, x19, [sp, #S_X18]
| ldp x20, x21, [sp, #S_X20]
| ldp x22, x23, [sp, #S_X22]
| ldp x24, x25, [sp, #S_X24]
| ldp x26, x27, [sp, #S_X26]
| ldp x28, x29, [sp, #S_X28]
| .endm
|
| SYM_CODE_START(kretprobe_trampoline)
| sub sp, sp, #S_FRAME_SIZE
|
| save_all_base_regs
|
| mov x0, sp
| bl trampoline_probe_handler
| /*
| * Replace trampoline address in lr with actual orig_ret_addr return
| * address.
| */
| mov lr, x0
|
| restore_all_base_regs
|
| add sp, sp, #S_FRAME_SIZE
| ret
|
| SYM_CODE_END(kretprobe_trampoline)
|
|