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 12 static inline bool klp_is_object_loaded(struct klp_object *obj) 13 { 14 return !obj->name || obj->mod; 15 } 16 17 static inline int klp_pre_patch_callback(struct klp_object *obj) 18 { 19 int ret = 0; 20 21 if (obj->callbacks.pre_patch) 22 ret = (*obj->callbacks.pre_patch)(obj); 23 24 obj->callbacks.post_unpatch_enabled = !ret; 25 26 return ret; 27 } 28 29 static inline void klp_post_patch_callback(struct klp_object *obj) 30 { 31 if (obj->callbacks.post_patch) 32 (*obj->callbacks.post_patch)(obj); 33 } 34 35 static inline void klp_pre_unpatch_callback(struct klp_object *obj) 36 { 37 if (obj->callbacks.pre_unpatch) 38 (*obj->callbacks.pre_unpatch)(obj); 39 } 40 41 static inline void klp_post_unpatch_callback(struct klp_object *obj) 42 { 43 if (obj->callbacks.post_unpatch_enabled && 44 obj->callbacks.post_unpatch) 45 (*obj->callbacks.post_unpatch)(obj); 46 47 obj->callbacks.post_unpatch_enabled = false; 48 } 49 50 #endif /* _LIVEPATCH_CORE_H */ 51