summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/db_trace.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2007-12-02 20:40:35 +0000
committerrwatson <rwatson@FreeBSD.org>2007-12-02 20:40:35 +0000
commit99285f7544399971d1bcb6e3c18e7010905925e5 (patch)
tree25f0781d4e40520309936f686c0accc99753b656 /sys/amd64/amd64/db_trace.c
parente6e32be1d57fbe0f67adfd9c0cb818a1660dca5a (diff)
downloadFreeBSD-src-99285f7544399971d1bcb6e3c18e7010905925e5.zip
FreeBSD-src-99285f7544399971d1bcb6e3c18e7010905925e5.tar.gz
Break out stack(9) from ddb(4):
- Introduce per-architecture stack_machdep.c to hold stack_save(9). - Introduce per-architecture machine/stack.h to capture any common definitions required between db_trace.c and stack_machdep.c. - Add new kernel option "options STACK"; we will build in stack(9) if it is defined, or also if "options DDB" is defined to provide compatibility with existing users of stack(9). Add new stack_save_td(9) function, which allows the capture of a stacktrace of another thread rather than the current thread, which the existing stack_save(9) was limited to. It requires that the thread be neither swapped out nor running, which is the responsibility of the consumer to enforce. Update stack(9) man page. Build tested: amd64, arm, i386, ia64, powerpc, sparc64, sun4v Runtime tested: amd64 (rwatson), arm (cognet), i386 (rwatson)
Diffstat (limited to 'sys/amd64/amd64/db_trace.c')
-rw-r--r--sys/amd64/amd64/db_trace.c39
1 files changed, 1 insertions, 38 deletions
diff --git a/sys/amd64/amd64/db_trace.c b/sys/amd64/amd64/db_trace.c
index 548c36c..c4e552d 100644
--- a/sys/amd64/amd64/db_trace.c
+++ b/sys/amd64/amd64/db_trace.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <machine/md_var.h>
#include <machine/pcb.h>
#include <machine/reg.h>
+#include <machine/stack.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -177,18 +178,6 @@ db_ss(struct db_variable *vp, db_expr_t *valuep, int op)
return (1);
}
-/*
- * Stack trace.
- */
-#define INKERNEL(va) (((va) >= DMAP_MIN_ADDRESS && (va) < DMAP_MAX_ADDRESS) \
- || ((va) >= KERNBASE && (va) < VM_MAX_KERNEL_ADDRESS))
-
-struct amd64_frame {
- struct amd64_frame *f_frame;
- long f_retaddr;
- long f_arg0;
-};
-
#define NORMAL 0
#define TRAP 1
#define INTERRUPT 2
@@ -505,32 +494,6 @@ db_trace_thread(struct thread *thr, int count)
ctx->pcb_rip, count));
}
-void
-stack_save(struct stack *st)
-{
- struct amd64_frame *frame;
- vm_offset_t callpc;
- register_t rbp;
-
- stack_zero(st);
- __asm __volatile("movq %%rbp,%0" : "=r" (rbp));
- frame = (struct amd64_frame *)rbp;
- while (1) {
- if (!INKERNEL((long)frame))
- break;
- callpc = frame->f_retaddr;
- if (!INKERNEL(callpc))
- break;
- if (stack_put(st, callpc) == -1)
- break;
- if (frame->f_frame <= frame ||
- (vm_offset_t)frame->f_frame >=
- (vm_offset_t)rbp + KSTACK_PAGES * PAGE_SIZE)
- break;
- frame = frame->f_frame;
- }
-}
-
int
amd64_set_watch(watchnum, watchaddr, size, access, d)
int watchnum;
OpenPOWER on IntegriCloud