0001
0002
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
0031 static int pre_patch_callback(struct klp_object *obj)
0032 {
0033 callback_info(__func__, obj);
0034 return 0;
0035 }
0036
0037
0038 static void post_patch_callback(struct klp_object *obj)
0039 {
0040 callback_info(__func__, obj);
0041 }
0042
0043
0044 static void pre_unpatch_callback(struct klp_object *obj)
0045 {
0046 callback_info(__func__, obj);
0047 }
0048
0049
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,
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
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");