Page MenuHomeFreeBSD

D38303.id116120.diff
No OneTemporary

D38303.id116120.diff

diff --git a/sys/cddl/dev/dtrace/riscv/dtrace_isa.c b/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
--- a/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
+++ b/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
@@ -231,8 +231,34 @@
int
dtrace_getustackdepth(void)
{
+ struct trapframe *tf;
+ uintptr_t pc, fp, sp;
+ int n = 0;
- printf("IMPLEMENT ME: %s\n", __func__);
+ if (curproc == NULL || (tf = curthread->td_frame) == NULL)
+ return (0);
+
+ if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_FAULT))
+ return (-1);
+
+ pc = tf->tf_sepc;
+ sp = tf->tf_sp;
+ fp = tf->tf_s[0];
+
+ if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) {
+ /*
+ * In an entry probe. The frame pointer has not yet been
+ * pushed (that happens in the function prologue). The
+ * best approach is to add the current pc as a missing top
+ * of stack and back the pc up to the caller, which is stored
+ * at the current stack pointer address since the call
+ * instruction puts it there right before the branch.
+ */
+ pc = tf->tf_ra;
+ n++;
+ }
+
+ n += dtrace_getustack_common(NULL, 0, pc, fp);
return (0);
}

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 8, 10:48 AM (18 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28469000
Default Alt Text
D38303.id116120.diff (1 KB)

Event Timeline