diff options
author | jhb <jhb@FreeBSD.org> | 2002-09-19 18:46:29 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-09-19 18:46:29 +0000 |
commit | 03dc7bc4a4835049f8702ae7cd0097de1673c8f5 (patch) | |
tree | c1476f925d34a2b15d6347328a15e33a91997d2f /sys/alpha | |
parent | 862a7a02065e4deed0e9939de05e07f75b74325c (diff) | |
download | FreeBSD-src-03dc7bc4a4835049f8702ae7cd0097de1673c8f5.zip FreeBSD-src-03dc7bc4a4835049f8702ae7cd0097de1673c8f5.tar.gz |
Implement db_print_backtrace() if DDB is compiled into the kernel. This
MD function is just a wrapper around db_stack_trace_cmd() that prints out
a backtrace of curthread. Currently, this function is only implemented
on i386 and alpha (and the alpha version isn't quite tested yet, will do
that in a bit). Other changes:
- For i386, fix a bug in the raw frame address case. The eip we extract
from the passed in frame address does not match the frame we received.
Thus, instead of printing a bogus frame with the wrong eip, go ahead
and advance frame down to the same frame as the eip we are using.
- For alpha, attempt to add a way of doing a raw trace for alpha. Instead
of passing a frame address in 'addr', pass in a pointer to a structure
containing PC and KSP and use those to start the backtrace. The alpha
db_print_backtrace() uses asm to read in the current PC and KSP values
into such a request.
Tested on: i386
Requested by: many
Diffstat (limited to 'sys/alpha')
-rw-r--r-- | sys/alpha/alpha/db_trace.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/sys/alpha/alpha/db_trace.c b/sys/alpha/alpha/db_trace.c index f84d1b9..b8a200c 100644 --- a/sys/alpha/alpha/db_trace.c +++ b/sys/alpha/alpha/db_trace.c @@ -60,6 +60,11 @@ #include <ddb/db_output.h> #include <alpha/alpha/db_instruction.h> +struct trace_request { + register_t ksp; + register_t pc; +}; + /* * Information about the `standard' Alpha function prologue. */ @@ -260,8 +265,16 @@ db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *m frame = addr; } } else { - db_printf("alpha trace requires known PC =eject=\n"); - return; + struct trace_request *tr; + + tr = (struct trace_request *)addr; + if (tr->ksp >= KERNBASE && tr->pc >= KERNBASE) { + db_printf("alpha trace requires known PC =eject=\n"); + return; + } + callpc = tr->pc; + addr = tr->ksp; + frame = addr; } while (count--) { @@ -377,7 +390,17 @@ db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *m } } +void +db_stack_trace_cmd(void) +{ + struct trace_request tr; + __asm __volatile( + " stq sp,%0 \n" + " stq pc,%1 \n" + : "=r" (tr.ksp), "=r" (tr.pc)); + db_stack_trace_cmd(&tr, 1, -1, NULL); +} int db_md_set_watchpoint(addr, size) |