diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2020-09-01 15:15:44 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2020-09-01 15:15:44 +0000 |
| commit | fcc0db1734cf0036dbbe36a72cefdbac2309a2ae (patch) | |
| tree | 2db67325d986e674032eee2d4b4b9fe991599f84 /sys/cddl/dev/dtrace | |
| parent | 8d4b1e3b767f0046c53972e67f5ccd2cd43a1576 (diff) | |
Notes
Diffstat (limited to 'sys/cddl/dev/dtrace')
| -rw-r--r-- | sys/cddl/dev/dtrace/amd64/dtrace_isa.c | 14 |
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; } |
