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