From owner-svn-soc-all@FreeBSD.ORG Fri Jul 18 08:48:46 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 2517B1A5 for ; Fri, 18 Jul 2014 08:48:46 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EC8262AA7 for ; Fri, 18 Jul 2014 08:48:45 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s6I8mjxI098048 for ; Fri, 18 Jul 2014 08:48:45 GMT (envelope-from op@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s6I8mjqk098043 for svn-soc-all@FreeBSD.org; Fri, 18 Jul 2014 08:48:45 GMT (envelope-from op@FreeBSD.org) Date: Fri, 18 Jul 2014 08:48:45 GMT Message-Id: <201407180848.s6I8mjqk098043@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to op@FreeBSD.org using -f From: op@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271064 - in soc2014/op/freebsd-base/sys: kern sys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jul 2014 08:48:46 -0000 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 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 #include + 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;