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