Updated procstat(1)

Wesley Shields wxs at atarininja.org
Tue Nov 27 20:37:07 PST 2007


On Tue, Nov 27, 2007 at 05:18:47PM +0000, Robert Watson wrote:
> The last of these required new kernel changes, including an MD component. 
> I've tested the MD parts only on i386, although I have quick hacks at what 
> they should look like on amd64, arm, powerpc, sparc64, sun4v.  I don't 
> promise these compile or work, but they might do.

The kernel build didn't work on AMD64...

cc -c -O2 -frename-registers -pipe -fno-strict-aliasing  -std=c99 -g -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes  -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual  -Wundef -Wno-pointer-sign -fformat-extensions -nostdinc  -I. -I/usr/src/sys -I/usr/src/sys/contrib/altq -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h -fno-common -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000  -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone  -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow  -msoft-float -fno-asynchronous-unwind-tables -ffreestanding -Werror  /usr/src/sys/amd64/amd64/db_trace.c
cc1: warnings being treated as errors
/usr/src/sys/amd64/amd64/db_trace.c: In function 'stack_save_td':
/usr/src/sys/amd64/amd64/db_trace.c:535: warning: type defaults to 'int' in declaration of 'rbp'
/usr/src/sys/amd64/amd64/db_trace.c:537: warning: implicit declaration of function 'TD_IS_SWWAPPED'
/usr/src/sys/amd64/amd64/db_trace.c:537: warning: nested extern declaration of 'TD_IS_SWWAPPED'
*** Error code 1

Stop in /usr/obj/usr/src/sys/GENERIC.
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.
wxs at ack /usr/src % 

Here's an updated patch to sys/amd64/amd64/db_trace.c (it's a diff
against revision 1.81).  It changes "register rbp" to be "register_t
rbp" and fixes the extra "W" in TD_IS_SWAPPED.  The kernel built fine
after these changes.  I'll test it out tomorrow.

--- sys/amd64/amd64/db_trace.c.orig	2007-11-15 17:00:56.000000000 -0500
+++ sys/amd64/amd64/db_trace.c	2007-11-27 22:59:29.000000000 -0500
@@ -505,15 +505,13 @@
 		    ctx->pcb_rip, count));
 }
 
-void
-stack_save(struct stack *st)
+static void
+stack_capture(struct stack *st, register_t rbp)
 {
 	struct amd64_frame *frame;
 	vm_offset_t callpc;
-	register_t rbp;
 
 	stack_zero(st);
-	__asm __volatile("movq %%rbp,%0" : "=r" (rbp));
 	frame = (struct amd64_frame *)rbp;
 	while (1) {
 		if (!INKERNEL((long)frame))
@@ -531,6 +529,29 @@
 	}
 }
 
+void
+stack_save_td(struct stack *st, struct thread *td)
+{
+	register_t rbp;
+
+	if (TD_IS_SWAPPED(td))
+		panic("stack_save_td: swapped");
+	if (TD_IS_RUNNING(td))
+		panic("stack_save_td: running");
+
+	rbp = td->td_pcb->pcb_rbp;
+	stack_capture(st, rbp);
+}
+
+void
+stack_save(struct stack *st)
+{
+	register_t rbp;
+
+	__asm __volatile("movq %%rbp,%0" : "=r" (rbp));
+	stack_capture(st, rbp);
+}
+
 int
 amd64_set_watch(watchnum, watchaddr, size, access, d)
 	int watchnum;

> I think procstat(1) is getting a lot closer to commitable state for 
> 8-CURRENT, but further feedback would be most welcome (including reports of 
> success on non-i386 architectures, and possibly patches to fix them).  For 
> FreeBSD developers with P4 access, you can also check out

Thank you for this.  I think procstat(1) is going to be very useful.

-- WXS


More information about the freebsd-hackers mailing list