Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
0003 
0004 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0005 
0006 #include <linux/module.h>
0007 #include <linux/kernel.h>
0008 #include <linux/livepatch.h>
0009 
0010 static int replace;
0011 module_param(replace, int, 0644);
0012 MODULE_PARM_DESC(replace, "replace (default=0)");
0013 
0014 static const char *const module_state[] = {
0015     [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state",
0016     [MODULE_STATE_COMING]   = "[MODULE_STATE_COMING] Full formed, running module_init",
0017     [MODULE_STATE_GOING]    = "[MODULE_STATE_GOING] Going away",
0018     [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up",
0019 };
0020 
0021 static void callback_info(const char *callback, struct klp_object *obj)
0022 {
0023     if (obj->mod)
0024         pr_info("%s: %s -> %s\n", callback, obj->mod->name,
0025             module_state[obj->mod->state]);
0026     else
0027         pr_info("%s: vmlinux\n", callback);
0028 }
0029 
0030 /* Executed on object patching (ie, patch enablement) */
0031 static int pre_patch_callback(struct klp_object *obj)
0032 {
0033     callback_info(__func__, obj);
0034     return 0;
0035 }
0036 
0037 /* Executed on object unpatching (ie, patch disablement) */
0038 static void post_patch_callback(struct klp_object *obj)
0039 {
0040     callback_info(__func__, obj);
0041 }
0042 
0043 /* Executed on object unpatching (ie, patch disablement) */
0044 static void pre_unpatch_callback(struct klp_object *obj)
0045 {
0046     callback_info(__func__, obj);
0047 }
0048 
0049 /* Executed on object unpatching (ie, patch disablement) */
0050 static void post_unpatch_callback(struct klp_object *obj)
0051 {
0052     callback_info(__func__, obj);
0053 }
0054 
0055 static struct klp_func no_funcs[] = {
0056     { }
0057 };
0058 
0059 static struct klp_object objs[] = {
0060     {
0061         .name = NULL,   /* vmlinux */
0062         .funcs = no_funcs,
0063         .callbacks = {
0064             .pre_patch = pre_patch_callback,
0065             .post_patch = post_patch_callback,
0066             .pre_unpatch = pre_unpatch_callback,
0067             .post_unpatch = post_unpatch_callback,
0068         },
0069     }, { }
0070 };
0071 
0072 static struct klp_patch patch = {
0073     .mod = THIS_MODULE,
0074     .objs = objs,
0075     /* set .replace in the init function below for demo purposes */
0076 };
0077 
0078 static int test_klp_callbacks_demo2_init(void)
0079 {
0080     patch.replace = replace;
0081     return klp_enable_patch(&patch);
0082 }
0083 
0084 static void test_klp_callbacks_demo2_exit(void)
0085 {
0086 }
0087 
0088 module_init(test_klp_callbacks_demo2_init);
0089 module_exit(test_klp_callbacks_demo2_exit);
0090 MODULE_LICENSE("GPL");
0091 MODULE_INFO(livepatch, "Y");
0092 MODULE_AUTHOR("Joe Lawrence <joe.lawrence@redhat.com>");
0093 MODULE_DESCRIPTION("Livepatch test: livepatch demo2");