Date: Fri, 18 Jul 2014 16:09:46 GMT From: op@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271086 - in soc2014/op/freebsd-base/sys: kern sys Message-ID: <201407181609.s6IG9kNw053711@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: op Date: Fri Jul 18 16:09:46 2014 New Revision: 271086 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271086 Log: KSP: added selftest Signed-off-by: Oliver Pinter <oliver.pntr@gmail.com> git: https://github.com/opntr/opBSD/tree/op/gsoc2014/kpatch Modified: 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_selfpatch.c ============================================================================== --- soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c Fri Jul 18 16:08:27 2014 (r271085) +++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c Fri Jul 18 16:09:46 2014 (r271086) @@ -60,6 +60,8 @@ SYSCTL_INT(_debug, OID_AUTO, selfpatch_debug, CTLFLAG_RWTUN, &selfpatch_debug, 0, "Set various levels of selfpatch debug"); +void lf_selfpatch_selftest(void); + bool lf_selfpatch_patch_needed(struct lf_selfpatch *p) { @@ -70,35 +72,38 @@ } switch (p->feature_selector) { - case KSP_CPU_FEATURE : + case KSP_CPU_FEATURE : if ((cpu_feature & p->feature) != 0) return (true); break; - case KSP_CPU_FEATURE2 : + case KSP_CPU_FEATURE2 : if ((cpu_feature2 & p->feature) != 0) return (true); break; - case KSP_AMD_FEATURE : + case KSP_AMD_FEATURE : if ((amd_feature & p->feature) != 0) return (true); break; - case KSP_AMD_FEATURE2 : + case KSP_AMD_FEATURE2 : if ((amd_feature2 & p->feature) != 0) return (true); break; - case KSP_VIA_FEATURE_RNG : + case KSP_VIA_FEATURE_RNG : if ((via_feature_rng & p->feature) != 0) return (true); break; - case KSP_VIA_FEATURE_XCRYPT : + case KSP_VIA_FEATURE_XCRYPT : if ((via_feature_xcrypt & p->feature) != 0) return (true); break; - case KSP_CPU_STDEXT_FEATURE : + case KSP_CPU_STDEXT_FEATURE : if ((cpu_stdext_feature & p->feature) != 0) return (true); break; - + case KSP_SELFTEST: + if ((p->feature & KSP_FEATURE_SELFTEST) != 0) + return (true); + break; default: return (false); } @@ -134,6 +139,11 @@ DBG("apply: %p\n", patch); lf_selfpatch_apply(lf, patch); } + + /* + * when selfpatch does not works, the system should crash + */ + lf_selfpatch_selftest(); } void @@ -143,6 +153,14 @@ vm_offset_t page_offset; int i, page_number; + 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)) return; @@ -185,3 +203,30 @@ free(pages, M_TEMP); } + +void +lf_selfpatch_selftest(void) +{ + __asm __volatile( + "1:" + " .byte 0xde,0xad,0xde,0xad ; " + "2: " + " .pushsection set_selfpatch_patch_set, \"ax\" ; " + "3: " + " .byte 0x90,0x90,0x90,0x90 ;" + "4: " + " .popsection " + " .pushsection set_selfpatch_set, \"a\" ; " + " .quad 1b ; " + " .quad 3b ; " + " .int 2b-1b ; " + " .int 4b-3b ; " + " .int 0 ; " + " .int 1 ; " + " .quad 0 ; " + " .popsection ; " + ); + + DBG("works.\n"); +} + Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h ============================================================================== --- soc2014/op/freebsd-base/sys/sys/selfpatch.h Fri Jul 18 16:08:27 2014 (r271085) +++ soc2014/op/freebsd-base/sys/sys/selfpatch.h Fri Jul 18 16:09:46 2014 (r271086) @@ -29,6 +29,9 @@ #ifndef __SELFPATH_H__ #define __SELFPATH_H__ +#define KSP_SELFTEST 0 +#define KSP_FEATURE_SELFTEST 1 + #include <machine/_selfpatch.h> struct linker_file_t;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407181609.s6IG9kNw053711>