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