[parisc-linux] Re: how to handle ERESTART_RESTARTBLOCK ?
Carlos O'Donell
carlos@baldric.uwo.ca
Sun, 26 Oct 2003 23:37:05 -0500
On Sun, Oct 26, 2003 at 01:02:01PM -0800, Randolph Chung wrote:
> hrm, oops, that's the magical disappearance act... :)
>
> Index: arch/parisc/kernel/signal.c
> ===================================================================
> RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/signal.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 signal.c
> --- arch/parisc/kernel/signal.c 24 Sep 2003 17:54:31 -0000 1.11
> +++ arch/parisc/kernel/signal.c 26 Oct 2003 20:53:14 -0000
> @@ -530,10 +531,68 @@ do_signal(sigset_t *oldset, struct pt_re
> /* Did we come from a system call? */
> if (in_syscall) {
> /* Restart the system call - no handlers present */
> - if (regs->gr[28] == -ERESTART_RESTARTBLOCK ||
> - regs->gr[28] == -ERESTARTNOHAND ||
> - regs->gr[28] == -ERESTARTSYS ||
> - regs->gr[28] == -ERESTARTNOINTR) {
> + if (regs->gr[28] == -ERESTART_RESTARTBLOCK) {
> + unsigned int *usp = (unsigned int *)regs->gr[30];
> +
> + /* Setup a trampoline to restart the syscall
> + * with __NR_restart_syscall
> + */
> +#ifndef __LP64__
> + /* 32-bit version:
> + * 0: <frame marker>
> + * 4: <return address>
> + * 8: ble 0x100(%%sr2, %%r0)
> + * 12: ldi __NR_restart_syscall, %r20
> + * 16: ldw -60(%sp), %r20
> + * 20: bv %r0(%r20)
> + * 24: ldwm -64(%sp), %r3
> + */
What do you think of:
a. Copy the original rp into a temp register.
b. Setup our rp so we return to the stack trampoline.
c. Return to userspace.
d. Trampoline restores original rp.
e. Make call to restart syscall.
f. Kernel does the magic.
g. Return to the original rp.
You don't care if you get a signal because you are never going to return
to the trampoline, so you don't adjust 'sp' to protect the trampoline.
My fears:
a. Timer tick while on the trampoline before the syscall is made.
= Signal is delivered... what happens?
As a mater of fact, I'm wholely afraid of stack trampolines for the
explicit reason that your timeslice might expire and odd things might
transpire.
c.