xref: /linux-6.15/kernel/livepatch/core.h (revision 68007289)
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