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