14 typedef unsigned long (*kallsyms_lookup_name_t)(
const char *);
15 static kallsyms_lookup_name_t fh_kallsyms_lookup_ptr = NULL;
18 .symbol_name =
"kallsyms_lookup_name",
21 if (fh_kallsyms_lookup_ptr)
22 return fh_kallsyms_lookup_ptr;
24 ret = register_kprobe(&kp);
26 ERR_MSG(
"fh_init_kallsyms_lookup: register_kprobe failed\n");
30 fh_kallsyms_lookup_ptr = (kallsyms_lookup_name_t)kp.addr;
31 unregister_kprobe(&kp);
33 return fh_kallsyms_lookup_ptr;
45 struct ftrace_ops *ops,
46 struct ftrace_regs *regs) {
48 if (!within_module(parent_ip, THIS_MODULE))
49 ((
struct pt_regs *)regs)->ip = (
unsigned long)hook->
function;
62 if (!kallsyms_lookup) {
63 ERR_MSG(
"ftrace: unable to get kallsyms_lookup_name pointer\n");
69 ERR_MSG(
"ftrace: unresolved symbol\n");
76 hook->
ops.flags = FTRACE_OPS_FL_SAVE_REGS | FTRACE_OPS_FL_RECURSION | FTRACE_OPS_FL_IPMODIFY;
78 err = ftrace_set_filter_ip(&hook->
ops, hook->
address, 0, 0);
80 ERR_MSG(
"ftrace: ftrace_set_filter_ip() failed.\n");
84 err = register_ftrace_function(&hook->
ops);
86 ERR_MSG(
"ftrace: register_ftrace_function() failed.\n");
100 err = unregister_ftrace_function(&hook->
ops);
102 ERR_MSG(
"ftrace: unregister_ftrace_function() failed.\n");
104 err = ftrace_set_filter_ip(&hook->
ops, hook->
address, 1, 0);
106 ERR_MSG(
"ftrace: ftrace_set_filter_ip() failed. \n");
119 for (i = 0; i < count; i++) {
138 for (i = 0; i < count; i++)
struct ftrace_hook hooks[]
#define ERR_MSG(fmt, args...)
void fh_remove_hooks(struct ftrace_hook *hooks, size_t count)
Remove multiple ftrace hooks.
static void notrace fh_ftrace_thunk(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct ftrace_regs *regs)
ftrace callback that redirects execution to the hook function.
void fh_remove_hook(struct ftrace_hook *hook)
Remove an individual ftrace hook.
int fh_install_hooks(struct ftrace_hook *hooks, size_t count)
Install multiple ftrace hooks.
int fh_install_hook(struct ftrace_hook *hook)
Install an individual ftrace hook.
unsigned long(*)(const char *) fh_init_kallsyms_lookup(void)
Retrieve the address of kallsyms_lookup_name via kprobe.