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