socsvn commit: r271066 - soc2014/op/freebsd-base/sys/kern
op at FreeBSD.org
op at FreeBSD.org
Fri Jul 18 08:49:10 UTC 2014
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 at 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);
}
}
More information about the svn-soc-all
mailing list