1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2da6a9125SWilliam Cohen/*
3da6a9125SWilliam Cohen * trampoline entry and return code for kretprobes.
4da6a9125SWilliam Cohen */
5da6a9125SWilliam Cohen
6da6a9125SWilliam Cohen#include <linux/linkage.h>
7da6a9125SWilliam Cohen#include <asm/asm-offsets.h>
8da6a9125SWilliam Cohen#include <asm/assembler.h>
9da6a9125SWilliam Cohen
10da6a9125SWilliam Cohen	.text
11da6a9125SWilliam Cohen
12da6a9125SWilliam Cohen	.macro	save_all_base_regs
13da6a9125SWilliam Cohen	stp x0, x1, [sp, #S_X0]
14da6a9125SWilliam Cohen	stp x2, x3, [sp, #S_X2]
15da6a9125SWilliam Cohen	stp x4, x5, [sp, #S_X4]
16da6a9125SWilliam Cohen	stp x6, x7, [sp, #S_X6]
17da6a9125SWilliam Cohen	stp x8, x9, [sp, #S_X8]
18da6a9125SWilliam Cohen	stp x10, x11, [sp, #S_X10]
19da6a9125SWilliam Cohen	stp x12, x13, [sp, #S_X12]
20da6a9125SWilliam Cohen	stp x14, x15, [sp, #S_X14]
21da6a9125SWilliam Cohen	stp x16, x17, [sp, #S_X16]
22da6a9125SWilliam Cohen	stp x18, x19, [sp, #S_X18]
23da6a9125SWilliam Cohen	stp x20, x21, [sp, #S_X20]
24da6a9125SWilliam Cohen	stp x22, x23, [sp, #S_X22]
25da6a9125SWilliam Cohen	stp x24, x25, [sp, #S_X24]
26da6a9125SWilliam Cohen	stp x26, x27, [sp, #S_X26]
27da6a9125SWilliam Cohen	stp x28, x29, [sp, #S_X28]
2871e70184SJianlin Lv	add x0, sp, #PT_REGS_SIZE
29da6a9125SWilliam Cohen	stp lr, x0, [sp, #S_LR]
30da6a9125SWilliam Cohen	/*
31da6a9125SWilliam Cohen	 * Construct a useful saved PSTATE
32da6a9125SWilliam Cohen	 */
33da6a9125SWilliam Cohen	mrs x0, nzcv
34da6a9125SWilliam Cohen	mrs x1, daif
35da6a9125SWilliam Cohen	orr x0, x0, x1
36da6a9125SWilliam Cohen	mrs x1, CurrentEL
37da6a9125SWilliam Cohen	orr x0, x0, x1
38da6a9125SWilliam Cohen	mrs x1, SPSel
39da6a9125SWilliam Cohen	orr x0, x0, x1
40da6a9125SWilliam Cohen	stp xzr, x0, [sp, #S_PC]
41da6a9125SWilliam Cohen	.endm
42da6a9125SWilliam Cohen
43da6a9125SWilliam Cohen	.macro	restore_all_base_regs
44da6a9125SWilliam Cohen	ldr x0, [sp, #S_PSTATE]
45da6a9125SWilliam Cohen	and x0, x0, #(PSR_N_BIT | PSR_Z_BIT | PSR_C_BIT | PSR_V_BIT)
46da6a9125SWilliam Cohen	msr nzcv, x0
47da6a9125SWilliam Cohen	ldp x0, x1, [sp, #S_X0]
48da6a9125SWilliam Cohen	ldp x2, x3, [sp, #S_X2]
49da6a9125SWilliam Cohen	ldp x4, x5, [sp, #S_X4]
50da6a9125SWilliam Cohen	ldp x6, x7, [sp, #S_X6]
51da6a9125SWilliam Cohen	ldp x8, x9, [sp, #S_X8]
52da6a9125SWilliam Cohen	ldp x10, x11, [sp, #S_X10]
53da6a9125SWilliam Cohen	ldp x12, x13, [sp, #S_X12]
54da6a9125SWilliam Cohen	ldp x14, x15, [sp, #S_X14]
55da6a9125SWilliam Cohen	ldp x16, x17, [sp, #S_X16]
56da6a9125SWilliam Cohen	ldp x18, x19, [sp, #S_X18]
57da6a9125SWilliam Cohen	ldp x20, x21, [sp, #S_X20]
58da6a9125SWilliam Cohen	ldp x22, x23, [sp, #S_X22]
59da6a9125SWilliam Cohen	ldp x24, x25, [sp, #S_X24]
60da6a9125SWilliam Cohen	ldp x26, x27, [sp, #S_X26]
61da6a9125SWilliam Cohen	ldp x28, x29, [sp, #S_X28]
62da6a9125SWilliam Cohen	.endm
63da6a9125SWilliam Cohen
64adf8a61aSMasami HiramatsuSYM_CODE_START(__kretprobe_trampoline)
6571e70184SJianlin Lv	sub sp, sp, #PT_REGS_SIZE
66da6a9125SWilliam Cohen
67da6a9125SWilliam Cohen	save_all_base_regs
68da6a9125SWilliam Cohen
69*fc6d6476SMasami Hiramatsu	/* Setup a frame pointer. */
70*fc6d6476SMasami Hiramatsu	add x29, sp, #S_FP
71*fc6d6476SMasami Hiramatsu
72da6a9125SWilliam Cohen	mov x0, sp
73da6a9125SWilliam Cohen	bl trampoline_probe_handler
74da6a9125SWilliam Cohen	/*
75da6a9125SWilliam Cohen	 * Replace trampoline address in lr with actual orig_ret_addr return
76da6a9125SWilliam Cohen	 * address.
77da6a9125SWilliam Cohen	 */
78da6a9125SWilliam Cohen	mov lr, x0
79da6a9125SWilliam Cohen
80*fc6d6476SMasami Hiramatsu	/* The frame pointer (x29) is restored with other registers. */
81da6a9125SWilliam Cohen	restore_all_base_regs
82da6a9125SWilliam Cohen
8371e70184SJianlin Lv	add sp, sp, #PT_REGS_SIZE
84da6a9125SWilliam Cohen	ret
85da6a9125SWilliam Cohen
86adf8a61aSMasami HiramatsuSYM_CODE_END(__kretprobe_trampoline)
87