linux/kernel/livepatch/core.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LIVEPATCH_CORE_H
   3#define _LIVEPATCH_CORE_H
   4
   5#include <linux/livepatch.h>
   6
   7extern struct mutex klp_mutex;
   8extern struct list_head klp_patches;
   9
  10#define klp_for_each_patch_safe(patch, tmp_patch)               \
  11        list_for_each_entry_safe(patch, tmp_patch, &klp_patches, list)
  12
  13#define klp_for_each_patch(patch)       \
  14        list_for_each_entry(patch, &klp_patches, list)
  15
  16void klp_free_patch_async(struct klp_patch *patch);
  17void klp_free_replaced_patches_async(struct klp_patch *new_patch);
  18void klp_unpatch_replaced_patches(struct klp_patch *new_patch);
  19void klp_discard_nops(struct klp_patch *new_patch);
  20
  21static inline bool klp_is_object_loaded(struct klp_object *obj)
  22{
  23        return !obj->name || obj->mod;
  24}
  25
  26static inline int klp_pre_patch_callback(struct klp_object *obj)
  27{
  28        int ret = 0;
  29
  30        if (obj->callbacks.pre_patch)
  31                ret = (*obj->callbacks.pre_patch)(obj);
  32
  33        obj->callbacks.post_unpatch_enabled = !ret;
  34
  35        return ret;
  36}
  37
  38static inline void klp_post_patch_callback(struct klp_object *obj)
  39{
  40        if (obj->callbacks.post_patch)
  41                (*obj->callbacks.post_patch)(obj);
  42}
  43
  44static inline void klp_pre_unpatch_callback(struct klp_object *obj)
  45{
  46        if (obj->callbacks.pre_unpatch)
  47                (*obj->callbacks.pre_unpatch)(obj);
  48}
  49
  50static inline void klp_post_unpatch_callback(struct klp_object *obj)
  51{
  52        if (obj->callbacks.post_unpatch_enabled &&
  53            obj->callbacks.post_unpatch)
  54                (*obj->callbacks.post_unpatch)(obj);
  55
  56        obj->callbacks.post_unpatch_enabled = false;
  57}
  58
  59#endif /* _LIVEPATCH_CORE_H */
  60