• Ed Swierk's avatar
    MIPS: Fix restart of indirect syscalls · 912fcae9
    Ed Swierk authored
    commit e967ef02 upstream.
    
    When 32-bit MIPS userspace invokes a syscall indirectly via syscall(number,
    arg1, ..., arg7), the kernel looks up the actual syscall based on the given
    number, shifts the other arguments to the left, and jumps to the syscall.
    
    If the syscall is interrupted by a signal and indicates it needs to be
    restarted by the kernel (by returning ERESTARTNOINTR for example), the
    syscall must be called directly, since the number is no longer the first
    argument, and the other arguments are now staged for a direct call.
    
    Before shifting the arguments, store the syscall number in pt_regs->regs[2].
    This gets copied temporarily into pt_regs->regs[0] after the syscall returns.
    If the syscall needs to be restarted, handle_signal()/do_signal() copies the
    number back to pt_regs->reg[2], which ends up in $v0 once control returns to
    userspace.
    Signed-off-by: default avatarEd Swierk <eswierk@skyportsystems.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/8929/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    [bwh: Backported to 3.2: adjust context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    (cherry picked from commit 08f865bb)
    Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
    912fcae9
scall32-o32.S 14.4 KB