x86: changes backtrace to not subtract 1
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 21 May 2015 20:53:08 +0000 (16:53 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Jun 2015 13:40:32 +0000 (09:40 -0400)
That -1 was there for a long time, due to weird issues with our earliest
bts in some corner cases in the kernel.  The tradeoff is that the
addresses given aren't accurate (off by 1!), and that make manual symbol
lookup a little annoying.  For instance, using a user-backtrace, you
can't grep an objdump for a particular PC, since the -1 means the
address probably doesn't exist.

kern/arch/x86/kdebug.c

index 530ddd8..ec8795b 100644 (file)
@@ -312,11 +312,11 @@ size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs,
                 * kernel addrs, but now we also bt user stacks. (dangerous!) */
                pcs[nr_pcs++] = pc;
                printd("PC %p FP %p\n", pc, fp);
-               /* PC becomes the retaddr - 1.  the -1 is to put our PC back inside the
-                * function that called us.  this was necessary in case we called as the
-                * last instruction in a function (would have to never return).  not
-                * sure how necessary this still is. */
-               pc = *(uintptr_t*)(fp + sizeof(uintptr_t)) - 1;
+               /* We used to set PC = retaddr - 1, where the -1 would put our PC back
+                * inside the function that called us.  This was for obscure cases where
+                * a no-return function calls another function and has no other code
+                * after the function call.  Or something. */
+               pc = *(uintptr_t*)(fp + sizeof(uintptr_t));
                fp = *(uintptr_t*)fp;
        }
        return nr_pcs;