2019-11-08 21:12:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
# include <linux/module.h>
# include <linux/sched.h> /* for wake_up_process() */
# include <linux/ftrace.h>
2021-10-12 16:38:02 +03:00
# include <asm/asm-offsets.h>
2019-11-08 21:12:33 +03:00
2021-12-19 16:53:17 +03:00
extern void my_direct_func ( struct task_struct * p ) ;
2019-11-08 21:12:33 +03:00
void my_direct_func ( struct task_struct * p )
{
2019-11-15 11:59:38 +03:00
trace_printk ( " waking up %s-%d \n " , p - > comm , p - > pid ) ;
2019-11-08 21:12:33 +03:00
}
extern void my_tramp ( void * ) ;
2021-10-12 16:38:02 +03:00
# ifdef CONFIG_X86_64
2022-03-08 18:30:34 +03:00
# include <asm/ibt.h>
2019-11-08 21:12:33 +03:00
asm (
" .pushsection .text, \" ax \" , @progbits \n "
2020-04-24 23:40:43 +03:00
" .type my_tramp, @function \n "
2020-11-13 21:34:14 +03:00
" .globl my_tramp \n "
2019-11-08 21:12:33 +03:00
" my_tramp: "
2022-03-08 18:30:34 +03:00
ASM_ENDBR
2019-11-08 21:12:33 +03:00
" pushq %rbp \n "
" movq %rsp, %rbp \n "
" pushq %rdi \n "
" call my_direct_func \n "
" popq %rdi \n "
" leave \n "
2021-12-04 16:43:41 +03:00
ASM_RET
2020-04-24 23:40:43 +03:00
" .size my_tramp, .-my_tramp \n "
2019-11-08 21:12:33 +03:00
" .popsection \n "
) ;
2021-10-12 16:38:02 +03:00
# endif /* CONFIG_X86_64 */
# ifdef CONFIG_S390
asm (
" .pushsection .text, \" ax \" , @progbits \n "
" .type my_tramp, @function \n "
" .globl my_tramp \n "
" my_tramp: "
" lgr %r1,%r15 \n "
" stmg %r0,%r5, " __stringify ( __SF_GPRS ) " (%r15) \n "
" stg %r14, " __stringify ( __SF_GPRS + 8 * 8 ) " (%r15) \n "
" aghi %r15, " __stringify ( - STACK_FRAME_OVERHEAD ) " \n "
" stg %r1, " __stringify ( __SF_BACKCHAIN ) " (%r15) \n "
" brasl %r14,my_direct_func \n "
" aghi %r15, " __stringify ( STACK_FRAME_OVERHEAD ) " \n "
" lmg %r0,%r5, " __stringify ( __SF_GPRS ) " (%r15) \n "
" lg %r14, " __stringify ( __SF_GPRS + 8 * 8 ) " (%r15) \n "
" lgr %r1,%r0 \n "
" br %r1 \n "
" .size my_tramp, .-my_tramp \n "
" .popsection \n "
) ;
# endif /* CONFIG_S390 */
2019-11-08 21:12:33 +03:00
static int __init ftrace_direct_init ( void )
{
return register_ftrace_direct ( ( unsigned long ) wake_up_process ,
( unsigned long ) my_tramp ) ;
}
static void __exit ftrace_direct_exit ( void )
{
unregister_ftrace_direct ( ( unsigned long ) wake_up_process ,
( unsigned long ) my_tramp ) ;
}
module_init ( ftrace_direct_init ) ;
module_exit ( ftrace_direct_exit ) ;
MODULE_AUTHOR ( " Steven Rostedt " ) ;
MODULE_DESCRIPTION ( " Example use case of using register_ftrace_direct() " ) ;
MODULE_LICENSE ( " GPL " ) ;