lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 148/192] powerpc/64s: Clear on-stack exception marker upon exception return
    Date
    From: Nicolai Stange <nstange@suse.de>

    [ Upstream commit eddd0b332304d554ad6243942f87c2fcea98c56b ]

    The ppc64 specific implementation of the reliable stacktracer,
    save_stack_trace_tsk_reliable(), bails out and reports an "unreliable
    trace" whenever it finds an exception frame on the stack. Stack frames
    are classified as exception frames if the STACK_FRAME_REGS_MARKER
    magic, as written by exception prologues, is found at a particular
    location.

    However, as observed by Joe Lawrence, it is possible in practice that
    non-exception stack frames can alias with prior exception frames and
    thus, that the reliable stacktracer can find a stale
    STACK_FRAME_REGS_MARKER on the stack. It in turn falsely reports an
    unreliable stacktrace and blocks any live patching transition to
    finish. Said condition lasts until the stack frame is
    overwritten/initialized by function call or other means.

    In principle, we could mitigate this by making the exception frame
    classification condition in save_stack_trace_tsk_reliable() stronger:
    in addition to testing for STACK_FRAME_REGS_MARKER, we could also take
    into account that for all exceptions executing on the kernel stack
    - their stack frames's backlink pointers always match what is saved
    in their pt_regs instance's ->gpr[1] slot and that
    - their exception frame size equals STACK_INT_FRAME_SIZE, a value
    uncommonly large for non-exception frames.

    However, while these are currently true, relying on them would make
    the reliable stacktrace implementation more sensitive towards future
    changes in the exception entry code. Note that false negatives, i.e.
    not detecting exception frames, would silently break the live patching
    consistency model.

    Furthermore, certain other places (diagnostic stacktraces, perf, xmon)
    rely on STACK_FRAME_REGS_MARKER as well.

    Make the exception exit code clear the on-stack
    STACK_FRAME_REGS_MARKER for those exceptions running on the "normal"
    kernel stack and returning to kernelspace: because the topmost frame
    is ignored by the reliable stack tracer anyway, returns to userspace
    don't need to take care of clearing the marker.

    Furthermore, as I don't have the ability to test this on Book 3E or 32
    bits, limit the change to Book 3S and 64 bits.

    Fixes: df78d3f61480 ("powerpc/livepatch: Implement reliable stack tracing for the consistency model")
    Reported-by: Joe Lawrence <joe.lawrence@redhat.com>
    Signed-off-by: Nicolai Stange <nstange@suse.de>
    Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/kernel/entry_64.S | 7 +++++++
    1 file changed, 7 insertions(+)

    diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
    index 2206912ea4f0..1f39ce40ae11 100644
    --- a/arch/powerpc/kernel/entry_64.S
    +++ b/arch/powerpc/kernel/entry_64.S
    @@ -989,6 +989,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
    ld r2,_NIP(r1)
    mtspr SPRN_SRR0,r2

    + /*
    + * Leaving a stale exception_marker on the stack can confuse
    + * the reliable stack unwinder later on. Clear it.
    + */
    + li r2,0
    + std r2,STACK_FRAME_OVERHEAD-16(r1)
    +
    ld r0,GPR0(r1)
    ld r2,GPR2(r1)
    ld r3,GPR3(r1)
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-27 20:00    [W:4.040 / U:28.540 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site