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

op at FreeBSD.org op at FreeBSD.org
Fri Jul 18 16:09:47 UTC 2014


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 at 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;


More information about the svn-soc-all mailing list