Messages in this thread | | | From | Guo Ren <> | Date | Tue, 26 May 2020 08:29:45 +0800 | Subject | Re: [PATCH] riscv: Remove unnecessary path for syscall_trace |
| |
Hi Tycho,
On Mon, May 25, 2020 at 10:36 PM Tycho Andersen <tycho@tycho.ws> wrote: > > On Mon, May 25, 2020 at 02:18:26PM +0000, guoren@kernel.org wrote: > > From: Guo Ren <guoren@linux.alibaba.com> > > > > Obviously, there is no need to recover a0-a7 in reject path. > > > > Previous modification is from commit af33d243 by Tycho, to > > fixup seccomp reject syscall code path. > > Doesn't this suffer from the same problem, though? a7 is clobbered, so > the -ERESTARTSYS behavior won't work?
Look, the patch only affects the path of ret_from_syscall_rejected, and there are two possible paths: 1. ret_from_syscall_rejected->handle_syscall_trace_exit->ret_from_exception 2. ret_from_syscall_rejected->ret_from_exception
All the above skip the check_syscall_nr and ignore the current a7, in the C function they use the pt_regs in the stack to get proper reg's value.
For the -ERESTARTSYS, we only process it in: ret_from_exception->resume_userspace->work_notifysig->do_notify_resume: do_signal & handle_signal:
switch (regs->a0) { case -ERESTARTNOHAND: case -ERESTARTSYS: case -ERESTARTNOINTR: regs->a0 = regs->orig_a0; regs->epc -= 0x4; break;
All above are done in pt_regs and when returning to userspace, a7 will be recovered by restore_all in entry.S.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- Best Regards Guo Ren
ML: https://lore.kernel.org/linux-csky/
| |