Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F158958901
D27357.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D27357.id.diff
View Options
Index: head/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
===================================================================
--- head/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
+++ head/sys/cddl/dev/dtrace/riscv/dtrace_isa.c
@@ -90,7 +90,7 @@
state.pc = (uintptr_t)dtrace_getpcstack;
while (depth < pcstack_limit) {
- if (unwind_frame(&state))
+ if (!unwind_frame(curthread, &state))
break;
if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
@@ -259,10 +259,10 @@
int scp_offset;
register_t sp;
int depth;
- int done;
+ bool done;
depth = 1;
- done = 0;
+ done = false;
__asm __volatile("mv %0, sp" : "=&r" (sp));
@@ -271,7 +271,7 @@
state.pc = (uintptr_t)dtrace_getstackdepth;
do {
- done = unwind_frame(&state);
+ done = !unwind_frame(curthread, &state);
if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
break;
depth++;
Index: head/sys/cddl/dev/fbt/fbt.c
===================================================================
--- head/sys/cddl/dev/fbt/fbt.c
+++ head/sys/cddl/dev/fbt/fbt.c
@@ -137,6 +137,15 @@
return (1);
/*
+ * Stack unwinders may be called from probe context on some
+ * platforms.
+ */
+#if defined(__riscv)
+ if (strcmp(name, "unwind_frame") == 0)
+ return (1);
+#endif
+
+ /*
* When DTrace is built into the kernel we need to exclude
* the FBT functions from instrumentation.
*/
Index: head/sys/riscv/include/stack.h
===================================================================
--- head/sys/riscv/include/stack.h
+++ head/sys/riscv/include/stack.h
@@ -46,6 +46,6 @@
uintptr_t pc;
};
-int unwind_frame(struct unwind_state *);
+bool unwind_frame(struct thread *, struct unwind_state *);
#endif /* !_MACHINE_STACK_H_ */
Index: head/sys/riscv/riscv/db_trace.c
===================================================================
--- head/sys/riscv/riscv/db_trace.c
+++ head/sys/riscv/riscv/db_trace.c
@@ -73,7 +73,7 @@
}
static void
-db_stack_trace_cmd(struct unwind_state *frame)
+db_stack_trace_cmd(struct thread *td, struct unwind_state *frame)
{
const char *name;
db_expr_t offset;
@@ -100,6 +100,11 @@
struct trapframe *tf;
tf = (struct trapframe *)(uintptr_t)frame->sp;
+ if (!kstack_contains(td, (vm_offset_t)tf,
+ sizeof(*tf))) {
+ db_printf("--- invalid trapframe %p\n", tf);
+ break;
+ }
if ((tf->tf_scause & SCAUSE_INTR) != 0)
db_printf("--- interrupt %ld\n",
@@ -119,7 +124,7 @@
if (strcmp(name, "fork_trampoline") == 0)
break;
- if (unwind_frame(frame) < 0)
+ if (!unwind_frame(td, frame))
break;
}
}
@@ -135,7 +140,7 @@
frame.sp = ctx->pcb_sp;
frame.fp = ctx->pcb_s[0];
frame.pc = ctx->pcb_ra;
- db_stack_trace_cmd(&frame);
+ db_stack_trace_cmd(thr, &frame);
return (0);
}
@@ -150,5 +155,5 @@
frame.sp = sp;
frame.fp = (uintptr_t)__builtin_frame_address(0);
frame.pc = (uintptr_t)db_trace_self;
- db_stack_trace_cmd(&frame);
+ db_stack_trace_cmd(curthread, &frame);
}
Index: head/sys/riscv/riscv/stack_machdep.c
===================================================================
--- head/sys/riscv/riscv/stack_machdep.c
+++ head/sys/riscv/riscv/stack_machdep.c
@@ -53,10 +53,8 @@
stack_zero(st);
while (1) {
- if (!kstack_contains(td, (vm_offset_t)frame->fp -
- (sizeof(uintptr_t) * 2), sizeof(uintptr_t) * 2))
+ if (!unwind_frame(td, frame))
break;
- unwind_frame(frame);
if (!INKERNEL((vm_offset_t)frame->pc))
break;
if (stack_put(st, frame->pc) == -1)
Index: head/sys/riscv/riscv/unwind.c
===================================================================
--- head/sys/riscv/riscv/unwind.c
+++ head/sys/riscv/riscv/unwind.c
@@ -35,23 +35,24 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/proc.h>
#include <machine/stack.h>
#include <machine/vmparam.h>
-int
-unwind_frame(struct unwind_state *frame)
+bool
+unwind_frame(struct thread *td, struct unwind_state *frame)
{
uintptr_t fp;
fp = frame->fp;
- if (!INKERNEL(fp))
- return (-1);
+ if (!kstack_contains(td, fp - sizeof(fp) * 2, sizeof(fp) * 2))
+ return (false);
frame->sp = fp;
frame->fp = ((uintptr_t *)fp)[-2];
frame->pc = ((uintptr_t *)fp)[-1] - 4;
- return (0);
+ return (true);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jun 9, 7:06 AM (4 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33826909
Default Alt Text
D27357.id.diff (4 KB)
Attached To
Mode
D27357: Stack unwinding robustness fixes for RISC-V.
Attached
Detach File
Event Timeline
Log In to Comment