PERFORCE change 158660 for review

Arnar Mar Sig antab at FreeBSD.org
Wed Mar 4 01:20:48 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=158660

Change 158660 by antab at antab_farm on 2009/03/04 09:19:58

	Implement whats needed for WITNESS and enable it.

Affected files ...

.. //depot/projects/avr32/src/sys/avr32/avr32/db_trace.c#3 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/stack_machdep.c#2 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/support.S#9 edit
.. //depot/projects/avr32/src/sys/avr32/conf/NGW100#11 edit

Differences ...

==== //depot/projects/avr32/src/sys/avr32/avr32/db_trace.c#3 (text+ko) ====

@@ -42,6 +42,8 @@
 #include <machine/pcb.h>
 #include <machine/debug.h>
 
+static void db_backtrace(struct thread *thr, struct db_frame *frame);
+
 int
 db_md_set_watchpoint(db_expr_t addr, db_expr_t size)
 {
@@ -64,25 +66,32 @@
 void
 db_trace_self(void)
 {
-	db_trace_thread(curthread, -1);
+	register_t fp;
+
+	__asm__ __volatile__("mov %0, r7" : "=r" (fp));
+	db_backtrace(curthread, (struct db_frame *)fp);
 }
 
 int
 db_trace_thread(struct thread *thr, int count)
 {
-	struct db_frame *frame, head;
 	struct pcb *ctx;
+
+	ctx = kdb_thr_ctx(thr);
+	db_backtrace(thr, (struct db_frame *)ctx->pcb_regs.regs.r7);
+	return (0);
+}
+
+static void
+db_backtrace(struct thread *thr, struct db_frame *frame)
+{
 	c_db_sym_t sym;
 	const char *name;
 	db_expr_t value;
 	db_expr_t offset;
 	int i;
 
-	ctx = kdb_thr_ctx(thr);
 	i = 0;
-	head.lr = ctx->pcb_regs.regs.pc;
-	head.fp = (struct db_frame *)ctx->pcb_regs.regs.r7;
-	frame = &head;
 	do {
 		db_printf("#%-2d 0x%x in ", i++, frame->lr);
 
@@ -99,14 +108,14 @@
 
 		frame = frame->fp;
 		if (frame == NULL) {
-			return (0);
+			return;
 		}
 	} while ((vm_offset_t)frame >= thr->td_kstack &&
                 (vm_offset_t)frame <= thr->td_kstack +
                 (KSTACK_PAGES * PAGE_SIZE));
 	db_printf("Frame pointer %p not in stack\n", frame);
 
-	return (0);
+	return;
 }
 
 void

==== //depot/projects/avr32/src/sys/avr32/avr32/stack_machdep.c#2 (text+ko) ====

@@ -7,7 +7,28 @@
 #include <sys/proc.h>
 #include <sys/stack.h>
 #include <machine/debug.h>
+#include <machine/db_machdep.h>
+
+static void
+stack_capture(struct thread *td, struct stack *st, struct db_frame *frame)
+{
+	stack_zero(st);
+	for (; frame != NULL; frame = frame->fp) {
+		if ((vm_offset_t)frame < td->td_kstack &&
+			(vm_offset_t)frame > td->td_kstack +
+			(KSTACK_PAGES * PAGE_SIZE)) {
+			break;
+		}
+		if (frame->lr == NULL) {
+			break;
+		}
 
+		if (stack_put(st, frame->lr) == -1) {
+			break;
+		}
+	}
+}
+
 void
 stack_save_td(struct stack *st, struct thread *td)
 {
@@ -17,5 +38,12 @@
 void
 stack_save(struct stack *st)
 {
-	avr32_impl();
+	register_t fp;
+
+	if (curthread == NULL) {
+		panic("stack_save: curthread == NULL");
+	}
+
+	__asm__ __volatile__("mov %0, r7" : "=r" (fp));
+	stack_capture(curthread, st, (struct db_frame *)fp);
 }

==== //depot/projects/avr32/src/sys/avr32/avr32/support.S#9 (text+ko) ====


==== //depot/projects/avr32/src/sys/avr32/conf/NGW100#11 (text+ko) ====

@@ -36,7 +36,7 @@
 options		DIAGNOSTIC
 options		INVARIANTS		#Enable calls of extra sanity checking
 options		INVARIANT_SUPPORT	#Extra sanity checks of internal structures, required by INVARIANTS
-#options	WITNESS			#Enable checks to detect deadlocks and cycles
+options		WITNESS			#Enable checks to detect deadlocks and cycles
 #options	WITNESS_SKIPSPIN	#Don't run witness on spinlocks for speed
 #options	WITNESS_KDB
 


More information about the p4-projects mailing list