Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Mar 2008 04:08:22 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 138330 for review
Message-ID:  <200803230408.m2N48MSY085146@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=138330

Change 138330 by jb@jb_freebsd1 on 2008/03/23 04:08:02

	WIP

Affected files ...

.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/amd64/dtrace_isa.c#4 edit

Differences ...

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/amd64/dtrace_isa.c#4 (text+ko) ====

@@ -31,6 +31,7 @@
 #include <sys/stack.h>
 #include <sys/pcpu.h>
 
+#include <machine/frame.h>
 #include <machine/md_var.h>
 #include <machine/stack.h>
 
@@ -41,7 +42,7 @@
 extern uintptr_t kernbase;
 uintptr_t kernelbase = (uintptr_t) &kernbase;
 
-struct frame {
+struct xframe {
 	greg_t	fr_savfp;		/* saved frame pointer */
 	greg_t	fr_savpc;		/* saved program counter */
 };
@@ -100,29 +101,17 @@
 	}
 }
 
-#ifdef DOODAD
 static int
 dtrace_getustack_common(uint64_t *pcstack, int pcstack_limit, uintptr_t pc,
     uintptr_t sp)
 {
-	klwp_t *lwp = ttolwp(curthread);
-	proc_t *p = curproc;
-	uintptr_t oldcontext = lwp->lwp_oldcontext;
 	volatile uint16_t *flags =
 	    (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
-	size_t s1, s2;
+	struct amd64_frame *frame;
 	int ret = 0;
 
 	ASSERT(pcstack == NULL || pcstack_limit > 0);
 
-	if (p->p_model == DATAMODEL_NATIVE) {
-		s1 = sizeof (struct frame) + 2 * sizeof (long);
-		s2 = s1 + sizeof (siginfo_t);
-	} else {
-		s1 = sizeof (struct frame32) + 3 * sizeof (int);
-		s2 = s1 + sizeof (siginfo32_t);
-	}
-
 	while (pc != 0 && sp != 0) {
 		ret++;
 		if (pcstack != NULL) {
@@ -132,38 +121,11 @@
 				break;
 		}
 
-		if (oldcontext == sp + s1 || oldcontext == sp + s2) {
-			if (p->p_model == DATAMODEL_NATIVE) {
-				ucontext_t *ucp = (ucontext_t *)oldcontext;
-				greg_t *gregs = ucp->uc_mcontext.gregs;
+		frame = (struct amd64_frame *) sp;
 
-				sp = dtrace_fulword(&gregs[REG_FP]);
-				pc = dtrace_fulword(&gregs[REG_PC]);
-
-				oldcontext = dtrace_fulword(&ucp->uc_link);
-			} else {
-				ucontext32_t *ucp = (ucontext32_t *)oldcontext;
-				greg32_t *gregs = ucp->uc_mcontext.gregs;
+		pc = dtrace_fulword(&frame->f_retaddr);
+		sp = dtrace_fulword(&frame->f_frame);
 
-				sp = dtrace_fuword32(&gregs[EBP]);
-				pc = dtrace_fuword32(&gregs[EIP]);
-
-				oldcontext = dtrace_fuword32(&ucp->uc_link);
-			}
-		} else {
-			if (p->p_model == DATAMODEL_NATIVE) {
-				struct frame *fr = (struct frame *)sp;
-
-				pc = dtrace_fulword(&fr->fr_savpc);
-				sp = dtrace_fulword(&fr->fr_savfp);
-			} else {
-				struct frame32 *fr = (struct frame32 *)sp;
-
-				pc = dtrace_fuword32(&fr->fr_savpc);
-				sp = dtrace_fuword32(&fr->fr_savfp);
-			}
-		}
-
 		/*
 		 * This is totally bogus:  if we faulted, we're going to clear
 		 * the fault and break.  This is to deal with the apparently
@@ -177,15 +139,12 @@
 
 	return (ret);
 }
-#endif
 
 void
 dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit)
 {
-#ifdef DOODAD
-	klwp_t *lwp = ttolwp(curthread);
 	proc_t *p = curproc;
-	struct regs *rp;
+	struct trapframe *tf;
 	uintptr_t pc, sp;
 	volatile uint16_t *flags =
 	    (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
@@ -200,7 +159,7 @@
 	/*
 	 * If there's no user context we still need to zero the stack.
 	 */
-	if (lwp == NULL || p == NULL || (rp = lwp->lwp_regs) == NULL)
+	if (p == NULL || (tf = curthread->td_frame) == NULL)
 		goto zero;
 
 	*pcstack++ = (uint64_t)p->p_pid;
@@ -209,8 +168,8 @@
 	if (pcstack_limit <= 0)
 		return;
 
-	pc = rp->r_pc;
-	sp = rp->r_fp;
+	pc = tf->tf_rip;
+	sp = tf->tf_rsp;
 
 	if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) {
 		*pcstack++ = (uint64_t)pc;
@@ -218,10 +177,7 @@
 		if (pcstack_limit <= 0)
 			return;
 
-		if (p->p_model == DATAMODEL_NATIVE)
-			pc = dtrace_fulword((void *)rp->r_sp);
-		else
-			pc = dtrace_fuword32((void *)rp->r_sp);
+		pc = dtrace_fulword((void *) sp);
 	}
 
 	n = dtrace_getustack_common(pcstack, pcstack_limit, pc, sp);
@@ -233,44 +189,35 @@
 
 zero:
 	while (pcstack_limit-- > 0)
-		*pcstack++ = NULL;
-#endif
+		*pcstack++ = 0;
 }
 
 int
 dtrace_getustackdepth(void)
 {
-#ifdef DOODAD
-	klwp_t *lwp = ttolwp(curthread);
 	proc_t *p = curproc;
-	struct regs *rp;
+	struct trapframe *tf;
 	uintptr_t pc, sp;
 	int n = 0;
 
-	if (lwp == NULL || p == NULL || (rp = lwp->lwp_regs) == NULL)
+	if (p == NULL || (tf = curthread->td_frame) == NULL)
 		return (0);
 
 	if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_FAULT))
 		return (-1);
 
