0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LINUX_LIVEPATCH_H_
0010 #define _LINUX_LIVEPATCH_H_
0011
0012 #include <linux/module.h>
0013 #include <linux/ftrace.h>
0014 #include <linux/completion.h>
0015 #include <linux/list.h>
0016
0017 #if IS_ENABLED(CONFIG_LIVEPATCH)
0018
0019
0020 #define KLP_UNDEFINED -1
0021 #define KLP_UNPATCHED 0
0022 #define KLP_PATCHED 1
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 struct klp_func {
0056
0057 const char *old_name;
0058 void *new_func;
0059
0060
0061
0062
0063
0064
0065
0066 unsigned long old_sympos;
0067
0068
0069 void *old_func;
0070 struct kobject kobj;
0071 struct list_head node;
0072 struct list_head stack_node;
0073 unsigned long old_size, new_size;
0074 bool nop;
0075 bool patched;
0076 bool transition;
0077 };
0078
0079 struct klp_object;
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 struct klp_callbacks {
0096 int (*pre_patch)(struct klp_object *obj);
0097 void (*post_patch)(struct klp_object *obj);
0098 void (*pre_unpatch)(struct klp_object *obj);
0099 void (*post_unpatch)(struct klp_object *obj);
0100 bool post_unpatch_enabled;
0101 };
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 struct klp_object {
0117
0118 const char *name;
0119 struct klp_func *funcs;
0120 struct klp_callbacks callbacks;
0121
0122
0123 struct kobject kobj;
0124 struct list_head func_list;
0125 struct list_head node;
0126 struct module *mod;
0127 bool dynamic;
0128 bool patched;
0129 };
0130
0131
0132
0133
0134
0135
0136
0137 struct klp_state {
0138 unsigned long id;
0139 unsigned int version;
0140 void *data;
0141 };
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 struct klp_patch {
0158
0159 struct module *mod;
0160 struct klp_object *objs;
0161 struct klp_state *states;
0162 bool replace;
0163
0164
0165 struct list_head list;
0166 struct kobject kobj;
0167 struct list_head obj_list;
0168 bool enabled;
0169 bool forced;
0170 struct work_struct free_work;
0171 struct completion finish;
0172 };
0173
0174 #define klp_for_each_object_static(patch, obj) \
0175 for (obj = patch->objs; obj->funcs || obj->name; obj++)
0176
0177 #define klp_for_each_object_safe(patch, obj, tmp_obj) \
0178 list_for_each_entry_safe(obj, tmp_obj, &patch->obj_list, node)
0179
0180 #define klp_for_each_object(patch, obj) \
0181 list_for_each_entry(obj, &patch->obj_list, node)
0182
0183 #define klp_for_each_func_static(obj, func) \
0184 for (func = obj->funcs; \
0185 func->old_name || func->new_func || func->old_sympos; \
0186 func++)
0187
0188 #define klp_for_each_func_safe(obj, func, tmp_func) \
0189 list_for_each_entry_safe(func, tmp_func, &obj->func_list, node)
0190
0191 #define klp_for_each_func(obj, func) \
0192 list_for_each_entry(func, &obj->func_list, node)
0193
0194 int klp_enable_patch(struct klp_patch *);
0195
0196
0197 int klp_module_coming(struct module *mod);
0198 void klp_module_going(struct module *mod);
0199
0200 void klp_copy_process(struct task_struct *child);
0201 void klp_update_patch_state(struct task_struct *task);
0202
0203 static inline bool klp_patch_pending(struct task_struct *task)
0204 {
0205 return test_tsk_thread_flag(task, TIF_PATCH_PENDING);
0206 }
0207
0208 static inline bool klp_have_reliable_stack(void)
0209 {
0210 return IS_ENABLED(CONFIG_STACKTRACE) &&
0211 IS_ENABLED(CONFIG_HAVE_RELIABLE_STACKTRACE);
0212 }
0213
0214 typedef int (*klp_shadow_ctor_t)(void *obj,
0215 void *shadow_data,
0216 void *ctor_data);
0217 typedef void (*klp_shadow_dtor_t)(void *obj, void *shadow_data);
0218
0219 void *klp_shadow_get(void *obj, unsigned long id);
0220 void *klp_shadow_alloc(void *obj, unsigned long id,
0221 size_t size, gfp_t gfp_flags,
0222 klp_shadow_ctor_t ctor, void *ctor_data);
0223 void *klp_shadow_get_or_alloc(void *obj, unsigned long id,
0224 size_t size, gfp_t gfp_flags,
0225 klp_shadow_ctor_t ctor, void *ctor_data);
0226 void klp_shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor);
0227 void klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor);
0228
0229 struct klp_state *klp_get_state(struct klp_patch *patch, unsigned long id);
0230 struct klp_state *klp_get_prev_state(unsigned long id);
0231
0232 int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
0233 const char *shstrtab, const char *strtab,
0234 unsigned int symindex, unsigned int secindex,
0235 const char *objname);
0236
0237 #else
0238
0239 static inline int klp_module_coming(struct module *mod) { return 0; }
0240 static inline void klp_module_going(struct module *mod) {}
0241 static inline bool klp_patch_pending(struct task_struct *task) { return false; }
0242 static inline void klp_update_patch_state(struct task_struct *task) {}
0243 static inline void klp_copy_process(struct task_struct *child) {}
0244
0245 static inline
0246 int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
0247 const char *shstrtab, const char *strtab,
0248 unsigned int symindex, unsigned int secindex,
0249 const char *objname)
0250 {
0251 return 0;
0252 }
0253
0254 #endif
0255
0256 #endif