Skip to content
  • Will Deacon's avatar
    arm64: signal: push the unwinding prologue on the signal stack · 304ef4e8
    Will Deacon authored
    
    
    To allow debuggers to unwind through signal frames, we create a fake
    stack unwinding prologue containing the link register and frame pointer
    of the interrupted context. The signal frame is then offset by 16 bytes
    to make room for the two saved registers which are pushed onto the frame
    of the *interrupted* context, rather than placed directly above the
    signal stack.
    
    This doesn't work when an alternative signal stack is set up for a SEGV
    handler, which is raised in response to RLIMIT_STACK being reached. In
    this case, we try to push the unwinding prologue onto the full stack and
    subsequently take a fault which we fail to resolve, causing setup_return
    to return -EFAULT and handle_signal to force_sigsegv on the current task.
    
    This patch fixes the problem by including the unwinding prologue as part
    of the rt_sigframe definition, which is populated during setup_sigframe,
    ensuring that it always ends up on the signal stack.
    
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Cc: <stable@vger.kernel.org>
    304ef4e8