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

op at FreeBSD.org op at FreeBSD.org
Fri Jul 25 19:10:31 UTC 2014


Author: op
Date: Fri Jul 25 19:10:29 2014
New Revision: 271381
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271381

Log:
  KSP: fix module patching in preloaded case
  
  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/amd64/amd64/machdep.c
  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/amd64/amd64/machdep.c
==============================================================================
--- soc2014/op/freebsd-base/sys/amd64/amd64/machdep.c	Fri Jul 25 18:41:56 2014	(r271380)
+++ soc2014/op/freebsd-base/sys/amd64/amd64/machdep.c	Fri Jul 25 19:10:29 2014	(r271381)
@@ -2000,7 +2000,7 @@
 	initializecpucache();
 
 	/* selfmodify kernel text, when needed */
-	lf_selfpatch(linker_kernel_file);
+	lf_selfpatch(linker_kernel_file, 0);
 
 	/* doublefault stack space, runs on ist1 */
 	common_tss[0].tss_ist1 = (long)&dblfault_stack[sizeof(dblfault_stack)];

Modified: soc2014/op/freebsd-base/sys/kern/kern_linker.c
==============================================================================
--- soc2014/op/freebsd-base/sys/kern/kern_linker.c	Fri Jul 25 18:41:56 2014	(r271380)
+++ soc2014/op/freebsd-base/sys/kern/kern_linker.c	Fri Jul 25 19:10:29 2014	(r271381)
@@ -421,7 +421,7 @@
 				return (error);
 			}
 			modules = !TAILQ_EMPTY(&lf->modules);
-			lf_selfpatch(lf);
+			lf_selfpatch(lf, 0);
 			linker_file_register_sysctls(lf);
 			linker_file_sysinit(lf);
 			lf->flags |= LINKER_FILE_LINKED;
@@ -1609,9 +1609,9 @@
 			    lf->filename);
 			goto fail;
 		}
-		/* XXXOP - linker_kernel_file double patched?*/
-		lf_selfpatch(lf);
 		linker_file_register_modules(lf);
+		/* XXXOP */
+		lf_selfpatch(lf, KSP_PRELOAD);
 		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	Fri Jul 25 18:41:56 2014	(r271380)
+++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Fri Jul 25 19:10:29 2014	(r271381)
@@ -116,11 +116,13 @@
 }
 
 void
-lf_selfpatch(linker_file_t lf)
+lf_selfpatch(linker_file_t lf, int preload)
 {
 	struct lf_selfpatch *patch, *start, *stop;
 	int count, ret;
 
+	DBG("lf: %p %s\n", lf, preload ? "(preloaded)" : "");
+
 	if (lf != NULL) {
 		DBG("module: %s\n", lf->filename);
 		ret = linker_file_lookup_set(lf, "selfpatch_set", &start, &stop, NULL);
@@ -141,7 +143,10 @@
 
 	for (patch = start; patch != stop; patch++) {
 		DBG("apply: %p\n", patch);
-		lf_selfpatch_apply(lf, patch);
+		if (preload == KSP_PRELOAD)
+			lf_selfpatch_apply_preload(lf, patch);
+		else
+			lf_selfpatch_apply(lf, patch);
 	}
 
 	/*
@@ -217,6 +222,31 @@
 #endif
 }
 
+void
+lf_selfpatch_apply_preload(linker_file_t lf, struct lf_selfpatch *p)
+{
+
+	DBG("patchable: %p\n", p->patchable);
+	DBG("patch: %p\n", p->patch);
+	DBG("feature selector: %d\n", p->feature_selector);
+	DBG("feature: %d\n", p->feature);
+	DBG("patchable size: %d\n", p->patchable_size);
+	DBG("patch size: %d\n", p->patch_size);
+	DBG("comment: %s\n", p->comment);
+
+	if (!lf_selfpatch_patch_needed(p)) {
+		DBG("not needed.\n");
+
+		return;
+	}
+
+	if (p->patch_size != p->patchable_size)
+		panic("%s: patch_size != patchable_size", __func__);
+
+	memcpy(p->patchable, p->patch, p->patchable_size);
+
+	DBG("patched.\n");
+}
 
 __noinline void
 lf_selfpatch_selftest(void)

Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 25 18:41:56 2014	(r271380)
+++ soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 25 19:10:29 2014	(r271381)
@@ -29,11 +29,14 @@
 #ifndef __SELFPATH_H__
 #define __SELFPATH_H__
 
+#include <machine/selfpatch-asmacros.h>
+
 #define KSP_SELFTEST		0
 #define KSP_FEATURE_SELFTEST	1
 
 #include <machine/selfpatch-machdep.h>
-#include <machine/selfpatch-asmacros.h>
+
+#define KSP_PRELOAD		1
 
 struct linker_file_t;
 
@@ -49,7 +52,8 @@
 
 extern char *selfpatch_nop_table[];
 
-void lf_selfpatch(linker_file_t lf);
+void lf_selfpatch(linker_file_t lf, int preload);
 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);
 
 #endif /* __SELFPATH_H__ */


More information about the svn-soc-all mailing list