Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150247108
D37661.id114996.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D37661.id114996.diff
View Options
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
@@ -64,42 +64,50 @@
uint32_t *intrpc)
{
struct unwind_state state;
- int scp_offset;
+ uintptr_t caller;
register_t sp;
+ int scp_offset;
int depth;
depth = 0;
+ caller = solaris_cpu[curcpu].cpu_dtrace_caller;
if (intrpc != 0) {
- pcstack[depth++] = (pc_t) intrpc;
+ pcstack[depth++] = (pc_t)intrpc;
}
- aframes++;
-
+ /*
+ * Construct the unwind state, starting from this function. This frame,
+ * and 'aframes' others will be skipped.
+ */
__asm __volatile("mv %0, sp" : "=&r" (sp));
state.fp = (uintptr_t)__builtin_frame_address(0);
- state.sp = sp;
+ state.sp = (uintptr_t)sp;
state.pc = (uintptr_t)dtrace_getpcstack;
while (depth < pcstack_limit) {
if (!unwind_frame(curthread, &state))
break;
- if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
+ if (!INKERNEL(state.pc) || !kstack_contains(curthread,
+ (vm_offset_t)state.fp, sizeof(uintptr_t)))
break;
- /*
- * NB: Unlike some other architectures, we don't need to
- * explicitly insert cpu_dtrace_caller as it appears in the
- * normal kernel stack trace rather than a special trap frame.
- */
if (aframes > 0) {
aframes--;
+
+ /*
+ * fbt_invop() records the return address at the time
+ * the FBT probe fires. We need to insert this into the
+ * backtrace manually, since the stack frame state at
+ * the time of the probe does not capture it.
+ */
+ if (aframes == 0 && caller != 0)
+ pcstack[depth++] = caller;
} else {
pcstack[depth++] = state.pc;
}
-
}
for (; depth < pcstack_limit; depth++) {
diff --git a/sys/cddl/dev/fbt/riscv/fbt_isa.c b/sys/cddl/dev/fbt/riscv/fbt_isa.c
--- a/sys/cddl/dev/fbt/riscv/fbt_isa.c
+++ b/sys/cddl/dev/fbt/riscv/fbt_isa.c
@@ -57,7 +57,7 @@
for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
- cpu->cpu_dtrace_caller = addr;
+ cpu->cpu_dtrace_caller = frame->tf_ra - INSN_SIZE;
if (fbt->fbtp_roffset == 0) {
dtrace_probe(fbt->fbtp_id, frame->tf_a[0],
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 31, 2:42 PM (20 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30627840
Default Alt Text
D37661.id114996.diff (2 KB)
Attached To
Mode
D37661: dtrace: dtrace_getpcstack() tweaks for riscv
Attached
Detach File
Event Timeline
Log In to Comment