18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci#include <linux/module.h> 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <linux/sched.h> /* for wake_up_process() */ 58c2ecf20Sopenharmony_ci#include <linux/ftrace.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ciextern void my_direct_func(struct task_struct *p); 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_civoid my_direct_func(struct task_struct *p) 108c2ecf20Sopenharmony_ci{ 118c2ecf20Sopenharmony_ci trace_printk("waking up %s-%d\n", p->comm, p->pid); 128c2ecf20Sopenharmony_ci} 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ciextern void my_tramp(void *); 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciasm ( 178c2ecf20Sopenharmony_ci" .pushsection .text, \"ax\", @progbits\n" 188c2ecf20Sopenharmony_ci" .type my_tramp, @function\n" 198c2ecf20Sopenharmony_ci" .globl my_tramp\n" 208c2ecf20Sopenharmony_ci" my_tramp:" 218c2ecf20Sopenharmony_ci" pushq %rbp\n" 228c2ecf20Sopenharmony_ci" movq %rsp, %rbp\n" 238c2ecf20Sopenharmony_ci" pushq %rdi\n" 248c2ecf20Sopenharmony_ci" call my_direct_func\n" 258c2ecf20Sopenharmony_ci" popq %rdi\n" 268c2ecf20Sopenharmony_ci" leave\n" 278c2ecf20Sopenharmony_ci ASM_RET 288c2ecf20Sopenharmony_ci" .size my_tramp, .-my_tramp\n" 298c2ecf20Sopenharmony_ci" .popsection\n" 308c2ecf20Sopenharmony_ci); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_cistatic int __init ftrace_direct_init(void) 348c2ecf20Sopenharmony_ci{ 358c2ecf20Sopenharmony_ci return register_ftrace_direct((unsigned long)wake_up_process, 368c2ecf20Sopenharmony_ci (unsigned long)my_tramp); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic void __exit ftrace_direct_exit(void) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci unregister_ftrace_direct((unsigned long)wake_up_process, 428c2ecf20Sopenharmony_ci (unsigned long)my_tramp); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cimodule_init(ftrace_direct_init); 468c2ecf20Sopenharmony_cimodule_exit(ftrace_direct_exit); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ciMODULE_AUTHOR("Steven Rostedt"); 498c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Example use case of using register_ftrace_direct()"); 508c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 51