Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Aug 2014 15:33:22 GMT
From:      op@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r272132 - in soc2014/op/freebsd-base/sys: kern sys x86/x86
Message-ID:  <201408091533.s79FXMaC080936@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: op
Date: Sat Aug  9 15:33:22 2014
New Revision: 272132
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272132

Log:
  KSP: separate out MI and MD part of KSP code
  
  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/kern/kern_selfpatch.c
  soc2014/op/freebsd-base/sys/sys/selfpatch.h
  soc2014/op/freebsd-base/sys/x86/x86/selfpatch_machdep.c

Modified: soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c
==============================================================================
--- soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Sat Aug  9 15:33:11 2014	(r272131)
+++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Sat Aug  9 15:33:22 2014	(r272132)
@@ -66,52 +66,33 @@
 bool
 lf_selfpatch_patch_needed(struct lf_selfpatch *p)
 {
+	struct ksp_selector_entry	*e, *matched;
+
 	if (p == NULL) {
 		DBG("false\n");
 
 		return (false);
 	}
 
-	switch (p->feature_selector) {
-	case KSP_CPUID :
-		if ((cpu_feature & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_CPUID2 :
-		if ((cpu_feature2 & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_AMDID :
-		if ((amd_feature & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_AMDID2 :
-		if ((amd_feature2 & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_CPUID_STDEXT :
-		if ((cpu_stdext_feature & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_VIA_CPUID :
-		if ((via_feature_rng & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_VIA_CRYPT_CWLO :
-		if ((via_feature_xcrypt & p->feature) != 0)
-			return (true);
-		break;
-	case KSP_CPUID_EXTSTATE :
-		if ((cpu_extstate & p->feature) != 0)
+	matched = NULL;
+	for (e = ksp_selector_table;
+	    (e->feature_selector != KSP_NULL) && (e->featurep != NULL);
+	    e++) {
+		if (e->feature_selector == p->feature_selector) {
+			matched = e;
+			break;
+		}
+	}
+
+	if (matched != NULL) {
+		if ( (*(matched->featurep) & p->feature) != 0)
 			return (true);
-		break;
-	case KSP_SELFTEST:
+
+	}
+
+	if (p->feature_selector == KSP_SELFTEST)
 		if ((p->feature & KSP_FEATURE_SELFTEST) != 0)
 			return (true);
-		break;
-	default:
-		return (false);
-	}
 
 	return (false);
 }
@@ -277,8 +258,8 @@
 	"		.quad   3b ; "
 	"		.int    2b-1b ;	"
 	"		.int    4b-3b ;	"
-	"		.int    0 ; "
-	"		.int    1 ; "
+	"		.int    " __XSTRING(KSP_SELFTEST) " ; "
+	"		.int    " __XSTRING(KSP_FEATURE_SELFTEST) " ; "
 	"		.quad	0 ; "
 	"	.popsection ; "
 	);

Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/sys/selfpatch.h	Sat Aug  9 15:33:11 2014	(r272131)
+++ soc2014/op/freebsd-base/sys/sys/selfpatch.h	Sat Aug  9 15:33:22 2014	(r272132)
@@ -31,7 +31,17 @@
 
 #include <machine/selfpatch-asmacros.h>
 
-#define KSP_SELFTEST		0
+#define KSP_NULL		0
+#define KSP_SELFTEST		-1
+
+struct ksp_selector_entry {
+	const int	feature_selector;
+	const int	*featurep;
+};
+#define KSP_SELECTOR_END	{KSP_NULL, NULL}
+
+extern struct ksp_selector_entry ksp_selector_table[];
+
 #define KSP_FEATURE_SELFTEST	1
 
 #include <machine/selfpatch-machdep.h>

Modified: soc2014/op/freebsd-base/sys/x86/x86/selfpatch_machdep.c
==============================================================================
--- soc2014/op/freebsd-base/sys/x86/x86/selfpatch_machdep.c	Sat Aug  9 15:33:11 2014	(r272131)
+++ soc2014/op/freebsd-base/sys/x86/x86/selfpatch_machdep.c	Sat Aug  9 15:33:22 2014	(r272132)
@@ -32,9 +32,24 @@
 #include <sys/systm.h>
 #include <sys/types.h>
 #include <sys/kernel.h>
-
 #include <sys/linker.h>
 #include <sys/linker_set.h>
-
 #include <sys/selfpatch.h>
 
+#include <machine/md_var.h>
+#include <machine/specialreg.h>
+
+struct ksp_selector_entry ksp_selector_table[] = {
+	/* feature_selector	feature pointer */
+	{KSP_CPUID,		&cpu_feature},
+	{KSP_CPUID2,		&cpu_feature2},
+	{KSP_AMDID,		&amd_feature},
+	{KSP_AMDID2,		&amd_feature2},
+	{KSP_CPUID_STDEXT,	&cpu_stdext_feature},
+	{KSP_VIA_CPUID,		&via_feature_rng},
+	{KSP_VIA_CRYPT_CWLO,	&via_feature_xcrypt},
+	{KSP_CPUID_EXTSTATE,	&cpu_extstate},
+
+	KSP_SELECTOR_END
+};
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408091533.s79FXMaC080936>