Date: Fri, 18 Jul 2014 08:49:09 GMT From: op@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271066 - soc2014/op/freebsd-base/sys/kern Message-ID: <201407180849.s6I8n93l098369@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 = <value optimized out> addr = <value optimized out> ucode = <value optimized out> i = <value optimized out> p = <value optimized out> type = <value optimized out> code = <value optimized out> 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 = <value optimized out> patch = <value optimized out> at /usr/data/source/git/opBSD/opBSD.git/sys/amd64/amd64/machdep.c:2003 kmdp = 0xffffffff81c6c000 "\001" env = <value optimized out> 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 <oliver.pntr@gmail.com> 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 <machine/md_var.h> #include <machine/specialreg.h> +#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); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407180849.s6I8n93l098369>