mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 00:28:52 +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/kernel/livepatch.c | ||||
| F:	Documentation/ABI/testing/sysfs-kernel-livepatch | ||||
| F:	samples/livepatch/ | ||||
| L:	live-patching@vger.kernel.org | ||||
| 
 | ||||
| LLC (802.2) | ||||
|  |  | |||
|  | @ -63,4 +63,11 @@ config SAMPLE_RPMSG_CLIENT | |||
| 	  to communicate with an AMP-configured remote processor over | ||||
| 	  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 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| # 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/ | ||||
|  |  | |||
							
								
								
									
										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