1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * livepatch-sample.c - Kernel Live Patching Sample Module 4 * 5 * Copyright (C) 2014 Seth Jennings <sjenning@redhat.com> 6 */ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10 #include <linux/module.h> 11 #include <linux/kernel.h> 12 #include <linux/livepatch.h> 13 14 /* 15 * This (dumb) live patch overrides the function that prints the 16 * kernel boot cmdline when /proc/cmdline is read. 17 * 18 * Example: 19 * 20 * $ cat /proc/cmdline 21 * <your cmdline> 22 * 23 * $ insmod livepatch-sample.ko 24 * $ cat /proc/cmdline 25 * this has been live patched 26 * 27 * $ echo 0 > /sys/kernel/livepatch/livepatch_sample/enabled 28 * $ cat /proc/cmdline 29 * <your cmdline> 30 */ 31 32 #include <linux/seq_file.h> 33 static int livepatch_cmdline_proc_show(struct seq_file *m, void *v) 34 { 35 seq_printf(m, "%s\n", "this has been live patched"); 36 return 0; 37 } 38 39 static struct klp_func funcs[] = { 40 { 41 .old_name = "cmdline_proc_show", 42 .new_func = livepatch_cmdline_proc_show, 43 }, { } 44 }; 45 46 static struct klp_object objs[] = { 47 { 48 /* name being NULL means vmlinux */ 49 .funcs = funcs, 50 }, { } 51 }; 52 53 static struct klp_patch patch = { 54 .mod = THIS_MODULE, 55 .objs = objs, 56 }; 57 58 static int livepatch_init(void) 59 { 60 return klp_enable_patch(&patch); 61 } 62 63 static void livepatch_exit(void) 64 { 65 } 66 67 module_init(livepatch_init); 68 module_exit(livepatch_exit); 69 MODULE_LICENSE("GPL"); 70 MODULE_INFO(livepatch, "Y"); 71