• Sven Schnelle's avatar
    parisc: fix race condition in patching code · 740f05f3
    Sven Schnelle authored
    Assume the following ftrace code sequence that was patched in earlier by
    ftrace_make_call():
    
    PAGE A:
    ffc:	addr of ftrace_caller()
    PAGE B:
    000:	0x6fc10080 /* stw,ma r1,40(sp) */
    004:	0x48213fd1 /* ldw -18(r1),r1 */
    008:	0xe820c002 /* bv,n r0(r1) */
    00c:	0xe83f1fdf /* b,l,n .-c,r1 */
    
    When a Code sequences that is to be patched spans a page break, we might
    have already cleared the part on the PAGE A. If an interrupt is coming in
    during the remap of the fixed mapping to PAGE B, it might execute the
    patched function with only parts of the FTRACE code cleared. To prevent
    this, clear the jump to our mini trampoline first, and clear the remaining
    parts after this. This might also happen when patch_text() patches a
    function that it calls during remap.
    Signed-off-by: default avatarSven Schnelle <svens@stackframe.org>
    Cc: <stable@vger.kernel.org> # 5.2+
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    740f05f3
ftrace.c 4.2 KB