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