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