···376376 bt/s restore_all377377 mov r15, r4378378 mov #0, r5379379+ mov r12, r6 ! set arg2(save_r0)379380 mov.l 2f, r1380381 mova restore_all, r0381382 jmp @r1···535534 mov.l @r9, r8536535 jsr @r8 ! jump to specific syscall handler537536 nop537537+ mov.l @(OFF_R0,r15), r12 ! save r0538538 mov.l r0, @(OFF_R0,r15) ! save the return value539539 !540540syscall_exit:
+10-6
arch/sh/kernel/signal.c
···33333434#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))35353636-asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);3636+asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset,3737+ unsigned int save_r0);37383839/*3940 * Atomically swap in the new signal mask, and wait for a signal.···5756 while (1) {5857 current->state = TASK_INTERRUPTIBLE;5958 schedule();6060- if (do_signal(®s, &saveset))5959+ if (do_signal(®s, &saveset, regs.regs[0]))6160 return -EINTR;6261 }6362}···8685 while (1) {8786 current->state = TASK_INTERRUPTIBLE;8887 schedule();8989- if (do_signal(®s, &saveset))8888+ if (do_signal(®s, &saveset, regs.regs[0]))9089 return -EINTR;9190 }9291}···564563 * the kernel can handle, and then we build all the user-level signal handling565564 * stack-frames in one go after that.566565 */567567-int do_signal(struct pt_regs *regs, sigset_t *oldset)566566+int do_signal(struct pt_regs *regs, sigset_t *oldset, unsigned int save_r0)568567{569568 siginfo_t info;570569 int signr;···598597 /* Restart the system call - no handlers present */599598 if (regs->regs[0] == -ERESTARTNOHAND ||600599 regs->regs[0] == -ERESTARTSYS ||601601- regs->regs[0] == -ERESTARTNOINTR ||602602- regs->regs[0] == -ERESTART_RESTARTBLOCK) {600600+ regs->regs[0] == -ERESTARTNOINTR) {601601+ regs->regs[0] = save_r0;603602 regs->pc -= 2;603603+ } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) {604604+ regs->pc -= 2;605605+ regs->regs[3] = __NR_restart_syscall;604606 }605607 }606608 return 0;
+1-1
arch/sh/kernel/syscalls.S
···34343535 .data3636ENTRY(sys_call_table)3737- .long sys_ni_syscall /* 0 - old "setup()" system call*/3737+ .long sys_restart_syscall /* 0 - old "setup()" system call*/3838 .long sys_exit3939 .long sys_fork4040 .long sys_read