summaryrefslogtreecommitdiff
path: root/sys/compat/hpux/hppa/hpux_sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/hpux/hppa/hpux_sig.c')
-rw-r--r--sys/compat/hpux/hppa/hpux_sig.c460
1 files changed, 0 insertions, 460 deletions
diff --git a/sys/compat/hpux/hppa/hpux_sig.c b/sys/compat/hpux/hppa/hpux_sig.c
deleted file mode 100644
index ed7cea2ec8c..00000000000
--- a/sys/compat/hpux/hppa/hpux_sig.c
+++ /dev/null
@@ -1,460 +0,0 @@
-/* $OpenBSD: hpux_sig.c,v 1.3 2004/07/11 00:29:30 mickey Exp $ */
-
-/*
- * Copyright (c) 2004 Michael Shalayeff. All rights reserved.
- * Copyright (c) 1988 University of Utah.
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * the Systems Programming Group of the University of Utah Computer
- * Science Department.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: Utah $Hdr: hpux_sig.c 1.4 92/01/20$
- *
- * @(#)hpux_sig.c 8.2 (Berkeley) 9/23/93
- */
-
-/*
- * Signal related HPUX compatibility routines
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/mount.h>
-#include <sys/proc.h>
-#include <sys/signalvar.h>
-#include <sys/syscallargs.h>
-
-#include <compat/hpux/hpux.h>
-#include <compat/hpux/hpux_sig.h>
-#include <compat/hpux/hpux_util.h>
-#include <compat/hpux/hppa/hpux_syscallargs.h>
-
-/* indexed by HPUX signal number - 1 */
-char hpuxtobsdsigmap[NSIG] = {
-/*01*/ SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGIOT, SIGEMT, SIGFPE,
-/*09*/ SIGKILL, SIGBUS, SIGSEGV, SIGSYS, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1,
-/*17*/ SIGUSR2, SIGCHLD, 0, SIGVTALRM,SIGPROF, SIGIO, SIGWINCH, SIGSTOP,
-/*25*/ SIGTSTP, SIGCONT,SIGTTIN, SIGTTOU, SIGURG, 0, 0, 0
-};
-
-/* indexed by BSD signal number - 1 */
-char bsdtohpuxsigmap[NSIG] = {
-/*01*/ 1, 2, 3, 4, 5, 6, 7, 8,
-/*09*/ 9, 10, 11, 12, 13, 14, 15, 29,
-/*17*/ 24, 25, 26, 18, 27, 28, 22, 0,
-/*25*/ 0, 20, 21, 23, 0, 16, 17, 0
-};
-
-/*
- * XXX: In addition to mapping the signal number we also have
- * to see if the "old" style signal mechinism is needed.
- * If so, we set the OUSIG flag. This is not really correct
- * as under HP-UX "old" style handling can be set on a per
- * signal basis and we are setting it for all signals in one
- * swell foop. I suspect we can get away with this since I
- * doubt any program of interest mixes the two semantics.
- */
-int
-hpux_sys_sigvec(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigvec_args *uap = v;
- struct sigvec vec;
- struct sigacts *ps = p->p_sigacts;
- struct sigvec *sv;
- int sig;
- int bit, error;
-
- sig = hpuxtobsdsig(SCARG(uap, signo));
- if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
- return (EINVAL);
- sv = &vec;
- if (SCARG(uap, osv)) {
- sv->sv_handler = ps->ps_sigact[sig];
- sv->sv_mask = ps->ps_catchmask[sig];
- bit = sigmask(sig);
- sv->sv_flags = 0;
- if ((ps->ps_sigonstack & bit) != 0)
- sv->sv_flags |= SV_ONSTACK;
- if ((ps->ps_sigintr & bit) != 0)
- sv->sv_flags |= SV_INTERRUPT;
- if ((ps->ps_sigreset & bit) != 0)
- sv->sv_flags |= HPUXSV_RESET;
- sv->sv_mask &= ~bit;
- error = copyout((caddr_t)sv, (caddr_t)SCARG(uap, osv),
- sizeof (vec));
- if (error)
- return (error);
- }
- if (SCARG(uap, nsv)) {
- error = copyin((caddr_t)SCARG(uap, nsv), (caddr_t)sv,
- sizeof (vec));
- if (error)
- return (error);
- if (sig == SIGCONT && sv->sv_handler == SIG_IGN)
- return (EINVAL);
- sv->sv_flags ^= SA_RESTART;
- setsigvec(p, sig, (struct sigaction *)sv);
-#if 0
-/* XXX -- SOUSIG no longer exists, do something here */
- if (sv->sv_flags & HPUXSV_RESET)
- p->p_flag |= SOUSIG; /* XXX */
-#endif
- }
- return (0);
-}
-
-int
-hpux_sys_sigblock(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigblock_args *uap = v;
-
- (void) splhigh();
- *retval = bsdtohpuxmask(p->p_sigmask);
- p->p_sigmask |= hpuxtobsdmask(SCARG(uap, mask)) &~ sigcantmask;
- (void) spl0();
- return (0);
-}
-
-int
-hpux_sys_sigsetmask(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigsetmask_args *uap = v;
-
- (void) splhigh();
- *retval = bsdtohpuxmask(p->p_sigmask);
- p->p_sigmask = hpuxtobsdmask(SCARG(uap, mask)) &~ sigcantmask;
- (void) spl0();
- return (0);
-}
-
-int
-hpux_sys_sigpause(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigpause_args *uap = v;
-
- SCARG(uap, mask) = hpuxtobsdmask(SCARG(uap, mask));
- return (sys_sigsuspend(p, uap, retval));
-}
-
-/* not totally correct, but close enuf' */
-int
-hpux_sys_kill(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_kill_args *uap = v;
-
- if (SCARG(uap, signo)) {
- SCARG(uap, signo) = hpuxtobsdsig(SCARG(uap, signo));
- if (SCARG(uap, signo) == 0)
- SCARG(uap, signo) = NSIG;
- }
- return (sys_kill(p, uap, retval));
-}
-
-/*
- * The following (sigprocmask, sigpending, sigsuspend, sigaction are
- * POSIX calls. Under BSD, the library routine dereferences the sigset_t
- * pointers before traping. Not so under HP-UX.
- */
-
-/*
- * Manipulate signal mask.
- * Note that we receive new mask, not pointer,
- * and return old mask as return value;
- * the library stub does the rest.
- */
-int
-hpux_sys_sigprocmask(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigprocmask_args *uap = v;
- int mask, error = 0;
- hpux_sigset_t sigset;
-
- /*
- * Copy out old mask first to ensure no errors.
- * (proc sigmask should not be changed if call fails for any reason)
- */
- if (SCARG(uap, oset)) {
- bzero((caddr_t)&sigset, sizeof(sigset));
- sigset.sigset[0] = bsdtohpuxmask(p->p_sigmask);
- if (copyout((caddr_t)&sigset, (caddr_t)SCARG(uap, oset),
- sizeof(sigset)))
- return (EFAULT);
- }
- if (SCARG(uap, set)) {
- if (copyin((caddr_t)SCARG(uap, set), (caddr_t)&sigset,
- sizeof(sigset)))
- return (EFAULT);
- mask = hpuxtobsdmask(sigset.sigset[0]);
- (void) splhigh();
- switch (SCARG(uap, how)) {
- case HPUXSIG_BLOCK:
- p->p_sigmask |= mask &~ sigcantmask;
- break;
- case HPUXSIG_UNBLOCK:
- p->p_sigmask &= ~mask;
- break;
- case HPUXSIG_SETMASK:
- p->p_sigmask = mask &~ sigcantmask;
- break;
- default:
- error = EINVAL;
- break;
- }
- (void) spl0();
- }
- return (error);
-}
-
-int
-hpux_sys_sigpending(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigpending_args *uap = v;
- hpux_sigset_t sigset;
-
- sigset.sigset[0] = bsdtohpuxmask(p->p_siglist);
- return (copyout((caddr_t)&sigset, (caddr_t)SCARG(uap, set),
- sizeof(sigset)));
-}
-
-int
-hpux_sys_sigsuspend(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigsuspend_args *uap = v;
- struct sigacts *ps = p->p_sigacts;
- hpux_sigset_t sigset;
- int mask;
-
- if (copyin((caddr_t)SCARG(uap, set), (caddr_t)&sigset, sizeof(sigset)))
- return (EFAULT);
- mask = hpuxtobsdmask(sigset.sigset[0]);
- ps->ps_oldmask = p->p_sigmask;
- ps->ps_flags |= SAS_OLDMASK;
- p->p_sigmask = mask &~ sigcantmask;
- (void) tsleep((caddr_t)ps, PPAUSE | PCATCH, "pause", 0);
- /* always return EINTR rather than ERESTART... */
- return (EINTR);
-}
-
-int
-hpux_sys_sigaction(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct hpux_sys_sigaction_args *uap = v;
- struct hpux_sigaction action;
- struct sigacts *ps = p->p_sigacts;
- struct hpux_sigaction *sa;
- int sig;
- int bit;
-
- sig = hpuxtobsdsig(SCARG(uap, signo));
- if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
- return (EINVAL);
-
- sa = &action;
- if (SCARG(uap, osa)) {
- sa->sa__handler = ps->ps_sigact[sig];
- bzero((caddr_t)&sa->sa_mask, sizeof(sa->sa_mask));
- sa->sa_mask.sigset[0] = bsdtohpuxmask(ps->ps_catchmask[sig]);
- bit = sigmask(sig);
- sa->sa_flags = 0;
- if ((ps->ps_sigonstack & bit) != 0)
- sa->sa_flags |= HPUXSA_ONSTACK;
- if ((ps->ps_sigreset & bit) != 0)
- sa->sa_flags |= HPUXSA_RESETHAND;
- if (p->p_flag & P_NOCLDSTOP)
- sa->sa_flags |= HPUXSA_NOCLDSTOP;
- if (p->p_flag & P_NOCLDWAIT)
- sa->sa_flags |= HPUXSA_NOCLDWAIT;
- if (copyout((caddr_t)sa, (caddr_t)SCARG(uap, osa),
- sizeof (action)))
- return (EFAULT);
- }
- if (SCARG(uap, nsa)) {
- struct sigaction act;
-
- if (copyin((caddr_t)SCARG(uap, nsa), (caddr_t)sa,
- sizeof (action)))
- return (EFAULT);
- if (sig == SIGCONT && sa->sa__handler == SIG_IGN)
- return (EINVAL);
- /*
- * Create a sigaction struct for setsigvec
- */
- act.sa_handler = sa->sa__handler;
- act.sa_mask = hpuxtobsdmask(sa->sa_mask.sigset[0]);
- act.sa_flags = SA_RESTART;
- if (sa->sa_flags & HPUXSA_ONSTACK)
- act.sa_flags |= SA_ONSTACK;
- if (sa->sa_flags & HPUXSA_NOCLDSTOP)
- act.sa_flags |= SA_NOCLDSTOP;
- if (sa->sa_flags & HPUXSA_NOCLDWAIT)
- act.sa_flags |= SA_NOCLDWAIT;
- setsigvec(p, sig, &act);
-#if 0
-/* XXX -- SOUSIG no longer exists, do something here */
- if (sa->sa_flags & HPUXSA_RESETHAND)
- p->p_flag |= SOUSIG; /* XXX */
-#endif
- }
- return (0);
-}
-
-/* signal numbers: convert from HPUX to BSD */
-int
-hpuxtobsdsig(sig)
- int sig;
-{
- if (--sig < 0 || sig >= NSIG)
- return(0);
- return((int)hpuxtobsdsigmap[sig]);
-}
-
-/* signal numbers: convert from BSD to HPUX */
-int
-bsdtohpuxsig(sig)
- int sig;
-{
- if (--sig < 0 || sig >= NSIG)
- return(0);
- return((int)bsdtohpuxsigmap[sig]);
-}
-
-/* signal masks: convert from HPUX to BSD (not pretty or fast) */
-int
-hpuxtobsdmask(mask)
- int mask;
-{
- int nmask, sig, nsig;
-
- if (mask == 0 || mask == -1)
- return(mask);
- nmask = 0;
- for (sig = 1; sig < NSIG; sig++)
- if ((mask & sigmask(sig)) && (nsig = hpuxtobsdsig(sig)))
- nmask |= sigmask(nsig);
- return(nmask);
-}
-
-int
-bsdtohpuxmask(mask)
- int mask;
-{
- int nmask, sig, nsig;
-
- if (mask == 0 || mask == -1)
- return(mask);
- nmask = 0;
- for (sig = 1; sig < NSIG; sig++)
- if ((mask & sigmask(sig)) && (nsig = bsdtohpuxsig(sig)))
- nmask |= sigmask(nsig);
- return(nmask);
-}
-
-int
-hpux_sigsetreturn(struct proc *p, void *v, register_t *retval)
-{
- struct hpux_sigsetreturn_args /* {
- syscallarg(int) cookie;
- } */ *uap = v;
-
-printf("hpux_sigsetreturn(%x)\n", SCARG(uap, cookie));
- return (0);
-}
-
-int
-hpux_sys_sigaltstack(struct proc *p, void *v, register_t *retval)
-{
- struct hpux_sys_sigaltstack_args /* {
- syscallarg(struct hpux_sigaltstack *) nss;
- syscallarg(struct hpux_sigaltstack *) oss;
- } */ *uap = v;
- struct sys_sigaltstack_args saa;
- struct hpux_sigaltstack hsa;
- struct sigaltstack *psa, sa;
- caddr_t sg;
- int error;
-
- if ((error = copyin(SCARG(uap, nss), &hsa, sizeof hsa)))
- return (error);
-
- sa.ss_sp = hsa.ss_sp;
- sa.ss_size = hsa.ss_size;
- sa.ss_flags = hsa.ss_flags & SS_ONSTACK;
- if (hsa.ss_flags & HPUX_SS_DISABLE)
- sa.ss_flags |= SS_DISABLE;
-
- sg = stackgap_init(p->p_emul);
- psa = stackgap_alloc(&sg, 2 * sizeof(struct sigaltstack));
- SCARG(&saa, nss) = &psa[0];
- SCARG(&saa, oss) = &psa[1];
-
- if ((error = copyout(&sa, psa, sizeof sa)))
- return (error);
-
- if ((error = sys_sigaltstack(p, &saa, retval)))
- return (error);
-
- if ((error = copyin(SCARG(&saa, oss), &sa, sizeof sa)))
- return (error);
-
- hsa.ss_sp = sa.ss_sp;
- hsa.ss_flags = sa.ss_flags & SS_ONSTACK;
- if (sa.ss_flags & SS_DISABLE)
- hsa.ss_flags |= HPUX_SS_DISABLE;
- hsa.ss_size = sa.ss_size;
-
- return (copyout(&hsa, SCARG(uap, oss), sizeof hsa));
-}