diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-09-12 01:29:55 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-09-12 01:29:55 +0000 |
commit | 545f435ebcfd94a1e7c20b46efe81b4d6ac4e698 (patch) | |
tree | e9ce4bc598d06374bda906f18365984bf22a526a /arch/sparc64/kernel/sys_sparc.c | |
parent | 4291a610eef89d0d5c69d9a10ee6560e1aa36c74 (diff) |
Merge with Linux 2.1.55. More bugfixes and goodies from my private
CVS archive.
Diffstat (limited to 'arch/sparc64/kernel/sys_sparc.c')
-rw-r--r-- | arch/sparc64/kernel/sys_sparc.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index c827df7a1..0ec6de167 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc.c,v 1.2 1997/07/05 09:52:34 davem Exp $ +/* $Id: sys_sparc.c,v 1.5 1997/09/03 12:29:05 jj Exp $ * linux/arch/sparc64/kernel/sys_sparc.c * * This file contains various random system calls that @@ -191,9 +191,12 @@ out: asmlinkage unsigned long c_sys_nis_syscall (struct pt_regs *regs) { + static int count=0; lock_kernel(); - printk ("Unimplemented SPARC system call %ld\n",regs->u_regs[1]); - show_regs (regs); + if (++count <= 20) { /* Don't make the system unusable, if someone goes stuck */ + printk ("Unimplemented SPARC system call %ld\n",regs->u_regs[1]); + show_regs (regs); + } unlock_kernel(); return -ENOSYS; } @@ -220,46 +223,36 @@ asmlinkage int sparc_sigaction (int signum, const struct sigaction *action, struct sigaction *oldaction) { struct sigaction new_sa, *p; - int err = -EINVAL; - lock_kernel(); if(signum < 0) { current->tss.new_signal = 1; signum = -signum; } - if (signum<1 || signum>32) - goto out; + return -EINVAL; p = signum - 1 + current->sig->action; if (action) { - err = -EINVAL; if (signum==SIGKILL || signum==SIGSTOP) - goto out; - err = -EFAULT; + return -EINVAL; if(copy_from_user(&new_sa, action, sizeof(struct sigaction))) - goto out; + return -EFAULT; if (new_sa.sa_handler != SIG_DFL && new_sa.sa_handler != SIG_IGN) { - err = verify_area(VERIFY_READ, new_sa.sa_handler, 1); + int err = verify_area(VERIFY_READ, new_sa.sa_handler, 1); if (err) - goto out; + return err; } } - if (oldaction) { - err = -EFAULT; if (copy_to_user(oldaction, p, sizeof(struct sigaction))) - goto out; + return -EFAULT; } - if (action) { + spin_lock_irq(¤t->sig->siglock); *p = new_sa; check_pending(signum); + spin_unlock_irq(¤t->sig->siglock); } - - err = 0; -out: - unlock_kernel(); - return err; + return 0; } /* only AP+ systems have sys_aplib */ @@ -267,3 +260,15 @@ asmlinkage int sys_aplib(void) { return -ENOSYS; } + +asmlinkage int solaris_syscall(struct pt_regs *regs) +{ + lock_kernel(); + regs->tpc = regs->tnpc; + regs->tnpc += 4; + printk ("For Solaris binary emulation you need solaris module loaded\n"); + show_regs (regs); + send_sig(SIGSEGV, current, 1); + unlock_kernel(); + return 0; +} |