| 1 | |
| 2 | #include <linux/rethook.h>
|
| 3 | #include <linux/kprobes.h>
|
| 4 | #include "rethook.h"
|
| 5 |
|
| 6 | void 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 |
|
| 12 | regs->gprs[14] = (unsigned long)&arch_rethook_trampoline;
|
| 13 | }
|
| 14 | NOKPROBE_SYMBOL(arch_rethook_prepare);
|
| 15 |
|
| 16 | void arch_rethook_fixup_return(struct pt_regs *regs,
|
| 17 | unsigned long correct_ret_addr)
|
| 18 | {
|
| 19 |
|
| 20 | regs->gprs[14] = correct_ret_addr;
|
| 21 | }
|
| 22 | NOKPROBE_SYMBOL(arch_rethook_fixup_return);
|
| 23 |
|
| 24 | |
| 25 | * Called from arch_rethook_trampoline
|
| 26 |
|
| 27 | unsigned 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 |
|
| 34 | NOKPROBE_SYMBOL(arch_rethook_trampoline);
|