Date: Thu, 29 May 2003 17:24:01 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 32076 for review Message-ID: <200305300024.h4U0O1KY079777@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=32076 Change 32076 by peter@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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305300024.h4U0O1KY079777>
