• James Hogan's avatar
    MIPS: Fix MIPS64 FP save/restore on 32-bit kernels · 22b8ba76
    James Hogan authored
    32-bit kernels can be configured to support MIPS64, in which case
    neither CONFIG_64BIT or CONFIG_CPU_MIPS32_R* will be set. This causes
    the CP0_Status.FR checks at the point of floating point register save
    and restore to be compiled out, which results in odd FP registers not
    being saved or restored to the task or signal context even when
    CP0_Status.FR is set.
    
    Fix the ifdefs to use CONFIG_CPU_MIPSR2 and CONFIG_CPU_MIPSR6, which are
    enabled for the relevant revisions of either MIPS32 or MIPS64, along
    with some other CPUs such as Octeon (r2), Loongson1 (r2), XLP (r2),
    Loongson 3A R2.
    
    The suspect code originates from commit 597ce172 ("MIPS: Support for
    64-bit FP with O32 binaries") in v3.14, however the code in
    __enable_fpu() was consistent and refused to set FR=1, falling back to
    software FPU emulation. This was suboptimal but should be functionally
    correct.
    
    Commit fcc53b5f ("MIPS: fpu.h: Allow 64-bit FPU on a 64-bit MIPS R6
    CPU") in v4.2 (and stable tagged back to 4.0) later introduced the bug
    by updating __enable_fpu() to set FR=1 but failing to update the other
    similar ifdefs to enable FR=1 state handling.
    
    Fixes: fcc53b5f ("MIPS: fpu.h: Allow 64-bit FPU on a 64-bit MIPS R6 CPU")
    Signed-off-by: default avatarJames Hogan <jhogan@kernel.org>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Paul Burton <paul.burton@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Cc: <stable@vger.kernel.org> # 4.0+
    Patchwork: https://patchwork.linux-mips.org/patch/16739/
    22b8ba76
r4k_fpu.S 11.3 KB