[PATCH 0/6] Fix unwinding through sigreturn trampolines

Will Deacon will at kernel.org
Tue Jun 23 04:54:30 EDT 2020

Hi all,

This series fixes unwinding through our 64-bit sigreturn trampoline (by
effectively removing the incomplete CFI support enabled during the merge
window) and the 32-bit sigreturn trampoline in the compat vDSO (by removing
it in favour of the sigpage). This forces the unwinder to fallback on the
heuristics it was using previously without any reported issues.

The downside is that this series undoes the LLVM unwinder support added
during the merge window, in favour of not regressing libgcc. Although Ard
and I tried very hard to make this all work with CFI, it became obvious
that it's not 5.8 material, particularly as testing this stuff is extremely
difficult and appears to be fragile on other architectures too. For example,
trying to unwind out of a SIGCANCEL handler triggered from within a leaf
function with pthread cleanup handlers stacked further up in the callchain
doesn't appear to work at all when compiling with -fexceptions, and works
partially (invoking a subset of the handlers...) if you reduce the
optimisation level.

The compat vDSO changes are a result of me auditing our 32-bit sigreturn,
realising the compat vDSO trampoline is broken and then deciding that we
may as well just use the sigpage unconditionally, like arch/arm/ does.

Thanks to Ard for wasting a significant chunk of his weekend on this mess.

Patches 1-4 are targetting 5.8, the remaining two are cosmetic.


Cc: Vincenzo Frascino <vincenzo.frascino at arm.com>
Cc: Tamas Zsoldos <tamas.zsoldos at arm.com>
Cc: Szabolcs Nagy <szabolcs.nagy at arm.com>
Cc: Catalin Marinas <catalin.marinas at arm.com>
Cc: Daniel Kiss <daniel.kiss at arm.com>
Cc: Dave Martin <dave.martin at arm.com>
Cc: Ard Biesheuvel <ardb at kernel.org>
Cc: <kernel-team at android.com>


Will Deacon (6):
  arm64: vdso: Disable dwarf unwinding through the sigreturn trampoline
  arm64: compat: Allow 32-bit vdso and sigpage to co-exist
  arm64: compat: Always use sigpage for sigreturn trampoline
  arm64: compat: Remove 32-bit sigreturn code from the vDSO
  arm64: vdso32: Remove a bunch of #ifdef CONFIG_COMPAT_VDSO guards
  arm64: vdso: Fix unusual formatting in *setup_additional_pages()

 arch/arm64/include/asm/mmu.h         |  3 +
 arch/arm64/kernel/Makefile           |  2 -
 arch/arm64/kernel/signal32.c         | 27 +-------
 arch/arm64/kernel/vdso.c             | 98 +++++++++++-----------------
 arch/arm64/kernel/vdso/Makefile      |  2 +-
 arch/arm64/kernel/vdso/sigreturn.S   | 54 +++++++++------
 arch/arm64/kernel/vdso32/Makefile    |  1 -
 arch/arm64/kernel/vdso32/sigreturn.S | 58 ----------------
 arch/arm64/kernel/vdso32/vdso.lds.S  | 12 ----
 9 files changed, 77 insertions(+), 180 deletions(-)
 delete mode 100644 arch/arm64/kernel/vdso32/sigreturn.S


More information about the linux-arm-kernel mailing list