Skip to content

Commit e967ef0

Browse files
Ed Swierkralfbaechle
authored andcommitted
MIPS: Fix restart of indirect syscalls
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: Ed Swierk <eswierk@skyportsystems.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/8929/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent fd75a33 commit e967ef0

File tree

2 files changed

+2
-0
lines changed

2 files changed

+2
-0
lines changed

arch/mips/kernel/scall32-o32.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ illegal_syscall:
181181
sll t1, t0, 2
182182
beqz v0, einval
183183
lw t2, sys_call_table(t1) # syscall routine
184+
sw a0, PT_R2(sp) # call routine directly on restart
184185

185186
/* Some syscalls like execve get their arguments from struct pt_regs
186187
and claim zero arguments in the syscall table. Thus we have to

arch/mips/kernel/scall64-o32.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ LEAF(sys32_syscall)
186186
dsll t1, t0, 3
187187
beqz v0, einval
188188
ld t2, sys32_call_table(t1) # syscall routine
189+
sd a0, PT_R2(sp) # call routine directly on restart
189190

190191
move a0, a1 # shift argument registers
191192
move a1, a2

0 commit comments

Comments
 (0)