author: Mao Han <han_mao@linux.alibaba.com> 2020-04-20 12:55:23 +0800
committer: Guo Ren <guoren@linux.alibaba.com> 2020-05-13 17:55:05 +0800
commit: 229a0ddee1108a3f82a873e6cbbe35c92c540444
parent: 165f2d2858013253042809df082b8df7e34e86d7
Commit Summary:
Diffstat:
1 file changed, 5 insertions, 2 deletions
diff --git a/arch/csky/kernel/perf_callchain.c b/arch/csky/kernel/perf_callchain.c
index e68ff375c8f8..ab55e98ee8f6 100644
--- a/arch/csky/kernel/perf_callchain.c
+++ b/arch/csky/kernel/perf_callchain.c
@@ -12,12 +12,17 @@ struct stackframe {
static int unwind_frame_kernel(struct stackframe *frame)
{
- if (kstack_end((void *)frame->fp))
+ unsigned long low = (unsigned long)task_stack_page(current);
+ unsigned long high = low + THREAD_SIZE;
+
+ if (unlikely(frame->fp < low || frame->fp > high))
return -EPERM;
- if (frame->fp & 0x3 || frame->fp < TASK_SIZE)
+
+ if (kstack_end((void *)frame->fp) || frame->fp & 0x3)
return -EPERM;
*frame = *(struct stackframe *)frame->fp;
+
if (__kernel_text_address(frame->lr)) {
int graph = 0;