• Paul Burton's avatar
    MIPS: Remove r2_emul_return from struct thread_info · e11124d8
    Paul Burton authored
    The r2_emul_return field in struct thread_info was used in order to take
    an alternate codepath when returning to userland, which (besides not
    implementing certain features) effectively used the eretnc instruction
    in place of eret. The difference is that eretnc doesn't clear LLBit, and
    therefore doesn't cause a linked load & store sequence to fail due to
    emulation like eret would.
    
    The reason eret would usually be used to clear LLBit is so that after
    context switching we ensure that a load performed by one task doesn't
    influence another task. However commit 7c151d3d ("MIPS: Make use of
    the ERETNC instruction on MIPS R6") which introduced the r2_emul_return
    field and conditional use of eretnc also for some reason began
    explicitly clearing LLBit during context switches - despite retaining
    the use of eret for everything but returns from the pre-r6 instruction
    emulation code.
    
    As LLBit is cleared upon context switches anyway, simplify this by using
    eretnc unconditionally for MIPSr6 kernels. This allows us to remove the
    4 byte r2_emul_return boolean from struct thread_info, simplify the
    return to user code in entry.S and avoid the overhead of tracking &
    checking state which we don't need.
    Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/14408/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    e11124d8
thread_info.h 5.87 KB