PERFORCE change 138261 for review
John Birrell
jb at FreeBSD.org
Fri Mar 21 23:35:10 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=138261
Change 138261 by jb at jb_freebsd8 on 2008/03/21 23:34:38
Enable the stack() action on i386.
Affected files ...
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/i386/dtrace_isa.c#7 edit
Differences ...
==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/i386/dtrace_isa.c#7 (text+ko) ====
@@ -32,6 +32,7 @@
#include <sys/pcpu.h>
#include <machine/md_var.h>
+#include <machine/stack.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -57,26 +58,29 @@
dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
uint32_t *intrpc)
{
-#ifdef DOODAD
int depth = 0;
+ register_t ebp;
+ struct i386_frame *frame;
vm_offset_t callpc;
- register_t ebp;
- struct frame *frame;
- pc_t caller = (pc_t)pcpu_find(curcpu)->pc_dtrace_caller;
+ pc_t caller = (pc_t) solaris_cpu[curcpu].cpu_dtrace_caller;
-/*
if (intrpc != 0)
- pcstack[depth++] = (pc_t)intrpc;
-*/
+ pcstack[depth++] = (pc_t) intrpc;
+
aframes++;
- ebp = dtrace_getfp();
- frame = (struct frame *)ebp;
- while(depth < pcstack_limit) {
+
+ __asm __volatile("movl %%ebp,%0" : "=r" (ebp));
+
+ frame = (struct i386_frame *)ebp;
+ while (depth < pcstack_limit) {
if (!INKERNEL(frame))
- break;
- callpc = frame->fr_savpc;
+ break;
+
+ callpc = frame->f_retaddr;
+
if (!INKERNEL(callpc))
break;
+
if (aframes > 0) {
aframes--;
if ((aframes == 0) && (caller != 0)) {
@@ -86,18 +90,17 @@
else {
pcstack[depth++] = callpc;
}
-
- if ((struct frame *)frame->fr_savfp < frame ||
- (vm_offset_t)frame->fr_savfp >=
- (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE)
+
+ if (frame->f_frame <= frame ||
+ (vm_offset_t)frame->f_frame >=
+ (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE)
break;
- frame = (struct frame *)frame->fr_savfp;
+ frame = frame->f_frame;
}
for (; depth < pcstack_limit; depth++) {
pcstack[depth] = 0;
}
-#endif
}
#ifdef DOODAD
More information about the p4-projects
mailing list