+
+/*
+ * print a primitive backtrace for the requested process.
+ */
+backtrace(p)
+ struct proc *p;
+{
+ long fix, arg, pc, *lfp;
+ caddr_t fp;
+ char *fmt;
+ int i;
+
+ if (p != curproc) {
+ pc = *((long *)(p->p_addr->u_pcb.pcb_regs[11] + fix));
+ fp = (caddr_t)p->p_addr->u_pcb.pcb_regs[10];
+ fix = ((caddr_t)p->p_addr - kstack);
+ } else {
+ /*
+ * Have to grab current frame pointer; start with function
+ * that called backtrace.
+ */
+ asm("movl a6, %0" : "=r" (fp));
+ lfp = (long *)fp;
+ pc = lfp[1];
+ fp = (caddr_t)lfp[0];
+ fix = 0;
+ }
+
+ printf("Process %s\n", p->p_comm);
+ while (fp > kstack) {
+ fp += fix;
+ if (kernacc(fp, 6 * sizeof(*lfp), B_READ) == 0)
+ return;
+ lfp = (long *)fp;
+ printf("Function: 0x%x(0x%x, 0x%x, 0x%x, 0x%x)\n",
+ pc, lfp[2], lfp[3], lfp[4], lfp[5]);
+ pc = lfp[1];
+ fp = (caddr_t)lfp[0];
+ }
+}
+#endif /* DEBUG */