1 /* 2 * livepatch.h - Kernel Live Patching Core 3 * 4 * Copyright (C) 2014 Seth Jennings <[email protected]> 5 * Copyright (C) 2014 SUSE 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifndef _LINUX_LIVEPATCH_H_ 22 #define _LINUX_LIVEPATCH_H_ 23 24 #include <linux/module.h> 25 #include <linux/ftrace.h> 26 27 #if IS_ENABLED(CONFIG_LIVEPATCH) 28 29 #include <asm/livepatch.h> 30 31 /** 32 * struct klp_func - function structure for live patching 33 * @old_name: name of the function to be patched 34 * @new_func: pointer to the patched function code 35 * @old_sympos: a hint indicating which symbol position the old function 36 * can be found (optional) 37 * @old_addr: the address of the function being patched 38 * @kobj: kobject for sysfs resources 39 * @stack_node: list node for klp_ops func_stack list 40 * @patched: the func has been added to the klp_ops list 41 */ 42 struct klp_func { 43 /* external */ 44 const char *old_name; 45 void *new_func; 46 /* 47 * The old_sympos field is optional and can be used to resolve 48 * duplicate symbol names in livepatch objects. If this field is zero, 49 * it is expected the symbol is unique, otherwise patching fails. If 50 * this value is greater than zero then that occurrence of the symbol 51 * in kallsyms for the given object is used. 52 */ 53 unsigned long old_sympos; 54 55 /* internal */ 56 unsigned long old_addr; 57 struct kobject kobj; 58 struct list_head stack_node; 59 bool patched; 60 }; 61 62 /** 63 * struct klp_object - kernel object structure for live patching 64 * @name: module name (or NULL for vmlinux) 65 * @funcs: function entries for functions to be patched in the object 66 * @kobj: kobject for sysfs resources 67 * @mod: kernel module associated with the patched object 68 * (NULL for vmlinux) 69 * @patched: the object's funcs have been added to the klp_ops list 70 */ 71 struct klp_object { 72 /* external */ 73 const char *name; 74 struct klp_func *funcs; 75 76 /* internal */ 77 struct kobject kobj; 78 struct module *mod; 79 bool patched; 80 }; 81 82 /** 83 * struct klp_patch - patch structure for live patching 84 * @mod: reference to the live patch module 85 * @objs: object entries for kernel objects to be patched 86 * @list: list node for global list of registered patches 87 * @kobj: kobject for sysfs resources 88 * @enabled: the patch is enabled (but operation may be incomplete) 89 */ 90 struct klp_patch { 91 /* external */ 92 struct module *mod; 93 struct klp_object *objs; 94 95 /* internal */ 96 struct list_head list; 97 struct kobject kobj; 98 bool enabled; 99 }; 100 101 #define klp_for_each_object(patch, obj) \ 102 for (obj = patch->objs; obj->funcs || obj->name; obj++) 103 104 #define klp_for_each_func(obj, func) \ 105 for (func = obj->funcs; \ 106 func->old_name || func->new_func || func->old_sympos; \ 107 func++) 108 109 int klp_register_patch(struct klp_patch *); 110 int klp_unregister_patch(struct klp_patch *); 111 int klp_enable_patch(struct klp_patch *); 112 int klp_disable_patch(struct klp_patch *); 113 114 void arch_klp_init_object_loaded(struct klp_patch *patch, 115 struct klp_object *obj); 116 117 /* Called from the module loader during module coming/going states */ 118 int klp_module_coming(struct module *mod); 119 void klp_module_going(struct module *mod); 120 121 void klp_update_patch_state(struct task_struct *task); 122 123 #else /* !CONFIG_LIVEPATCH */ 124 125 static inline int klp_module_coming(struct module *mod) { return 0; } 126 static inline void klp_module_going(struct module *mod) {} 127 static inline void klp_update_patch_state(struct task_struct *task) {} 128 129 #endif /* CONFIG_LIVEPATCH */ 130 131 #endif /* _LINUX_LIVEPATCH_H_ */ 132