mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	livepatch: samples: add sample live patching module
Add a sample live patching module. Signed-off-by: Seth Jennings <sjenning@redhat.com> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Reviewed-by: Petr Mladek <pmladek@suse.cz> Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
		
							parent
							
								
									b700e7f03d
								
							
						
					
					
						commit
						13d1cf7e70
					
				
					 5 changed files with 97 additions and 1 deletions
				
			
		|  | @ -5795,6 +5795,7 @@ F:	include/linux/livepatch.h | ||||||
| F:	arch/x86/include/asm/livepatch.h | F:	arch/x86/include/asm/livepatch.h | ||||||
| F:	arch/x86/kernel/livepatch.c | F:	arch/x86/kernel/livepatch.c | ||||||
| F:	Documentation/ABI/testing/sysfs-kernel-livepatch | F:	Documentation/ABI/testing/sysfs-kernel-livepatch | ||||||
|  | F:	samples/livepatch/ | ||||||
| L:	live-patching@vger.kernel.org | L:	live-patching@vger.kernel.org | ||||||
| 
 | 
 | ||||||
| LLC (802.2) | LLC (802.2) | ||||||
|  |  | ||||||
|  | @ -63,4 +63,11 @@ config SAMPLE_RPMSG_CLIENT | ||||||
| 	  to communicate with an AMP-configured remote processor over | 	  to communicate with an AMP-configured remote processor over | ||||||
| 	  the rpmsg bus. | 	  the rpmsg bus. | ||||||
| 
 | 
 | ||||||
|  | config SAMPLE_LIVE_PATCHING | ||||||
|  | 	tristate "Build live patching sample -- loadable modules only" | ||||||
|  | 	depends on LIVE_PATCHING && m | ||||||
|  | 	help | ||||||
|  | 	  Builds a sample live patch that replaces the procfs handler | ||||||
|  | 	  for /proc/cmdline to print "this has been live patched". | ||||||
|  | 
 | ||||||
| endif # SAMPLES | endif # SAMPLES | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| # Makefile for Linux samples code
 | # Makefile for Linux samples code
 | ||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_SAMPLES)	+= kobject/ kprobes/ trace_events/ \
 | obj-$(CONFIG_SAMPLES)	+= kobject/ kprobes/ trace_events/ livepatch/ \
 | ||||||
| 			   hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ | 			   hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								samples/livepatch/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/livepatch/Makefile
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | obj-$(CONFIG_SAMPLE_LIVE_PATCHING) += livepatch-sample.o | ||||||
							
								
								
									
										87
									
								
								samples/livepatch/livepatch-sample.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								samples/livepatch/livepatch-sample.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | ||||||
|  | /*
 | ||||||
|  |  * livepatch-sample.c - Kernel Live Patching Sample Module | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2014 Seth Jennings <sjenning@redhat.com> | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License | ||||||
|  |  * as published by the Free Software Foundation; either version 2 | ||||||
|  |  * of the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/kernel.h> | ||||||
|  | #include <linux/livepatch.h> | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * This (dumb) live patch overrides the function that prints the | ||||||
|  |  * kernel boot cmdline when /proc/cmdline is read. | ||||||
|  |  * | ||||||
|  |  * Example: | ||||||
|  |  * $ cat /proc/cmdline | ||||||
|  |  * <your cmdline> | ||||||
|  |  * $ insmod livepatch-sample.ko | ||||||
|  |  * $ cat /proc/cmdline | ||||||
|  |  * this has been live patched | ||||||
|  |  * $ echo 0 > /sys/kernel/livepatch/klp_sample/enabled | ||||||
|  |  * <your cmdline> | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/seq_file.h> | ||||||
|  | static int livepatch_cmdline_proc_show(struct seq_file *m, void *v) | ||||||
|  | { | ||||||
|  | 	seq_printf(m, "%s\n", "this has been live patched"); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct klp_func funcs[] = { | ||||||
|  | 	{ | ||||||
|  | 		.old_name = "cmdline_proc_show", | ||||||
|  | 		.new_func = livepatch_cmdline_proc_show, | ||||||
|  | 	}, { } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static struct klp_object objs[] = { | ||||||
|  | 	{ | ||||||
|  | 		/* name being NULL means vmlinux */ | ||||||
|  | 		.funcs = funcs, | ||||||
|  | 	}, { } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static struct klp_patch patch = { | ||||||
|  | 	.mod = THIS_MODULE, | ||||||
|  | 	.objs = objs, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static int livepatch_init(void) | ||||||
|  | { | ||||||
|  | 	int ret; | ||||||
|  | 
 | ||||||
|  | 	ret = klp_register_patch(&patch); | ||||||
|  | 	if (ret) | ||||||
|  | 		return ret; | ||||||
|  | 	ret = klp_enable_patch(&patch); | ||||||
|  | 	if (ret) { | ||||||
|  | 		WARN_ON(klp_unregister_patch(&patch)); | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void livepatch_exit(void) | ||||||
|  | { | ||||||
|  | 	WARN_ON(klp_disable_patch(&patch)); | ||||||
|  | 	WARN_ON(klp_unregister_patch(&patch)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module_init(livepatch_init); | ||||||
|  | module_exit(livepatch_exit); | ||||||
|  | MODULE_LICENSE("GPL"); | ||||||
		Loading…
	
		Reference in a new issue
	
	 Seth Jennings
						Seth Jennings