-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ftrace/samples: Add multi direct interface test module
Adding simple module that uses multi direct interface: register_ftrace_direct_multi unregister_ftrace_direct_multi The init function registers trampoline for 2 functions, and exit function unregisters them. Link: https://lkml.kernel.org/r/20211008091336.33616-9-jolsa@kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
- Loading branch information
Jiri Olsa
authored and
Steven Rostedt (VMware)
committed
Oct 21, 2021
1 parent
ccf5a89
commit 5fae941
Showing
2 changed files
with
53 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#include <linux/module.h> | ||
|
||
#include <linux/mm.h> /* for handle_mm_fault() */ | ||
#include <linux/ftrace.h> | ||
#include <linux/sched/stat.h> | ||
|
||
void my_direct_func(unsigned long ip) | ||
{ | ||
trace_printk("ip %lx\n", ip); | ||
} | ||
|
||
extern void my_tramp(void *); | ||
|
||
asm ( | ||
" .pushsection .text, \"ax\", @progbits\n" | ||
" .type my_tramp, @function\n" | ||
" .globl my_tramp\n" | ||
" my_tramp:" | ||
" pushq %rbp\n" | ||
" movq %rsp, %rbp\n" | ||
" pushq %rdi\n" | ||
" movq 8(%rbp), %rdi\n" | ||
" call my_direct_func\n" | ||
" popq %rdi\n" | ||
" leave\n" | ||
" ret\n" | ||
" .size my_tramp, .-my_tramp\n" | ||
" .popsection\n" | ||
); | ||
|
||
static struct ftrace_ops direct; | ||
|
||
static int __init ftrace_direct_multi_init(void) | ||
{ | ||
ftrace_set_filter_ip(&direct, (unsigned long) wake_up_process, 0, 0); | ||
ftrace_set_filter_ip(&direct, (unsigned long) schedule, 0, 0); | ||
|
||
return register_ftrace_direct_multi(&direct, (unsigned long) my_tramp); | ||
} | ||
|
||
static void __exit ftrace_direct_multi_exit(void) | ||
{ | ||
unregister_ftrace_direct_multi(&direct, (unsigned long) my_tramp); | ||
} | ||
|
||
module_init(ftrace_direct_multi_init); | ||
module_exit(ftrace_direct_multi_exit); | ||
|
||
MODULE_AUTHOR("Jiri Olsa"); | ||
MODULE_DESCRIPTION("Example use case of using register_ftrace_direct_multi()"); | ||
MODULE_LICENSE("GPL"); |