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

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

Log:
  KSP: implemented basic kernel patching
  
  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 08:48:32 2014	(r271063)
+++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c	Fri Jul 18 08:48:44 2014	(r271064)
@@ -42,6 +42,7 @@
 #include <machine/md_var.h>
 #include <machine/specialreg.h>
 
+
 bool
 lf_selfpatch_patch_needed(struct lf_selfpatch *p)
 {
@@ -89,13 +90,28 @@
 void
 lf_selfpatch(linker_file_t lf)
 {
+	struct lf_selfpatch *patch, *start, *stop;
+	int count, ret;
+
+	ret = linker_file_lookup_set(lf, "ksp_kpatch_set", &start, &stop, &count);
+	if (ret != 0) {
+		printf("linker_file_lookup_set faild to locate ksp_kpatch_set\n");
+		return;
+	}
 
-	printf("NOT IMPLEMENTED: %s\n", __func__);
+	for (patch = start; patch != stop; patch++) {
+		lf_selfpatch_apply(lf, patch);
+	}
 }
 
 void
-lf_selfpatch_apply(linker_file_t lf, struct lf_selfpatch *patch)
+lf_selfpatch_apply(linker_file_t lf, struct lf_selfpatch *p)
 {
+	if (!lf_selfpatch_patch_needed(p))
+		return;
+
+	KASSERT(p->patch_size == p->patchable_size,
+	    ("%s: patch_size != patchable_size", __func__));
 
-	printf("NOT IMPLEMENTED: %s\n", __func__);
+	memcpy(p->patchable, p->patch, p->patchable_size);
 }

Modified: soc2014/op/freebsd-base/sys/sys/selfpatch.h
==============================================================================
--- soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 18 08:48:32 2014	(r271063)
+++ soc2014/op/freebsd-base/sys/sys/selfpatch.h	Fri Jul 18 08:48:44 2014	(r271064)
@@ -36,7 +36,9 @@
 typedef struct lf_selfpatch {
 	void	*patchable;
 	void	*patch;
-	short	feature_selector;
+	int	patchable_size;
+	int	patch_size;
+	int	feature_selector;
 	int	feature;
 	char	*comment;
 } lf_selfpatch_t;



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