linux-mips
[Top] [All Lists]

Re: tcsh

To: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Subject: Re: tcsh
From: ralf@uni-koblenz.de
Date: Sat, 4 Jul 1998 01:14:56 +0200
Cc: linux@cthulhu.engr.sgi.com
In-reply-to: <19980704003729.14342@alpha.franken.de>; from Thomas Bogendoerfer on Sat, Jul 04, 1998 at 12:37:29AM +0200
References: <19980622110139.F418@uni-koblenz.de> <19980703005927.48187@alpha.franken.de> <19980703165855.C435@uni-koblenz.de> <19980704003729.14342@alpha.franken.de>
Sender: owner-linux@cthulhu.engr.sgi.com
On Sat, Jul 04, 1998 at 12:37:29AM +0200, Thomas Bogendoerfer wrote:

> On Fri, Jul 03, 1998 at 04:58:55PM +0200, ralf@uni-koblenz.de wrote:
> > Sigpause() is a libc routine in libc/sysdeps/posix/sigpause.c; it's either
> > using sigprocmask(2) or sigsuspend(2).
> 
> it's sigsuspend. And after looking at scall_o32.S and realizing that
> calling do_signal() needs to have the static registers saved/restored,
> the bug is obvious (I also had a look at the Alpha sys_sigsuspend). Below
> is a patch, which fixes tcsh and other programs, which use sigsupend.
> If everybody agrees with the patch, I'll check it in.

I've checked in a slightly different patch.  I already had to deal with
the problem of saving these registers for several other routines, so there
is an inline function named save_static to do that job.  Also it saves us
some cycles and looks a bit more beautyful.  Patch appended below.

  Ralf

Index: arch/mips/kernel/signal.c
===================================================================
RCS file: /src/ftp/cvs/linux/arch/mips/kernel/signal.c,v
retrieving revision 1.12
diff -u -r1.12 signal.c
--- signal.c    1998/04/05 11:23:53     1.12
+++ signal.c    1998/07/03 23:04:42
@@ -43,6 +43,7 @@
 {
        sigset_t *uset, saveset, newset;
 
+       save_static(&regs);
        uset = (sigset_t *) regs.regs[4];
        if (copy_from_user(&newset, uset, sizeof(sigset_t)))
                return -EFAULT;
@@ -67,6 +68,7 @@
 {
        sigset_t *uset, saveset, newset;
 
+       save_static(&regs);
        uset = (sigset_t *) regs.regs[4];
        if (copy_from_user(&newset, uset, sizeof(sigset_t)))
                return -EFAULT;

<Prev in Thread] Current Thread [Next in Thread>