blob: d4eefc520c088dc66d9da203f335adeee64c7f04 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Jiri Kosina10517422017-03-08 14:27:05 +01002#ifndef _LIVEPATCH_CORE_H
3#define _LIVEPATCH_CORE_H
4
Joe Lawrence93862e32017-10-13 15:08:41 -04005#include <linux/livepatch.h>
6
Jiri Kosina10517422017-03-08 14:27:05 +01007extern struct mutex klp_mutex;
Petr Mladek68007282019-01-09 13:43:22 +01008extern struct list_head klp_patches;
Jiri Kosina10517422017-03-08 14:27:05 +01009
Petr Mladek958ef1e2019-01-09 13:43:23 +010010void klp_free_patch_start(struct klp_patch *patch);
11
Joe Lawrence93862e32017-10-13 15:08:41 -040012static inline bool klp_is_object_loaded(struct klp_object *obj)
13{
14 return !obj->name || obj->mod;
15}
16
17static inline int klp_pre_patch_callback(struct klp_object *obj)
18{
Petr Mladek5aaf1ab2017-10-20 16:56:50 +020019 int ret = 0;
Joe Lawrence93862e32017-10-13 15:08:41 -040020
Petr Mladek5aaf1ab2017-10-20 16:56:50 +020021 if (obj->callbacks.pre_patch)
22 ret = (*obj->callbacks.pre_patch)(obj);
Joe Lawrence93862e32017-10-13 15:08:41 -040023
24 obj->callbacks.post_unpatch_enabled = !ret;
25
26 return ret;
27}
28
29static 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
35static 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
41static 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);
Petr Mladek5aaf1ab2017-10-20 16:56:50 +020046
47 obj->callbacks.post_unpatch_enabled = false;
Joe Lawrence93862e32017-10-13 15:08:41 -040048}
49
Jiri Kosina10517422017-03-08 14:27:05 +010050#endif /* _LIVEPATCH_CORE_H */