• Matt Redfearn's avatar
    MIPS: Fix exception entry when CONFIG_EVA enabled · c496f3c0
    Matt Redfearn authored
    Commit 9fef6868 ("MIPS: Make SAVE_SOME more standard") made several
    changes to the order in which registers are saved in the SAVE_SOME
    macro, used by exception handlers to save the processor state. In
    particular, it removed the
    move   k1, sp
    in the delay slot of the branch testing if the processor is already in
    kernel mode. This is replaced later in the macro by a
    move   k0, sp
    When CONFIG_EVA is disabled, this instruction actually appears in the
    delay slot of the branch. However, when CONFIG_EVA is enabled, instead
    the RPS workaround of
    MFC0	k0, CP0_ENTRYHI
    appears in the delay slot. This results in k0 not containing the stack
    pointer, but some unrelated value, which is then saved to the kernel
    stack. On exit from the exception, this bogus value is restored to the
    stack pointer, resulting in an OOPS.
    
    Fix this by moving the save of SP in k0 explicitly in the delay slot of
    the branch, outside of the CONFIG_EVA section, restoring the expected
    instruction ordering when CONFIG_EVA is active.
    
    Fixes: 9fef6868 ("MIPS: Make SAVE_SOME more standard")
    Signed-off-by: default avatarMatt Redfearn <matt.redfearn@mips.com>
    Reported-by: default avatarVladimir Kondratiev <vladimir.kondratiev@intel.com>
    Reviewed-by: default avatarCorey Minyard <cminyard@mvista.com>
    Reviewed-by: default avatarJames Hogan <jhogan@kernel.org>
    Patchwork: https://patchwork.linux-mips.org/patch/17471/Signed-off-by: default avatarJames Hogan <jhogan@kernel.org>
    c496f3c0
stackframe.h 10.8 KB