mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 17:23:36 +00: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
@ -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 New Issue
Block a user