aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/livepatch/core.c')
-rw-r--r--kernel/livepatch/core.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 8bbe50704621..af4643873e71 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -274,7 +274,6 @@ static int klp_write_object_relocations(struct module *pmod,
274 274
275 objname = klp_is_module(obj) ? obj->name : "vmlinux"; 275 objname = klp_is_module(obj) ? obj->name : "vmlinux";
276 276
277 module_disable_ro(pmod);
278 /* For each klp relocation section */ 277 /* For each klp relocation section */
279 for (i = 1; i < pmod->klp_info->hdr.e_shnum; i++) { 278 for (i = 1; i < pmod->klp_info->hdr.e_shnum; i++) {
280 sec = pmod->klp_info->sechdrs + i; 279 sec = pmod->klp_info->sechdrs + i;
@@ -309,7 +308,6 @@ static int klp_write_object_relocations(struct module *pmod,
309 break; 308 break;
310 } 309 }
311 310
312 module_enable_ro(pmod, true);
313 return ret; 311 return ret;
314} 312}
315 313
@@ -547,9 +545,6 @@ static int __klp_enable_patch(struct klp_patch *patch)
547 list_prev_entry(patch, list)->state == KLP_DISABLED) 545 list_prev_entry(patch, list)->state == KLP_DISABLED)
548 return -EBUSY; 546 return -EBUSY;
549 547
550 pr_notice_once("tainting kernel with TAINT_LIVEPATCH\n");
551 add_taint(TAINT_LIVEPATCH, LOCKDEP_STILL_OK);
552
553 pr_notice("enabling patch '%s'\n", patch->mod->name); 548 pr_notice("enabling patch '%s'\n", patch->mod->name);
554 549
555 klp_for_each_object(patch, obj) { 550 klp_for_each_object(patch, obj) {
@@ -763,6 +758,12 @@ static int klp_init_func(struct klp_object *obj, struct klp_func *func)
763 func->old_sympos ? func->old_sympos : 1); 758 func->old_sympos ? func->old_sympos : 1);
764} 759}
765 760
761/* Arches may override this to finish any remaining arch-specific tasks */
762void __weak arch_klp_init_object_loaded(struct klp_patch *patch,
763 struct klp_object *obj)
764{
765}
766
766/* parts of the initialization that is done only when the object is loaded */ 767/* parts of the initialization that is done only when the object is loaded */
767static int klp_init_object_loaded(struct klp_patch *patch, 768static int klp_init_object_loaded(struct klp_patch *patch,
768 struct klp_object *obj) 769 struct klp_object *obj)
@@ -770,9 +771,15 @@ static int klp_init_object_loaded(struct klp_patch *patch,
770 struct klp_func *func; 771 struct klp_func *func;
771 int ret; 772 int ret;
772 773
774 module_disable_ro(patch->mod);
773 ret = klp_write_object_relocations(patch->mod, obj); 775 ret = klp_write_object_relocations(patch->mod, obj);
774 if (ret) 776 if (ret) {
777 module_enable_ro(patch->mod, true);
775 return ret; 778 return ret;
779 }
780
781 arch_klp_init_object_loaded(patch, obj);
782 module_enable_ro(patch->mod, true);
776 783
777 klp_for_each_func(obj, func) { 784 klp_for_each_func(obj, func) {
778 ret = klp_find_object_symbol(obj->name, func->old_name, 785 ret = klp_find_object_symbol(obj->name, func->old_name,