Lines Matching full:patch
25 #include "patch.h"
71 * Note that the patch might still be needed before klp_module_going() in klp_find_object_module()
102 static struct klp_object *klp_find_object(struct klp_patch *patch, in klp_find_object() argument
107 klp_for_each_object(patch, obj) { in klp_find_object()
345 * /sys/kernel/livepatch/<patch>
346 * /sys/kernel/livepatch/<patch>/enabled
347 * /sys/kernel/livepatch/<patch>/transition
348 * /sys/kernel/livepatch/<patch>/force
349 * /sys/kernel/livepatch/<patch>/replace
350 * /sys/kernel/livepatch/<patch>/stack_order
351 * /sys/kernel/livepatch/<patch>/<object>
352 * /sys/kernel/livepatch/<patch>/<object>/patched
353 * /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
355 static int __klp_disable_patch(struct klp_patch *patch);
360 struct klp_patch *patch; in enabled_store() local
368 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
372 if (patch->enabled == enabled) { in enabled_store()
383 * Do not allow to re-enable a disabled patch. in enabled_store()
385 if (patch == klp_transition_patch) in enabled_store()
388 ret = __klp_disable_patch(patch); in enabled_store()
403 struct klp_patch *patch; in enabled_show() local
405 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
406 return sysfs_emit(buf, "%d\n", patch->enabled); in enabled_show()
412 struct klp_patch *patch; in transition_show() local
414 patch = container_of(kobj, struct klp_patch, kobj); in transition_show()
415 return sysfs_emit(buf, "%d\n", patch == klp_transition_patch); in transition_show()
421 struct klp_patch *patch; in force_store() local
434 patch = container_of(kobj, struct klp_patch, kobj); in force_store()
435 if (patch != klp_transition_patch) { in force_store()
450 struct klp_patch *patch; in replace_show() local
452 patch = container_of(kobj, struct klp_patch, kobj); in replace_show()
453 return sysfs_emit(buf, "%d\n", patch->replace); in replace_show()
459 struct klp_patch *patch, *this_patch; in stack_order_show() local
466 klp_for_each_patch(patch) { in stack_order_show()
468 if (patch == this_patch) in stack_order_show()
516 static void klp_init_object_early(struct klp_patch *patch,
520 struct klp_patch *patch) in klp_alloc_object_dynamic() argument
536 klp_init_object_early(patch, obj); in klp_alloc_object_dynamic()
576 static int klp_add_object_nops(struct klp_patch *patch, in klp_add_object_nops() argument
582 obj = klp_find_object(patch, old_obj); in klp_add_object_nops()
585 obj = klp_alloc_object_dynamic(old_obj->name, patch); in klp_add_object_nops()
606 * patch to facilitate a 'replace' mode.
608 static int klp_add_nops(struct klp_patch *patch) in klp_add_nops() argument
617 err = klp_add_object_nops(patch, old_obj); in klp_add_nops()
628 struct klp_patch *patch; in klp_kobj_release_patch() local
630 patch = container_of(kobj, struct klp_patch, kobj); in klp_kobj_release_patch()
631 complete(&patch->finish); in klp_kobj_release_patch()
699 static void __klp_free_objects(struct klp_patch *patch, bool nops_only) in __klp_free_objects() argument
703 klp_for_each_object_safe(patch, obj, tmp_obj) { in __klp_free_objects()
714 static void klp_free_objects(struct klp_patch *patch) in klp_free_objects() argument
716 __klp_free_objects(patch, false); in klp_free_objects()
719 static void klp_free_objects_dynamic(struct klp_patch *patch) in klp_free_objects_dynamic() argument
721 __klp_free_objects(patch, true); in klp_free_objects_dynamic()
731 static void klp_free_patch_start(struct klp_patch *patch) in klp_free_patch_start() argument
733 if (!list_empty(&patch->list)) in klp_free_patch_start()
734 list_del(&patch->list); in klp_free_patch_start()
736 klp_free_objects(patch); in klp_free_patch_start()
744 * the last function accessing the livepatch structures when the patch
747 static void klp_free_patch_finish(struct klp_patch *patch) in klp_free_patch_finish() argument
752 * this is called when the patch gets disabled and it in klp_free_patch_finish()
755 kobject_put(&patch->kobj); in klp_free_patch_finish()
756 wait_for_completion(&patch->finish); in klp_free_patch_finish()
759 if (!patch->forced) in klp_free_patch_finish()
760 module_put(patch->mod); in klp_free_patch_finish()
764 * The livepatch might be freed from sysfs interface created by the patch.
770 struct klp_patch *patch = in klp_free_patch_work_fn() local
773 klp_free_patch_finish(patch); in klp_free_patch_work_fn()
776 void klp_free_patch_async(struct klp_patch *patch) in klp_free_patch_async() argument
778 klp_free_patch_start(patch); in klp_free_patch_async()
779 schedule_work(&patch->free_work); in klp_free_patch_async()
822 static int klp_write_object_relocs(struct klp_patch *patch, in klp_write_object_relocs() argument
827 struct klp_modinfo *info = patch->mod->klp_info; in klp_write_object_relocs()
835 ret = klp_write_section_relocs(patch->mod, info->sechdrs, in klp_write_object_relocs()
837 patch->mod->core_kallsyms.strtab, in klp_write_object_relocs()
846 static int klp_apply_object_relocs(struct klp_patch *patch, in klp_apply_object_relocs() argument
849 return klp_write_object_relocs(patch, obj, true); in klp_apply_object_relocs()
852 static void klp_clear_object_relocs(struct klp_patch *patch, in klp_clear_object_relocs() argument
855 klp_write_object_relocs(patch, obj, false); in klp_clear_object_relocs()
859 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
872 ret = klp_apply_object_relocs(patch, obj); in klp_init_object_loaded()
907 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
922 ret = kobject_add(&obj->kobj, &patch->kobj, "%s", name); in klp_init_object()
933 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
945 static void klp_init_object_early(struct klp_patch *patch, in klp_init_object_early() argument
950 list_add_tail(&obj->node, &patch->obj_list); in klp_init_object_early()
953 static void klp_init_patch_early(struct klp_patch *patch) in klp_init_patch_early() argument
958 INIT_LIST_HEAD(&patch->list); in klp_init_patch_early()
959 INIT_LIST_HEAD(&patch->obj_list); in klp_init_patch_early()
960 kobject_init(&patch->kobj, &klp_ktype_patch); in klp_init_patch_early()
961 patch->enabled = false; in klp_init_patch_early()
962 patch->forced = false; in klp_init_patch_early()
963 INIT_WORK(&patch->free_work, klp_free_patch_work_fn); in klp_init_patch_early()
964 init_completion(&patch->finish); in klp_init_patch_early()
966 klp_for_each_object_static(patch, obj) { in klp_init_patch_early()
967 klp_init_object_early(patch, obj); in klp_init_patch_early()
975 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
980 ret = kobject_add(&patch->kobj, klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
984 if (patch->replace) { in klp_init_patch()
985 ret = klp_add_nops(patch); in klp_init_patch()
990 klp_for_each_object(patch, obj) { in klp_init_patch()
991 ret = klp_init_object(patch, obj); in klp_init_patch()
996 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
1001 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
1005 if (WARN_ON(!patch->enabled)) in __klp_disable_patch()
1011 klp_init_transition(patch, KLP_TRANSITION_UNPATCHED); in __klp_disable_patch()
1013 klp_for_each_object(patch, obj) in __klp_disable_patch()
1027 patch->enabled = false; in __klp_disable_patch()
1033 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
1041 if (WARN_ON(patch->enabled)) in __klp_enable_patch()
1044 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
1046 klp_init_transition(patch, KLP_TRANSITION_PATCHED); in __klp_enable_patch()
1057 klp_for_each_object(patch, obj) { in __klp_enable_patch()
1063 pr_warn("pre-patch callback failed for object '%s'\n", in __klp_enable_patch()
1070 pr_warn("failed to patch object '%s'\n", in __klp_enable_patch()
1077 patch->enabled = true; in __klp_enable_patch()
1082 pr_warn("failed to enable patch '%s'\n", patch->mod->name); in __klp_enable_patch()
1090 * @patch: patch to be enabled
1092 * Initializes the data structure associated with the patch, creates the sysfs
1101 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
1106 if (!patch || !patch->mod || !patch->objs) in klp_enable_patch()
1109 klp_for_each_object_static(patch, obj) { in klp_enable_patch()
1115 if (!is_livepatch_module(patch->mod)) { in klp_enable_patch()
1117 patch->mod->name); in klp_enable_patch()
1131 if (!klp_is_patch_compatible(patch)) { in klp_enable_patch()
1132 pr_err("Livepatch patch (%s) is not compatible with the already installed livepatches.\n", in klp_enable_patch()
1133 patch->mod->name); in klp_enable_patch()
1138 if (!try_module_get(patch->mod)) { in klp_enable_patch()
1143 klp_init_patch_early(patch); in klp_enable_patch()
1145 ret = klp_init_patch(patch); in klp_enable_patch()
1149 ret = __klp_enable_patch(patch); in klp_enable_patch()
1158 klp_free_patch_start(patch); in klp_enable_patch()
1162 klp_free_patch_finish(patch); in klp_enable_patch()
1178 * klp_ftrace_handler() might still see the replaced patch on the stack.
1181 * this is handled transparently by patch->module_put.
1226 struct klp_patch *patch; in klp_cleanup_module_patches_limited() local
1229 klp_for_each_patch(patch) { in klp_cleanup_module_patches_limited()
1230 if (patch == limit) in klp_cleanup_module_patches_limited()
1233 klp_for_each_object(patch, obj) { in klp_cleanup_module_patches_limited()
1237 if (patch != klp_transition_patch) in klp_cleanup_module_patches_limited()
1240 pr_notice("reverting patch '%s' on unloading module '%s'\n", in klp_cleanup_module_patches_limited()
1241 patch->mod->name, obj->mod->name); in klp_cleanup_module_patches_limited()
1245 klp_clear_object_relocs(patch, obj); in klp_cleanup_module_patches_limited()
1255 struct klp_patch *patch; in klp_module_coming() local
1270 * get patched by a new patch. in klp_module_coming()
1274 klp_for_each_patch(patch) { in klp_module_coming()
1275 klp_for_each_object(patch, obj) { in klp_module_coming()
1281 ret = klp_init_object_loaded(patch, obj); in klp_module_coming()
1283 pr_warn("failed to initialize patch '%s' for module '%s' (%d)\n", in klp_module_coming()
1284 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1288 pr_notice("applying patch '%s' to loading module '%s'\n", in klp_module_coming()
1289 patch->mod->name, obj->mod->name); in klp_module_coming()
1293 pr_warn("pre-patch callback failed for object '%s'\n", in klp_module_coming()
1300 pr_warn("failed to apply patch '%s' to module '%s' (%d)\n", in klp_module_coming()
1301 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1307 if (patch != klp_transition_patch) in klp_module_coming()
1320 * If a patch is unsuccessfully applied, return in klp_module_coming()
1323 pr_warn("patch '%s' failed for module '%s', refusing to load module '%s'\n", in klp_module_coming()
1324 patch->mod->name, obj->mod->name, obj->mod->name); in klp_module_coming()
1327 klp_cleanup_module_patches_limited(mod, patch); in klp_module_coming()
1343 * get patched by a new patch. in klp_module_going()