lkml.org 
[lkml]   [2017]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 088/125] MIPS: Save static registers before sysmips
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: James Hogan <james.hogan@imgtec.com>

    commit 49955d84cd9ccdca5a16a495e448e1a06fad9e49 upstream.

    The MIPS sysmips system call handler may return directly from the
    MIPS_ATOMIC_SET case (mips_atomic_set()) to syscall_exit. This path
    restores the static (callee saved) registers, however they won't have
    been saved on entry to the system call.

    Use the save_static_function() macro to create a __sys_sysmips wrapper
    function which saves the static registers before calling sys_sysmips, so
    that the correct static register state is restored by syscall_exit.

    Fixes: f1e39a4a616c ("MIPS: Rewrite sysmips(MIPS_ATOMIC_SET, ...) in C with inline assembler")
    Signed-off-by: James Hogan <james.hogan@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/16149/
    Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/mips/kernel/scall32-o32.S | 2 +-
    arch/mips/kernel/scall64-64.S | 2 +-
    arch/mips/kernel/scall64-n32.S | 2 +-
    arch/mips/kernel/scall64-o32.S | 2 +-
    arch/mips/kernel/syscall.c | 6 ++++++
    5 files changed, 10 insertions(+), 4 deletions(-)

    --- a/arch/mips/kernel/scall32-o32.S
    +++ b/arch/mips/kernel/scall32-o32.S
    @@ -371,7 +371,7 @@ EXPORT(sys_call_table)
    PTR sys_writev
    PTR sys_cacheflush
    PTR sys_cachectl
    - PTR sys_sysmips
    + PTR __sys_sysmips
    PTR sys_ni_syscall /* 4150 */
    PTR sys_getsid
    PTR sys_fdatasync
    --- a/arch/mips/kernel/scall64-64.S
    +++ b/arch/mips/kernel/scall64-64.S
    @@ -311,7 +311,7 @@ EXPORT(sys_call_table)
    PTR sys_sched_getaffinity
    PTR sys_cacheflush
    PTR sys_cachectl
    - PTR sys_sysmips
    + PTR __sys_sysmips
    PTR sys_io_setup /* 5200 */
    PTR sys_io_destroy
    PTR sys_io_getevents
    --- a/arch/mips/kernel/scall64-n32.S
    +++ b/arch/mips/kernel/scall64-n32.S
    @@ -302,7 +302,7 @@ EXPORT(sysn32_call_table)
    PTR compat_sys_sched_getaffinity
    PTR sys_cacheflush
    PTR sys_cachectl
    - PTR sys_sysmips
    + PTR __sys_sysmips
    PTR compat_sys_io_setup /* 6200 */
    PTR sys_io_destroy
    PTR compat_sys_io_getevents
    --- a/arch/mips/kernel/scall64-o32.S
    +++ b/arch/mips/kernel/scall64-o32.S
    @@ -371,7 +371,7 @@ EXPORT(sys32_call_table)
    PTR compat_sys_writev
    PTR sys_cacheflush
    PTR sys_cachectl
    - PTR sys_sysmips
    + PTR __sys_sysmips
    PTR sys_ni_syscall /* 4150 */
    PTR sys_getsid
    PTR sys_fdatasync
    --- a/arch/mips/kernel/syscall.c
    +++ b/arch/mips/kernel/syscall.c
    @@ -202,6 +202,12 @@ static inline int mips_atomic_set(unsign
    unreachable();
    }

    +/*
    + * mips_atomic_set() normally returns directly via syscall_exit potentially
    + * clobbering static registers, so be sure to preserve them.
    + */
    +save_static_function(sys_sysmips);
    +
    SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
    {
    switch (cmd) {

    \
     
     \ /
      Last update: 2017-07-25 22:24    [W:4.144 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site