PERFORCE change 32076 for review
Peter Wemm
peter at FreeBSD.org
Thu May 29 17:24:03 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=32076
Change 32076 by peter at peter_hammer on 2003/05/29 17:23:43
get caller backtraces working. No args yet, thats going to be hard
for regparm without dwarf2 decoding.
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/db_interface.c#6 edit
.. //depot/projects/hammer/sys/amd64/amd64/db_trace.c#5 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/db_interface.c#6 (text+ko) ====
@@ -172,6 +172,16 @@
regs->tf_rbp = ddb_regs.tf_rbp;
regs->tf_rsi = ddb_regs.tf_rsi;
regs->tf_rdi = ddb_regs.tf_rdi;
+
+ regs->tf_r8 = ddb_regs.tf_r8;
+ regs->tf_r9 = ddb_regs.tf_r9;
+ regs->tf_r10 = ddb_regs.tf_r10;
+ regs->tf_r11 = ddb_regs.tf_r11;
+ regs->tf_r12 = ddb_regs.tf_r12;
+ regs->tf_r13 = ddb_regs.tf_r13;
+ regs->tf_r14 = ddb_regs.tf_r14;
+ regs->tf_r15 = ddb_regs.tf_r15;
+
#if 0
regs->tf_es = ddb_regs.tf_es & 0xffff;
regs->tf_fs = ddb_regs.tf_fs & 0xffff;
==== //depot/projects/hammer/sys/amd64/amd64/db_trace.c#5 (text+ko) ====
@@ -76,8 +76,16 @@
{ "rbp", &ddb_regs.tf_rbp, FCN_NULL },
{ "rsi", &ddb_regs.tf_rsi, FCN_NULL },
{ "rdi", &ddb_regs.tf_rdi, FCN_NULL },
+ { "r8", &ddb_regs.tf_r8, FCN_NULL },
+ { "r9", &ddb_regs.tf_r9, FCN_NULL },
+ { "r10", &ddb_regs.tf_r10, FCN_NULL },
+ { "r11", &ddb_regs.tf_r11, FCN_NULL },
+ { "r12", &ddb_regs.tf_r12, FCN_NULL },
+ { "r13", &ddb_regs.tf_r13, FCN_NULL },
+ { "r14", &ddb_regs.tf_r14, FCN_NULL },
+ { "r15", &ddb_regs.tf_r15, FCN_NULL },
{ "rip", &ddb_regs.tf_rip, FCN_NULL },
- { "rfl", &ddb_regs.tf_rflags, FCN_NULL },
+ { "rflags", &ddb_regs.tf_rflags, FCN_NULL },
#if 0
{ "dr0", NULL, db_dr0 },
{ "dr1", NULL, db_dr1 },
@@ -98,7 +106,7 @@
struct amd64_frame {
struct amd64_frame *f_frame;
- int f_retaddr;
+ long f_retaddr;
long f_arg0;
};
@@ -133,11 +141,14 @@
db_numargs(fp)
struct amd64_frame *fp;
{
+#if 1
+ return (0); /* regparm, needs dwarf2 info */
+#else
long *argp;
int inst;
int args;
- argp = (long *)db_get_value((long)&fp->f_retaddr, 4, FALSE);
+ argp = (long *)db_get_value((long)&fp->f_retaddr, 8, FALSE);
/*
* XXX etext is wrong for LKMs. We should attempt to interpret
* the instruction at the return address in all cases. This
@@ -155,6 +166,7 @@
args = 5;
}
return (args);
+#endif
}
static void
@@ -166,14 +178,16 @@
db_addr_t callpc;
{
db_printf("%s(", name);
+#if 0
while (narg) {
if (argnp)
db_printf("%s=", *argnp++);
- db_printf("%lr", (long)db_get_value((long)argp, 4, FALSE));
+ db_printf("%lr", (long)db_get_value((long)argp, 8, FALSE));
argp++;
if (--narg != 0)
db_printf(",");
}
+#endif
db_printf(") at ");
db_printsym(callpc, DB_STGY_PROC);
db_printf("\n");
@@ -217,8 +231,8 @@
c_db_sym_t sym;
const char *name;
- rip = db_get_value((long) &(*fp)->f_retaddr, 4, FALSE);
- rbp = db_get_value((long) &(*fp)->f_frame, 4, FALSE);
+ rip = db_get_value((long) &(*fp)->f_retaddr, 8, FALSE);
+ rbp = db_get_value((long) &(*fp)->f_frame, 8, FALSE);
/*
* Figure out frame type.
@@ -233,8 +247,7 @@
else if (strncmp(name, "Xintr", 5) == 0 ||
strncmp(name, "Xfastintr", 9) == 0)
frame_type = INTERRUPT;
- else if (strcmp(name, "Xlcall_syscall") == 0 ||
- strcmp(name, "Xint0x80_syscall") == 0)
+ else if (strcmp(name, "Xfast_syscall") == 0)
frame_type = SYSCALL;
}
@@ -253,10 +266,7 @@
* Point to base of trapframe which is just above the
* current frame.
*/
- if (frame_type == INTERRUPT)
- tf = (struct trapframe *)((long)*fp + 12);
- else
- tf = (struct trapframe *)((long)*fp + 8);
+ tf = (struct trapframe *)((long)*fp + 16);
if (INKERNEL((long) tf)) {
rsp = (ISPL(tf->tf_cs) == SEL_UPL) ?
@@ -351,7 +361,7 @@
} else {
p = NULL;
frame = (struct amd64_frame *)addr;
- callpc = (db_addr_t)db_get_value((long)&frame->f_retaddr, 4, FALSE);
+ callpc = (db_addr_t)db_get_value((long)&frame->f_retaddr, 8, FALSE);
frame = frame->f_frame;
}
db_trace_one_stack(count, have_addr, p, frame, callpc);
@@ -433,12 +443,12 @@
int instr;
instr = db_get_value(callpc, 4, FALSE);
- if ((instr & 0x00ffffff) == 0x00e58955) {
- /* pushl %ebp; movl %esp, %ebp */
+ if ((instr & 0xffffffff) == 0xe5894855) {
+ /* pushq %rbp; movq %rsp, %rbp */
actframe = (struct amd64_frame *)
(ddb_regs.tf_rsp - 8);
- } else if ((instr & 0x0000ffff) == 0x0000e589) {
- /* movl %esp, %ebp */
+ } else if ((instr & 0x00ffffff) == 0x00e58948) {
+ /* movq %rsp, %rbp */
actframe = (struct amd64_frame *)
ddb_regs.tf_rsp;
if (ddb_regs.tf_rbp == 0) {
@@ -478,7 +488,7 @@
if (actframe != frame) {
/* `frame' belongs to caller. */
callpc = (db_addr_t)
- db_get_value((long)&actframe->f_retaddr, 4, FALSE);
+ db_get_value((long)&actframe->f_retaddr, 8, FALSE);
continue;
}
More information about the p4-projects
mailing list