-	pc = rp->r_pc;
-	sp = rp->r_fp;
+	pc = tf->tf_rip;
+	sp = tf->tf_rsp;
 
 	if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) {
 		n++;
 
-		if (p->p_model == DATAMODEL_NATIVE)
-			pc = dtrace_fulword((void *)rp->r_sp);
-		else
-			pc = dtrace_fuword32((void *)rp->r_sp);
+		pc = dtrace_fulword((void *) sp);
 	}
 
 	n += dtrace_getustack_common(NULL, 0, pc, sp);
 
 	return (n);
-#else
-return 0;
-#endif
 }
 
 void
@@ -307,13 +254,8 @@
 	sp = rp->r_fp;
 	oldcontext = lwp->lwp_oldcontext;
 
-	if (p->p_model == DATAMODEL_NATIVE) {
-		s1 = sizeof (struct frame) + 2 * sizeof (long);
-		s2 = s1 + sizeof (siginfo_t);
-	} else {
-		s1 = sizeof (struct frame32) + 3 * sizeof (int);
-		s2 = s1 + sizeof (siginfo32_t);
-	}
+	s1 = sizeof (struct xframe) + 2 * sizeof (long);
+	s2 = s1 + sizeof (siginfo_t);
 
 	if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) {
 		*pcstack++ = (uint64_t)pc;
@@ -336,35 +278,18 @@
 			break;
 
 		if (oldcontext == sp + s1 || oldcontext == sp + s2) {
-			if (p->p_model == DATAMODEL_NATIVE) {
-				ucontext_t *ucp = (ucontext_t *)oldcontext;
-				greg_t *gregs = ucp->uc_mcontext.gregs;
+			ucontext_t *ucp = (ucontext_t *)oldcontext;
+			greg_t *gregs = ucp->uc_mcontext.gregs;
 
-				sp = dtrace_fulword(&gregs[REG_FP]);
-				pc = dtrace_fulword(&gregs[REG_PC]);
+			sp = dtrace_fulword(&gregs[REG_FP]);
+			pc = dtrace_fulword(&gregs[REG_PC]);
 
-				oldcontext = dtrace_fulword(&ucp->uc_link);
-			} else {
-				ucontext_t *ucp = (ucontext_t *)oldcontext;
-				greg_t *gregs = ucp->uc_mcontext.gregs;
-
-				sp = dtrace_fuword32(&gregs[EBP]);
-				pc = dtrace_fuword32(&gregs[EIP]);
-
-				oldcontext = dtrace_fuword32(&ucp->uc_link);
-			}
+			oldcontext = dtrace_fulword(&ucp->uc_link);
 		} else {
-			if (p->p_model == DATAMODEL_NATIVE) {
-				struct frame *fr = (struct frame *)sp;
+			struct xframe *fr = (struct xframe *)sp;
 
-				pc = dtrace_fulword(&fr->fr_savpc);
-				sp = dtrace_fulword(&fr->fr_savfp);
-			} else {
-				struct frame32 *fr = (struct frame32 *)sp;
-
-				pc = dtrace_fuword32(&fr->fr_savpc);
-				sp = dtrace_fuword32(&fr->fr_savfp);
-			}
+			pc = dtrace_fulword(&fr->fr_savpc);
+			sp = dtrace_fulword(&fr->fr_savfp);
 		}
 
 		/*
@@ -390,7 +315,7 @@
 {
 #ifdef DOODAD
 	uintptr_t val;
-	struct frame *fp = (struct frame *)dtrace_getfp();
+	struct xframe *fp = (struct xframe *)dtrace_getfp();
 	uintptr_t *stack;
 	int i;
 #if defined(__amd64)
@@ -402,7 +327,7 @@
 #endif
 
 	for (i = 1; i <= aframes; i++) {
-		fp = (struct frame *)(fp->fr_savfp);
+		fp = (struct xframe *)(fp->fr_savfp);
 
 		if (fp->fr_savpc == (pc_t)dtrace_invop_callsite) {
 #if !defined(__amd64)
@@ -486,12 +411,12 @@
 {
 #ifdef DOODAD
 	int depth = 0;
-	struct frame *frame;
+	struct xframe *frame;
 	vm_offset_t ebp;
 
 	aframes++;
 	ebp = dtrace_getfp();
-	frame = (struct frame *)ebp;
+	frame = (struct xframe *)ebp;
 	depth++;
 	for(;;) {
 		if (!INKERNEL(frame))
@@ -499,12 +424,12 @@
 		if (!INKERNEL(frame->fr_savpc))
 			break;
 		depth++;
-		if ((struct frame *)frame->fr_savfp < frame || 
+		if ((struct xframe *)frame->fr_savfp < frame || 
 			(vm_offset_t)frame->fr_savfp >= 
 			(vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE)
 			break;
 	
-		frame = (struct frame *)frame->fr_savfp;
+		frame = (struct xframe *)frame->fr_savfp;
 	}
 	if (depth < aframes)
 		return 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803230408.m2N48MSY085146>