PERFORCE change 138330 for review
John Birrell
jb at FreeBSD.org
Sun Mar 23 04:08:23 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=138330
Change 138330 by jb at 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;
More information about the p4-projects
mailing list