1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LIVEPATCH_CORE_H 3 #define _LIVEPATCH_CORE_H 4 5 #include <linux/livepatch.h> 6 7 extern struct mutex klp_mutex; 8 extern struct list_head klp_patches; 9 10 void klp_free_patch_start(struct klp_patch *patch); 11 void klp_discard_replaced_patches(struct klp_patch *new_patch); 12 13 static inline bool klp_is_object_loaded(struct klp_object *obj) 14 { 15 return !obj->name || obj->mod; 16 } 17 18 static inline int klp_pre_patch_callback(struct klp_object *obj) 19 { 20 int ret = 0; 21 22 if (obj->callbacks.pre_patch) 23 ret = (*obj->callbacks.pre_patch)(obj); 24 25 obj->callbacks.post_unpatch_enabled = !ret; 26 27 return ret; 28 } 29 30 static inline void klp_post_patch_callback(struct klp_object *obj) 31 { 32 if (obj->callbacks.post_patch) 33 (*obj->callbacks.post_patch)(obj); 34 } 35 36 static inline void klp_pre_unpatch_callback(struct klp_object *obj) 37 { 38 if (obj->callbacks.pre_unpatch) 39 (*obj->callbacks.pre_unpatch)(obj); 40 } 41 42 static inline void klp_post_unpatch_callback(struct klp_object *obj) 43 { 44 if (obj->callbacks.post_unpatch_enabled && 45 obj->callbacks.post_unpatch) 46 (*obj->callbacks.post_unpatch)(obj); 47 48 obj->callbacks.post_unpatch_enabled = false; 49 } 50 51 #endif /* _LIVEPATCH_CORE_H */ 52