Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jul 2014 08:48:19 GMT
From:      op@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r271062 - in soc2014/op/freebsd-base/sys: kern sys x86/include
Message-ID:  <201407180848.s6I8mJBM097815@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: op
Date: Fri Jul 18 08:48:19 2014
New Revision: 271062
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271062

Log:
  KSP: implement  lf_selfpatch_patch_needed(struct lf_selfpatch *p)
  
  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
  soc2014/op/freebsd-base/sys/x86/include/_selfpatch.h

Modified: soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c
==============================================================================
--- soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Fri Jul 18 08:47:59 2014	(r271061)
+++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Fri Jul 18 08:48:19 2014	(r271062)
@@ -37,14 +37,51 @@
 
 #include <sys/linker.h>
 #include <sys/linker_set.h>
-
 #include <sys/selfpatch.h>
 
+#include <machine/md_var.h>
+#include <machine/specialreg.h>
+
 bool
 lf_selfpatch_patch_needed(struct lf_selfpatch *p)
 {
 
-	printf("NOT IMPLEMENTED: %s\n", __func__);
+	if (p == NULL)
+		return (false);
+
+	switch (p->feature_selector) {
+	case  KSP_CPU_FEATURE         :
+		if ((cpu_feature & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_CPU_FEATURE2        :
+		if ((cpu_feature2 & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_AMD_FEATURE         :
+		if ((amd_feature & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_AMD_FEATURE2        :
+		if ((amd_feature2 & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_VIA_FEATURE_RNG     :
+		if ((via_feature_rng & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_VIA_FEATURE_XCRYPT  :
+		if ((via_feature_xcrypt & p->feature) != 0)
+			return (true);
+		break;
+	case  KSP_CPU_STDEXT_FEATURE  :
+		if ((cpu_stdext_feature & p->feature) != 0)
+			return (true);
+		break;
+
+	default:
+		return (false);
+	}
 
 	return (false);
 }

Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 18 08:47:59 2014	(r271061)
+++ soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 18 08:48:19 2014	(r271062)
@@ -31,6 +31,8 @@
 
 #include <machine/_selfpatch.h>
 
+struct linker_file_t;
+
 typedef struct lf_selfpatch {
 	void	*patchable;
 	void	*patch;

Modified: soc2014/op/freebsd-base/sys/x86/include/_selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/x86/include/_selfpatch.h	Fri Jul 18 08:47:59 2014	(r271061)
+++ soc2014/op/freebsd-base/sys/x86/include/_selfpatch.h	Fri Jul 18 08:48:19 2014	(r271062)
@@ -37,6 +37,8 @@
 #define KSP_VIA_FEATURE_XCRYPT	6
 #define KSP_CPU_STDEXT_FEATURE	7
 
+struct lf_selfpatch;
+
 extern char *md_selfpatch_nop_table[];
 
 bool lf_selfpatch_patch_needed(struct lf_selfpatch *p);



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