Date: Fri, 25 Jul 2014 19:10:29 GMT From: op@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271381 - in soc2014/op/freebsd-base/sys: amd64/amd64 kern sys Message-ID: <201407251910.s6PJATrg063097@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@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__ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407251910.s6PJATrg063097>