summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2002-09-19 18:46:29 +0000
committerjhb <jhb@FreeBSD.org>2002-09-19 18:46:29 +0000
commit03dc7bc4a4835049f8702ae7cd0097de1673c8f5 (patch)
treec1476f925d34a2b15d6347328a15e33a91997d2f /sys/alpha
parent862a7a02065e4deed0e9939de05e07f75b74325c (diff)
downloadFreeBSD-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.c27
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)
OpenPOWER on IntegriCloud