1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun #include <linux/module.h> 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #include <linux/sched.h> /* for wake_up_process() */ 5*4882a593Smuzhiyun #include <linux/ftrace.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun extern void my_direct_func(struct task_struct *p); 8*4882a593Smuzhiyun my_direct_func(struct task_struct * p)9*4882a593Smuzhiyunvoid my_direct_func(struct task_struct *p) 10*4882a593Smuzhiyun { 11*4882a593Smuzhiyun trace_printk("waking up %s-%d\n", p->comm, p->pid); 12*4882a593Smuzhiyun } 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun extern void my_tramp(void *); 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun asm ( 17*4882a593Smuzhiyun " .pushsection .text, \"ax\", @progbits\n" 18*4882a593Smuzhiyun " .type my_tramp, @function\n" 19*4882a593Smuzhiyun " .globl my_tramp\n" 20*4882a593Smuzhiyun " my_tramp:" 21*4882a593Smuzhiyun " pushq %rbp\n" 22*4882a593Smuzhiyun " movq %rsp, %rbp\n" 23*4882a593Smuzhiyun " pushq %rdi\n" 24*4882a593Smuzhiyun " call my_direct_func\n" 25*4882a593Smuzhiyun " popq %rdi\n" 26*4882a593Smuzhiyun " leave\n" 27*4882a593Smuzhiyun ASM_RET 28*4882a593Smuzhiyun " .size my_tramp, .-my_tramp\n" 29*4882a593Smuzhiyun " .popsection\n" 30*4882a593Smuzhiyun ); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun ftrace_direct_init(void)33*4882a593Smuzhiyunstatic int __init ftrace_direct_init(void) 34*4882a593Smuzhiyun { 35*4882a593Smuzhiyun return register_ftrace_direct((unsigned long)wake_up_process, 36*4882a593Smuzhiyun (unsigned long)my_tramp); 37*4882a593Smuzhiyun } 38*4882a593Smuzhiyun ftrace_direct_exit(void)39*4882a593Smuzhiyunstatic void __exit ftrace_direct_exit(void) 40*4882a593Smuzhiyun { 41*4882a593Smuzhiyun unregister_ftrace_direct((unsigned long)wake_up_process, 42*4882a593Smuzhiyun (unsigned long)my_tramp); 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun module_init(ftrace_direct_init); 46*4882a593Smuzhiyun module_exit(ftrace_direct_exit); 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun MODULE_AUTHOR("Steven Rostedt"); 49*4882a593Smuzhiyun MODULE_DESCRIPTION("Example use case of using register_ftrace_direct()"); 50*4882a593Smuzhiyun MODULE_LICENSE("GPL"); 51