socsvn commit: r272130 - in soc2014/op/freebsd-base/sys: kern sys

op at FreeBSD.org op at FreeBSD.org
Sat Aug 9 15:33:03 UTC 2014


Author: op
Date: Sat Aug  9 15:33:02 2014
New Revision: 272130
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272130

Log:
  KSP: try to fix panic on kldunload when the module loaded at run-time
  
  Signed-off-by: Oliver Pinter <oliver.pntr at gmail.com>
  
  git: https://github.com/opntr/opBSD/tree/op/gsoc2014/smap+kpatch

Modified:
  soc2014/op/freebsd-base/sys/kern/kern_linker.c
  soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c
  soc2014/op/freebsd-base/sys/sys/selfpatch.h

Modified: soc2014/op/freebsd-base/sys/kern/kern_linker.c
==============================================================================
--- soc2014/op/freebsd-base/sys/kern/kern_linker.c	Sat Aug  9 15:32:48 2014	(r272129)
+++ soc2014/op/freebsd-base/sys/kern/kern_linker.c	Sat Aug  9 15:33:02 2014	(r272130)
@@ -421,7 +421,7 @@
 				return (error);
 			}
 			modules = !TAILQ_EMPTY(&lf->modules);
-			lf_selfpatch(lf, 0);
+			lf_selfpatch(lf, KSP_MODULE);
 			linker_file_register_sysctls(lf);
 			linker_file_sysinit(lf);
 			lf->flags |= LINKER_FILE_LINKED;
@@ -1611,7 +1611,7 @@
 		}
 		linker_file_register_modules(lf);
 		/* XXXOP */
-		lf_selfpatch(lf, KSP_PRELOAD);
+		lf_selfpatch(lf, KSP_MODULE);
 		if (linker_file_lookup_set(lf, "sysinit_set", &si_start,
 		    &si_stop, NULL) == 0)
 			sysinit_add(si_start, si_stop);

Modified: soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c
==============================================================================
--- soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Sat Aug  9 15:32:48 2014	(r272129)
+++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Sat Aug  9 15:33:02 2014	(r272130)
@@ -116,12 +116,12 @@
 }
 
 void
-lf_selfpatch(linker_file_t lf, int preload)
+lf_selfpatch(linker_file_t lf, int mod)
 {
 	struct lf_selfpatch *patch, *start, *stop;
 	int count, ret;
 
-	DBG("lf: %p %s\n", lf, preload ? "(preloaded)" : "");
+	DBG("lf: %p %s\n", lf, mod ? "(module)" : "(kernel)");
 
 	if (lf != NULL) {
 		DBG("module: %s\n", lf->filename);
@@ -143,8 +143,8 @@
 
 	for (patch = start; patch != stop; patch++) {
 		DBG("apply: %p\n", patch);
-		if (preload == KSP_PRELOAD)
-			lf_selfpatch_apply_preload(lf, patch);
+		if (mod == KSP_MODULE)
+			lf_selfpatch_apply_module(lf, patch);
 		else
 			lf_selfpatch_apply(lf, patch);
 	}
@@ -215,7 +215,7 @@
 }
 
 void
-lf_selfpatch_apply_preload(linker_file_t lf, struct lf_selfpatch *p)
+lf_selfpatch_apply_module(linker_file_t lf, struct lf_selfpatch *p)
 {
 
 	DBG("patchable: %p\n", p->patchable);

Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/sys/selfpatch.h	Sat Aug  9 15:32:48 2014	(r272129)
+++ soc2014/op/freebsd-base/sys/sys/selfpatch.h	Sat Aug  9 15:33:02 2014	(r272130)
@@ -36,7 +36,7 @@
 
 #include <machine/selfpatch-machdep.h>
 
-#define KSP_PRELOAD		1
+#define KSP_MODULE		1
 
 struct linker_file_t;
 
@@ -52,8 +52,8 @@
 
 extern char *selfpatch_nop_table[];
 
-void lf_selfpatch(linker_file_t lf, int preload);
+void lf_selfpatch(linker_file_t lf, int mod);
 void lf_selfpatch_apply(linker_file_t lf, struct lf_selfpatch *patch);
-void lf_selfpatch_apply_preload(linker_file_t lf, struct lf_selfpatch *patch);
+void lf_selfpatch_apply_module(linker_file_t lf, struct lf_selfpatch *patch);
 
 #endif /* __SELFPATH_H__ */


More information about the svn-soc-all mailing list