1 // SPDX-License-Identifier: GPL-2.0-or-later 2 #include <linux/rethook.h> 3 #include <linux/kprobes.h> 4 #include "rethook.h" 5 arch_rethook_prepare(struct rethook_node * rh,struct pt_regs * regs,bool mcount)6void arch_rethook_prepare(struct rethook_node *rh, struct pt_regs *regs, bool mcount) 7 { 8 rh->ret_addr = regs->gprs[14]; 9 rh->frame = regs->gprs[15]; 10 11 /* Replace the return addr with trampoline addr */ 12 regs->gprs[14] = (unsigned long)&arch_rethook_trampoline; 13 } 14 NOKPROBE_SYMBOL(arch_rethook_prepare); 15 arch_rethook_fixup_return(struct pt_regs * regs,unsigned long correct_ret_addr)16void arch_rethook_fixup_return(struct pt_regs *regs, 17 unsigned long correct_ret_addr) 18 { 19 /* Replace fake return address with real one. */ 20 regs->gprs[14] = correct_ret_addr; 21 } 22 NOKPROBE_SYMBOL(arch_rethook_fixup_return); 23 24 /* 25 * Called from arch_rethook_trampoline 26 */ arch_rethook_trampoline_callback(struct pt_regs * regs)27unsigned long arch_rethook_trampoline_callback(struct pt_regs *regs) 28 { 29 return rethook_trampoline_handler(regs, regs->gprs[15]); 30 } 31 NOKPROBE_SYMBOL(arch_rethook_trampoline_callback); 32 33 /* assembler function that handles the rethook must not be probed itself */ 34 NOKPROBE_SYMBOL(arch_rethook_trampoline); 35