diff options
Diffstat (limited to 'arch/arm64/kernel/stacktrace.c')
-rw-r--r-- | arch/arm64/kernel/stacktrace.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index d25459ff57fc..38f0558f0c0a 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c | |||
@@ -43,12 +43,16 @@ int unwind_frame(struct stackframe *frame) | |||
43 | low = frame->sp; | 43 | low = frame->sp; |
44 | high = ALIGN(low, THREAD_SIZE); | 44 | high = ALIGN(low, THREAD_SIZE); |
45 | 45 | ||
46 | if (fp < low || fp > high || fp & 0xf) | 46 | if (fp < low || fp > high - 0x18 || fp & 0xf) |
47 | return -EINVAL; | 47 | return -EINVAL; |
48 | 48 | ||
49 | frame->sp = fp + 0x10; | 49 | frame->sp = fp + 0x10; |
50 | frame->fp = *(unsigned long *)(fp); | 50 | frame->fp = *(unsigned long *)(fp); |
51 | frame->pc = *(unsigned long *)(fp + 8); | 51 | /* |
52 | * -4 here because we care about the PC at time of bl, | ||
53 | * not where the return will go. | ||
54 | */ | ||
55 | frame->pc = *(unsigned long *)(fp + 8) - 4; | ||
52 | 56 | ||
53 | return 0; | 57 | return 0; |
54 | } | 58 | } |