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