livepatch-sample.c (1370B)
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> 33static 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 39static struct klp_func funcs[] = { 40 { 41 .old_name = "cmdline_proc_show", 42 .new_func = livepatch_cmdline_proc_show, 43 }, { } 44}; 45 46static struct klp_object objs[] = { 47 { 48 /* name being NULL means vmlinux */ 49 .funcs = funcs, 50 }, { } 51}; 52 53static struct klp_patch patch = { 54 .mod = THIS_MODULE, 55 .objs = objs, 56}; 57 58static int livepatch_init(void) 59{ 60 return klp_enable_patch(&patch); 61} 62 63static void livepatch_exit(void) 64{ 65} 66 67module_init(livepatch_init); 68module_exit(livepatch_exit); 69MODULE_LICENSE("GPL"); 70MODULE_INFO(livepatch, "Y");