// SPDX-License-Identifier: GPL-2.0-or-later #include <linux/rethook.h> #include <linux/kprobes.h> #include "rethook.h" void arch_rethook_prepare(struct rethook_node *rh, struct pt_regs *regs, bool mcount) { rh->ret_addr = regs->gprs[14]; rh->frame = regs->gprs[15]; /* Replace the return addr with trampoline addr */ regs->gprs[14] = (unsigned long)&arch_rethook_trampoline; } NOKPROBE_SYMBOL(arch_rethook_prepare); void arch_rethook_fixup_return(struct pt_regs *regs, unsigned long correct_ret_addr) { /* Replace fake return address with real one. */ regs->gprs[14] = correct_ret_addr; } NOKPROBE_SYMBOL(arch_rethook_fixup_return); /* * Called from arch_rethook_trampoline */ unsigned long arch_rethook_trampoline_callback(struct pt_regs *regs) { return rethook_trampoline_handler(regs, regs->gprs[15]); } NOKPROBE_SYMBOL(arch_rethook_trampoline_callback); /* assembler function that handles the rethook must not be probed itself */ NOKPROBE_SYMBOL(arch_rethook_trampoline);