From owner-svn-soc-all@FreeBSD.ORG Fri Jul 18 08:49:10 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 57DAA1CF for ; Fri, 18 Jul 2014 08:49:10 +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 39B122AAD for ; Fri, 18 Jul 2014 08:49:10 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s6I8nAIj098385 for ; Fri, 18 Jul 2014 08:49:10 GMT (envelope-from op@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s6I8n93l098369 for svn-soc-all@FreeBSD.org; Fri, 18 Jul 2014 08:49:09 GMT (envelope-from op@FreeBSD.org) Date: Fri, 18 Jul 2014 08:49:09 GMT Message-Id: <201407180849.s6I8n93l098369@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: r271066 - soc2014/op/freebsd-base/sys/kern 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:49:10 -0000 Author: op Date: Fri Jul 18 08:49:09 2014 New Revision: 271066 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271066 Log: KSP: in early initialization the linker_kernel_file yet not initialized, workaround this sitation Breakpoint 2, trap (frame=0xffffffff814e5b60) at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/trap.c:170 170 { Current language: auto; currently minimal (kgdb) bt at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/exception.S:231 firstp=0xffffffff814e5c70, lastp=0xffffffff814e5c68, countp=0xffffffff814e5c64) at linker_if.h:97 at /usr/data/source/git/opBSD/opBSD.git/sys/kern/kern_selfpatch.c:103 at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/machdep.c:2003 (kgdb) bt full regs = {r_r15 = 0, r_r14 = -2125570972, r_r13 = 2000, r_r12 = 394758, r_r11 = 0, r_r10 = -2125570992, r_r9 = 2000, r_r8 = 2000, r_rdi = -2125570960, r_rsi = -2129194576, r_rbp = -2125570972, r_rbx = -2125570968, r_rdx = 11259170867118089, r_rcx = 0, r_rax = 11259170867118081, r_trapno = 0, r_fs = 0, r_gs = 0, r_err = 2156834140, r_es = 65535, r_ds = 65535, r_rip = 32, r_cs = 134, r_rflags = -2125571040, r_rsp = 40, r_ss = 4294967295} ksi = {ksi_link = {tqe_next = 0xffffffff81971e80, tqe_prev = 0xffffffff814c8fd8}, ksi_info = { si_signo = 29831168, si_errno = 0, si_code = -2125570960, si_pid = -1, si_uid = 2156714019, si_status = -1, si_addr = 0xffffffff81c6c000, si_value = {sival_int = -1, sival_ptr = 0xffffffff, sigval_int = -1, sigval_ptr = 0xffffffff}, _reason = {_fault = {_trapno = -2125571040}, _timer = { _timerid = -2125571040, _overrun = -1}, _mesgq = {_mqd = -2125571040}, _poll = { _band = -2125571040}, __spare__ = {__spare1__ = -2125571040, __spare2__ = {-2137744547, -1, 5, -1, -2133847262, -1, -2124770176}}}}, ksi_flags = -2125974920, ksi_sigq = 0xf000ff53f000ff53} td = addr = ucode = i = p = type = code = at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/exception.S:231 No locals. firstp=0xffffffff814e5c70, lastp=0xffffffff814e5c68, countp=0xffffffff814e5c64) at linker_if.h:97 No locals. at /usr/data/source/git/opBSD/opBSD.git/sys/kern/kern_selfpatch.c:103 start = (struct lf_selfpatch *) 0xffffffff814e5c80 stop = (struct lf_selfpatch *) 0x1c73000 count = -1 ret = patch = at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/machdep.c:2003 kmdp = 0xffffffff81c6c000 "\001" env = No locals. No symbol table info available. (kgdb) p link Display all 106 possibilities? (y or n) (kgdb) p linker_kernel_file $1 = 0x0 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 Modified: soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c ============================================================================== --- soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c Fri Jul 18 08:48:55 2014 (r271065) +++ soc2014/op/freebsd-base/sys/kern/kern_selfpatch.c Fri Jul 18 08:49:09 2014 (r271066) @@ -42,14 +42,23 @@ #include #include +#define DBG(...) \ + if (bootverbose) { \ + printf("%s: ", __func__); \ + printf(__VA_ARGS__); \ + } + +extern struct lf_selfpatch __start_set_ksp_kpatch_set[]; +extern struct lf_selfpatch __stop_set_ksp_kpatch_set[]; + bool lf_selfpatch_patch_needed(struct lf_selfpatch *p) { - if (p == NULL) return (false); + switch (p->feature_selector) { case KSP_CPU_FEATURE : if ((cpu_feature & p->feature) != 0) @@ -93,13 +102,25 @@ 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; + if (lf != NULL) { + ret = linker_file_lookup_set(lf, "ksp_kpatch_set", &start, &stop, NULL); + DBG("start: %p stop: %p\n", start, stop); + if (ret != 0) { + DBG("failed to locate ksp_kpatch_set\n"); + return; + } + } else { + DBG("kernel patching\n"); + DBG("start: %p stop: %p\n", __start_set_ksp_kpatch_set, __stop_set_ksp_kpatch_set); + start = __stop_set_ksp_kpatch_set; + stop = __stop_set_ksp_kpatch_set; } + count = stop - start; + DBG("count: %d\n", count); + for (patch = start; patch != stop; patch++) { + DBG("apply: %p\n", patch); lf_selfpatch_apply(lf, patch); } }