diff options
author | Ard Biesheuvel <ardb@kernel.org> | 2021-10-04 09:46:38 +0300 |
---|---|---|
committer | Ard Biesheuvel <ardb@kernel.org> | 2021-12-03 17:11:32 +0300 |
commit | 532319b9c418fc2be532c76b253b9a09f5d49dd1 (patch) | |
tree | fc3459823a0d40f6287f3d0f54a08857abaa547c /arch/arm/kernel/entry-armv.S | |
parent | ad3d09b54711ba3c5b3177ecc93943265e7bb762 (diff) | |
download | linux-532319b9c418fc2be532c76b253b9a09f5d49dd1.tar.xz |
ARM: unwind: disregard unwind info before stack frame is set up
When unwinding the stack from a stack overflow, we are likely to start
from a stack push instruction, given that this is the most common way to
grow the stack for compiler emitted code. This push instruction rarely
appears anywhere else than at offset 0x0 of the function, and if it
doesn't, the compiler tends to split up the unwind annotations, given
that the stack frame layout is apparently not the same throughout the
function.
This means that, in the general case, if the frame's PC points at the
first instruction covered by a certain unwind entry, there is no way the
stack frame that the unwind entry describes could have been created yet,
and so we are still on the stack frame of the caller in that case. So
treat this as a special case, and return with the new PC taken from the
frame's LR, without applying the unwind transformations to the virtual
register set.
This permits us to unwind the call stack on stack overflow when the
overflow was caused by a stack push on function entry.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Keith Packard <keithpac@amazon.com>
Tested-by: Marc Zyngier <maz@kernel.org>
Tested-by: Vladimir Murzin <vladimir.murzin@arm.com> # ARMv7M
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
0 files changed, 0 insertions, 0 deletions