aboutsummaryrefslogtreecommitdiff
path: root/sys/cddl/dev/dtrace
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2020-09-01 15:15:44 +0000
committerMark Johnston <markj@FreeBSD.org>2020-09-01 15:15:44 +0000
commitfcc0db1734cf0036dbbe36a72cefdbac2309a2ae (patch)
tree2db67325d986e674032eee2d4b4b9fe991599f84 /sys/cddl/dev/dtrace
parent8d4b1e3b767f0046c53972e67f5ccd2cd43a1576 (diff)
Notes
Diffstat (limited to 'sys/cddl/dev/dtrace')
-rw-r--r--sys/cddl/dev/dtrace/amd64/dtrace_isa.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_isa.c b/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
index c2b44c87d185b..5297c8ec7df4d 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
@@ -56,6 +56,7 @@ void
dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
uint32_t *intrpc)
{
+ struct thread *td;
int depth = 0;
register_t rbp;
struct amd64_frame *frame;
@@ -70,10 +71,16 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
__asm __volatile("movq %%rbp,%0" : "=r" (rbp));
frame = (struct amd64_frame *)rbp;
+ td = curthread;
while (depth < pcstack_limit) {
if (!INKERNEL((long) frame))
break;
+ if ((vm_offset_t)frame >=
+ td->td_kstack + ptoa(td->td_kstack_pages) ||
+ (vm_offset_t)frame < td->td_kstack)
+ break;
+
callpc = frame->f_retaddr;
if (!INKERNEL(callpc))
@@ -84,14 +91,11 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
if ((aframes == 0) && (caller != 0)) {
pcstack[depth++] = caller;
}
- }
- else {
+ } else {
pcstack[depth++] = callpc;
}
- if (frame->f_frame <= frame ||
- (vm_offset_t)frame->f_frame >= curthread->td_kstack +
- curthread->td_kstack_pages * PAGE_SIZE)
+ if ((vm_offset_t)frame->f_frame <= (vm_offset_t)frame)
break;
frame = frame->f_frame;
}