mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +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 | 	 This builds a module that calls trace_printk() and can be used to | ||||||
| 	 test various trace_printk() calls from a module. | 	 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 | config SAMPLE_KOBJECT | ||||||
| 	tristate "Build kobject examples" | 	tristate "Build kobject examples" | ||||||
| 	help | 	help | ||||||
|  |  | ||||||
|  | @ -17,6 +17,7 @@ obj-$(CONFIG_SAMPLE_RPMSG_CLIENT)	+= rpmsg/ | ||||||
| subdir-$(CONFIG_SAMPLE_SECCOMP)		+= seccomp | subdir-$(CONFIG_SAMPLE_SECCOMP)		+= seccomp | ||||||
| obj-$(CONFIG_SAMPLE_TRACE_EVENTS)	+= trace_events/ | obj-$(CONFIG_SAMPLE_TRACE_EVENTS)	+= trace_events/ | ||||||
| obj-$(CONFIG_SAMPLE_TRACE_PRINTK)	+= trace_printk/ | obj-$(CONFIG_SAMPLE_TRACE_PRINTK)	+= trace_printk/ | ||||||
|  | obj-$(CONFIG_SAMPLE_FTRACE_DIRECT)	+= ftrace/ | ||||||
| obj-$(CONFIG_VIDEO_PCI_SKELETON)	+= v4l/ | obj-$(CONFIG_VIDEO_PCI_SKELETON)	+= v4l/ | ||||||
| obj-y					+= vfio-mdev/ | obj-y					+= vfio-mdev/ | ||||||
| subdir-$(CONFIG_SAMPLE_VFS)		+= vfs | 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)