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