• Home
  • Raw
  • Download

Lines Matching full:patch

36 #include "patch.h"
75 * Note that the patch might still be needed before klp_module_going() in klp_find_object_module()
86 static bool klp_is_patch_registered(struct klp_patch *patch) in klp_is_patch_registered() argument
91 if (mypatch == patch) in klp_is_patch_registered()
282 static int __klp_disable_patch(struct klp_patch *patch) in __klp_disable_patch() argument
286 if (WARN_ON(!patch->enabled)) in __klp_disable_patch()
292 /* enforce stacking: only the last enabled patch can be disabled */ in __klp_disable_patch()
293 if (!list_is_last(&patch->list, &klp_patches) && in __klp_disable_patch()
294 list_next_entry(patch, list)->enabled) in __klp_disable_patch()
297 klp_init_transition(patch, KLP_UNPATCHED); in __klp_disable_patch()
299 klp_for_each_object(patch, obj) in __klp_disable_patch()
314 patch->enabled = false; in __klp_disable_patch()
320 * klp_disable_patch() - disables a registered patch
321 * @patch: The registered, enabled patch to be disabled
327 int klp_disable_patch(struct klp_patch *patch) in klp_disable_patch() argument
333 if (!klp_is_patch_registered(patch)) { in klp_disable_patch()
338 if (!patch->enabled) { in klp_disable_patch()
343 ret = __klp_disable_patch(patch); in klp_disable_patch()
351 static int __klp_enable_patch(struct klp_patch *patch) in __klp_enable_patch() argument
359 if (WARN_ON(patch->enabled)) in __klp_enable_patch()
362 /* enforce stacking: only the first disabled patch can be enabled */ in __klp_enable_patch()
363 if (patch->list.prev != &klp_patches && in __klp_enable_patch()
364 !list_prev_entry(patch, list)->enabled) in __klp_enable_patch()
368 * A reference is taken on the patch module to prevent it from being in __klp_enable_patch()
371 if (!try_module_get(patch->mod)) in __klp_enable_patch()
374 pr_notice("enabling patch '%s'\n", patch->mod->name); in __klp_enable_patch()
376 klp_init_transition(patch, KLP_PATCHED); in __klp_enable_patch()
387 klp_for_each_object(patch, obj) { in __klp_enable_patch()
393 pr_warn("pre-patch callback failed for object '%s'\n", in __klp_enable_patch()
400 pr_warn("failed to patch object '%s'\n", in __klp_enable_patch()
408 patch->enabled = true; in __klp_enable_patch()
412 pr_warn("failed to enable patch '%s'\n", patch->mod->name); in __klp_enable_patch()
419 * klp_enable_patch() - enables a registered patch
420 * @patch: The registered, disabled patch to be enabled
427 int klp_enable_patch(struct klp_patch *patch) in klp_enable_patch() argument
433 if (!klp_is_patch_registered(patch)) { in klp_enable_patch()
438 ret = __klp_enable_patch(patch); in klp_enable_patch()
450 * /sys/kernel/livepatch/<patch>
451 * /sys/kernel/livepatch/<patch>/enabled
452 * /sys/kernel/livepatch/<patch>/transition
453 * /sys/kernel/livepatch/<patch>/signal
454 * /sys/kernel/livepatch/<patch>/force
455 * /sys/kernel/livepatch/<patch>/<object>
456 * /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
462 struct klp_patch *patch; in enabled_store() local
470 patch = container_of(kobj, struct klp_patch, kobj); in enabled_store()
474 if (!klp_is_patch_registered(patch)) { in enabled_store()
476 * Module with the patch could either disappear meanwhile or is in enabled_store()
483 if (patch->enabled == enabled) { in enabled_store()
489 if (patch == klp_transition_patch) { in enabled_store()
492 ret = __klp_enable_patch(patch); in enabled_store()
496 ret = __klp_disable_patch(patch); in enabled_store()
513 struct klp_patch *patch; in enabled_show() local
515 patch = container_of(kobj, struct klp_patch, kobj); in enabled_show()
516 return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->enabled); in enabled_show()
522 struct klp_patch *patch; in transition_show() local
524 patch = container_of(kobj, struct klp_patch, kobj); in transition_show()
526 patch == klp_transition_patch); in transition_show()
532 struct klp_patch *patch; in signal_store() local
545 patch = container_of(kobj, struct klp_patch, kobj); in signal_store()
546 if (patch != klp_transition_patch) { in signal_store()
561 struct klp_patch *patch; in force_store() local
574 patch = container_of(kobj, struct klp_patch, kobj); in force_store()
575 if (patch != klp_transition_patch) { in force_store()
601 struct klp_patch *patch; in klp_kobj_release_patch() local
603 patch = container_of(kobj, struct klp_patch, kobj); in klp_kobj_release_patch()
604 complete(&patch->finish); in klp_kobj_release_patch()
659 static void klp_free_objects_limited(struct klp_patch *patch, in klp_free_objects_limited() argument
664 for (obj = patch->objs; obj->funcs && obj != limit; obj++) { in klp_free_objects_limited()
670 static void klp_free_patch(struct klp_patch *patch) in klp_free_patch() argument
672 klp_free_objects_limited(patch, NULL); in klp_free_patch()
673 if (!list_empty(&patch->list)) in klp_free_patch()
674 list_del(&patch->list); in klp_free_patch()
700 void __weak arch_klp_init_object_loaded(struct klp_patch *patch, in arch_klp_init_object_loaded() argument
706 static int klp_init_object_loaded(struct klp_patch *patch, in klp_init_object_loaded() argument
714 module_disable_ro(patch->mod); in klp_init_object_loaded()
715 ret = klp_write_object_relocations(patch->mod, obj); in klp_init_object_loaded()
717 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
722 arch_klp_init_object_loaded(patch, obj); in klp_init_object_loaded()
723 module_enable_ro(patch->mod, true); in klp_init_object_loaded()
754 static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) in klp_init_object() argument
773 &patch->kobj, "%s", name); in klp_init_object()
784 ret = klp_init_object_loaded(patch, obj); in klp_init_object()
797 static int klp_init_patch(struct klp_patch *patch) in klp_init_patch() argument
802 if (!patch->objs) in klp_init_patch()
807 patch->enabled = false; in klp_init_patch()
808 init_completion(&patch->finish); in klp_init_patch()
810 ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch, in klp_init_patch()
811 klp_root_kobj, "%s", patch->mod->name); in klp_init_patch()
817 klp_for_each_object(patch, obj) { in klp_init_patch()
818 ret = klp_init_object(patch, obj); in klp_init_patch()
823 list_add_tail(&patch->list, &klp_patches); in klp_init_patch()
830 klp_free_objects_limited(patch, obj); in klp_init_patch()
834 kobject_put(&patch->kobj); in klp_init_patch()
835 wait_for_completion(&patch->finish); in klp_init_patch()
841 * klp_unregister_patch() - unregisters a patch
842 * @patch: Disabled patch to be unregistered
848 int klp_unregister_patch(struct klp_patch *patch) in klp_unregister_patch() argument
854 if (!klp_is_patch_registered(patch)) { in klp_unregister_patch()
859 if (patch->enabled) { in klp_unregister_patch()
864 klp_free_patch(patch); in klp_unregister_patch()
868 kobject_put(&patch->kobj); in klp_unregister_patch()
869 wait_for_completion(&patch->finish); in klp_unregister_patch()
879 * klp_register_patch() - registers a patch
880 * @patch: Patch to be registered
882 * Initializes the data structure associated with the patch and
885 * There is no need to take the reference on the patch module here. It is done
886 * later when the patch is enabled.
890 int klp_register_patch(struct klp_patch *patch) in klp_register_patch() argument
892 if (!patch || !patch->mod) in klp_register_patch()
895 if (!is_livepatch_module(patch->mod)) { in klp_register_patch()
897 patch->mod->name); in klp_register_patch()
909 return klp_init_patch(patch); in klp_register_patch()
921 struct klp_patch *patch; in klp_cleanup_module_patches_limited() local
924 list_for_each_entry(patch, &klp_patches, list) { in klp_cleanup_module_patches_limited()
925 if (patch == limit) in klp_cleanup_module_patches_limited()
928 klp_for_each_object(patch, obj) { in klp_cleanup_module_patches_limited()
933 * Only unpatch the module if the patch is enabled or in klp_cleanup_module_patches_limited()
936 if (patch->enabled || patch == klp_transition_patch) { in klp_cleanup_module_patches_limited()
938 if (patch != klp_transition_patch) in klp_cleanup_module_patches_limited()
941 pr_notice("reverting patch '%s' on unloading module '%s'\n", in klp_cleanup_module_patches_limited()
942 patch->mod->name, obj->mod->name); in klp_cleanup_module_patches_limited()
957 struct klp_patch *patch; in klp_module_coming() local
967 * get patched by a new patch. in klp_module_coming()
971 list_for_each_entry(patch, &klp_patches, list) { in klp_module_coming()
972 klp_for_each_object(patch, obj) { in klp_module_coming()
978 ret = klp_init_object_loaded(patch, obj); in klp_module_coming()
980 pr_warn("failed to initialize patch '%s' for module '%s' (%d)\n", in klp_module_coming()
981 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
986 * Only patch the module if the patch is enabled or is in klp_module_coming()
989 if (!patch->enabled && patch != klp_transition_patch) in klp_module_coming()
992 pr_notice("applying patch '%s' to loading module '%s'\n", in klp_module_coming()
993 patch->mod->name, obj->mod->name); in klp_module_coming()
997 pr_warn("pre-patch callback failed for object '%s'\n", in klp_module_coming()
1004 pr_warn("failed to apply patch '%s' to module '%s' (%d)\n", in klp_module_coming()
1005 patch->mod->name, obj->mod->name, ret); in klp_module_coming()
1011 if (patch != klp_transition_patch) in klp_module_coming()
1024 * If a patch is unsuccessfully applied, return in klp_module_coming()
1027 pr_warn("patch '%s' failed for module '%s', refusing to load module '%s'\n", in klp_module_coming()
1028 patch->mod->name, obj->mod->name, obj->mod->name); in klp_module_coming()
1031 klp_cleanup_module_patches_limited(mod, patch); in klp_module_coming()
1047 * get patched by a new patch. in klp_module_going()