• Michael Ellerman's avatar
    powerpc: Work around gcc bug in current_thread_info() · a87e810f
    Michael Ellerman authored
    In commit a3e5b356 "powerpc: Don't use local named register variable
    in current_thread_info" Anton changed the way we did current_thread_info()
    to accommodate LLVM, and it was not meant to have any effect elsewhere.
    
    Unfortunately it has exposed a gcc bug, where r1 gets copied into
    another register and then gcc uses that register to restore the toc
    after a function call, even when that register is volatile and has been
    clobbered by the function call.
    
    We could revert Anton's patch, but it's not clear the original code is
    safe either, we may just have been lucky.
    
    The cleanest solution is to just use the existing CURRENT_THREAD_INFO()
    asm macro, and call it using inline asm.
    
    Segher points out we don't need volatile on the asm, if the result of
    the shift is unused it's fine for the compiler to elide it.
    
    Fixes: a3e5b356 ("powerpc: Don't use local named register variable in current_thread_info")
    Reported-by: default avatarAlexander Graf <agraf@suse.de>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    a87e810f
thread_info.h 6.08 KB