mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	ftrace: Add sample module that uses register_ftrace_direct()
Add a sample module that shows a simple use case for regsiter_ftrace_direct(), and how to use it. Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									013bf0da04
								
							
						
					
					
						commit
						b06457c83a
					
				
					 4 changed files with 57 additions and 0 deletions
				
			
		|  | @ -19,6 +19,14 @@ config SAMPLE_TRACE_PRINTK | |||
| 	 This builds a module that calls trace_printk() and can be used to | ||||
| 	 test various trace_printk() calls from a module. | ||||
| 
 | ||||
| config SAMPLE_FTRACE_DIRECT | ||||
| 	tristate "Build register_ftrace_direct() example" | ||||
| 	depends on DYNAMIC_FTRACE_WITH_DIRECT_CALLS && m | ||||
| 	depends on X86_64 # has x86_64 inlined asm | ||||
| 	help | ||||
| 	  This builds an ftrace direct function example | ||||
| 	  that hooks to wake_up_process and prints the parameters. | ||||
| 
 | ||||
| config SAMPLE_KOBJECT | ||||
| 	tristate "Build kobject examples" | ||||
| 	help | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ obj-$(CONFIG_SAMPLE_RPMSG_CLIENT)	+= rpmsg/ | |||
| subdir-$(CONFIG_SAMPLE_SECCOMP)		+= seccomp | ||||
| obj-$(CONFIG_SAMPLE_TRACE_EVENTS)	+= trace_events/ | ||||
| obj-$(CONFIG_SAMPLE_TRACE_PRINTK)	+= trace_printk/ | ||||
| obj-$(CONFIG_SAMPLE_FTRACE_DIRECT)	+= ftrace/ | ||||
| obj-$(CONFIG_VIDEO_PCI_SKELETON)	+= v4l/ | ||||
| obj-y					+= vfio-mdev/ | ||||
| subdir-$(CONFIG_SAMPLE_VFS)		+= vfs | ||||
|  |  | |||
							
								
								
									
										3
									
								
								samples/ftrace/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/ftrace/Makefile
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| # SPDX-License-Identifier: GPL-2.0-only
 | ||||
| 
 | ||||
| obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct.o | ||||
							
								
								
									
										45
									
								
								samples/ftrace/ftrace-direct.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								samples/ftrace/ftrace-direct.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| #include <linux/module.h> | ||||
| 
 | ||||
| #include <linux/sched.h> /* for wake_up_process() */ | ||||
| #include <linux/ftrace.h> | ||||
| 
 | ||||
| void my_direct_func(struct task_struct *p) | ||||
| { | ||||
| 	trace_printk("wakeing up %s-%d\n", p->comm, p->pid); | ||||
| } | ||||
| 
 | ||||
| extern void my_tramp(void *); | ||||
| 
 | ||||
| asm ( | ||||
| "	.pushsection    .text, \"ax\", @progbits\n" | ||||
| "   my_tramp:" | ||||
| "	pushq %rbp\n" | ||||
| "	movq %rsp, %rbp\n" | ||||
| "	pushq %rdi\n" | ||||
| "	call my_direct_func\n" | ||||
| "	popq %rdi\n" | ||||
| "	leave\n" | ||||
| "	ret\n" | ||||
| "	.popsection\n" | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| 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"); | ||||
		Loading…
	
		Reference in a new issue
	
	 Steven Rostedt (VMware)
						Steven Rostedt (VMware)