diff options
-rw-r--r-- | sys/kern/kern_random.c | 397 | ||||
-rw-r--r-- | sys/svr4/svr4_signal.c | 666 |
2 files changed, 0 insertions, 1063 deletions
diff --git a/sys/kern/kern_random.c b/sys/kern/kern_random.c deleted file mode 100644 index 1c85964..0000000 --- a/sys/kern/kern_random.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * kern_random.c -- A strong random number generator - * - * $FreeBSD$ - * - * Version 0.95, last modified 18-Oct-95 - * - * Copyright Theodore Ts'o, 1994, 1995. All rights reserved. - * - * 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, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 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. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/md5.h> -#include <sys/poll.h> -#include <sys/random.h> -#include <sys/systm.h> -#include <sys/select.h> -#include <sys/timetc.h> - -#include <machine/ipl.h> -#include <machine/mutex.h> - -#ifdef __i386__ -#include <i386/isa/icu.h> -#endif -#ifdef __alpha__ -/* - XXX the below should be used. However there is too much "16" - hardcodeing in kern_random.c right now. -- obrien -#include <machine/ipl.h> -#if NHWI > 0 -#define ICU_LEN (NHWI) -#else -#define ICU_LEN (NSWI) -#endif -*/ -#define ICU_LEN 16 -#endif - -#define MAX_BLKDEV 4 - -/* - * The pool is stirred with a primitive polynomial of degree 128 - * over GF(2), namely x^128 + x^99 + x^59 + x^31 + x^9 + x^7 + 1. - * For a pool of size 64, try x^64+x^62+x^38+x^10+x^6+x+1. - */ -#define POOLWORDS 128 /* Power of 2 - note that this is 32-bit words */ -#define POOLBITS (POOLWORDS*32) - -#if POOLWORDS == 128 -#define TAP1 99 /* The polynomial taps */ -#define TAP2 59 -#define TAP3 31 -#define TAP4 9 -#define TAP5 7 -#elif POOLWORDS == 64 -#define TAP1 62 /* The polynomial taps */ -#define TAP2 38 -#define TAP3 10 -#define TAP4 6 -#define TAP5 1 -#else -#error No primitive polynomial available for chosen POOLWORDS -#endif - -#define WRITEBUFFER 512 /* size in bytes */ - -/* There is actually only one of these, globally. */ -struct random_bucket { - u_int add_ptr; - u_int entropy_count; - int input_rotate; - u_int32_t *pool; - struct selinfo rsel; -}; - -/* There is one of these per entropy source */ -struct timer_rand_state { - u_long last_time; - int last_delta; - int nbits; -}; - -static struct random_bucket random_state; -static u_int32_t random_pool[POOLWORDS]; -static struct timer_rand_state keyboard_timer_state; -static struct timer_rand_state extract_timer_state; -static struct timer_rand_state irq_timer_state[ICU_LEN]; -#ifdef notyet -static struct timer_rand_state blkdev_timer_state[MAX_BLKDEV]; -#endif -static struct wait_queue *random_wait; - -#ifndef MIN -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -void -rand_initialize(void) -{ - random_state.add_ptr = 0; - random_state.entropy_count = 0; - random_state.pool = random_pool; - random_wait = NULL; - random_state.rsel.si_flags = 0; - random_state.rsel.si_pid = 0; -} - -/* - * This function adds an int into the entropy "pool". It does not - * update the entropy estimate. The caller must do this if appropriate. - * - * The pool is stirred with a primitive polynomial of degree 128 - * over GF(2), namely x^128 + x^99 + x^59 + x^31 + x^9 + x^7 + 1. - * For a pool of size 64, try x^64+x^62+x^38+x^10+x^6+x+1. - * - * We rotate the input word by a changing number of bits, to help - * assure that all bits in the entropy get toggled. Otherwise, if we - * consistently feed the entropy pool small numbers (like ticks and - * scancodes, for example), the upper bits of the entropy pool don't - * get affected. --- TYT, 10/11/95 - */ -static __inline void -add_entropy_word(struct random_bucket *r, const u_int32_t input) -{ - u_int i; - u_int32_t w; - - w = (input << r->input_rotate) | (input >> (32 - r->input_rotate)); - i = r->add_ptr = (r->add_ptr - 1) & (POOLWORDS-1); - if (i) - r->input_rotate = (r->input_rotate + 7) & 31; - else - /* - * At the beginning of the pool, add an extra 7 bits - * rotation, so that successive passes spread the - * input bits across the pool evenly. - */ - r->input_rotate = (r->input_rotate + 14) & 31; - - /* XOR in the various taps */ - w ^= r->pool[(i+TAP1)&(POOLWORDS-1)]; - w ^= r->pool[(i+TAP2)&(POOLWORDS-1)]; - w ^= r->pool[(i+TAP3)&(POOLWORDS-1)]; - w ^= r->pool[(i+TAP4)&(POOLWORDS-1)]; - w ^= r->pool[(i+TAP5)&(POOLWORDS-1)]; - w ^= r->pool[i]; - /* Rotate w left 1 bit (stolen from SHA) and store */ - r->pool[i] = (w << 1) | (w >> 31); -} - -/* - * This function adds entropy to the entropy "pool" by using timing - * delays. It uses the timer_rand_state structure to make an estimate - * of how any bits of entropy this call has added to the pool. - * - * The number "num" is also added to the pool - it should somehow describe - * the type of event which just happened. This is currently 0-255 for - * keyboard scan codes, and 256 upwards for interrupts. - * On the i386, this is assumed to be at most 16 bits, and the high bits - * are used for a high-resolution timer. - */ -static void -add_timer_randomness(struct random_bucket *r, struct timer_rand_state *state, - u_int num) -{ - int delta, delta2; - u_int nbits; - u_int32_t time; - struct timecounter *tc = timecounter; /* can change at any time */ - - num ^= tc->tc_get_timecount(tc) << 16; - r->entropy_count += 2; - - time = ticks; - - add_entropy_word(r, (u_int32_t) num); - add_entropy_word(r, time); - - /* - * Calculate number of bits of randomness we probably - * added. We take into account the first and second order - * deltas in order to make our estimate. - */ - delta = time - state->last_time; - state->last_time = time; - - delta2 = delta - state->last_delta; - state->last_delta = delta; - - if (delta < 0) delta = -delta; - if (delta2 < 0) delta2 = -delta2; - delta = MIN(delta, delta2) >> 1; - for (nbits = 0; delta; nbits++) - delta >>= 1; - - r->entropy_count += nbits; - - /* Prevent overflow */ - if (r->entropy_count > POOLBITS) - r->entropy_count = POOLBITS; - - if (r->entropy_count >= 8) - selwakeup(&random_state.rsel); -} - -void -add_keyboard_randomness(u_char scancode) -{ - add_timer_randomness(&random_state, &keyboard_timer_state, scancode); -} - -void -add_interrupt_randomness(void *vsc) -{ - int intr; - struct random_softc *sc = vsc; - - (sc->sc_handler)(sc->sc_arg); - intr = sc->sc_intr; - add_timer_randomness(&random_state, &irq_timer_state[intr], intr); -} - -#ifdef notused -void -add_blkdev_randomness(int major) -{ - if (major >= MAX_BLKDEV) - return; - - add_timer_randomness(&random_state, &blkdev_timer_state[major], - 0x200+major); -} -#endif /* notused */ - -#if POOLWORDS % 16 -#error extract_entropy() assumes that POOLWORDS is a multiple of 16 words. -#endif -/* - * This function extracts randomness from the "entropy pool", and - * returns it in a buffer. This function computes how many remaining - * bits of entropy are left in the pool, but it does not restrict the - * number of bytes that are actually obtained. - */ -static __inline int -extract_entropy(struct random_bucket *r, char *buf, int nbytes) -{ - int ret, i; - u_int32_t tmp[4]; - - add_timer_randomness(r, &extract_timer_state, nbytes); - - /* Redundant, but just in case... */ - if (r->entropy_count > POOLBITS) - r->entropy_count = POOLBITS; - /* Why is this here? Left in from Ted Ts'o. Perhaps to limit time. */ - if (nbytes > 32768) - nbytes = 32768; - - ret = nbytes; - if (r->entropy_count / 8 >= nbytes) - r->entropy_count -= nbytes*8; - else - r->entropy_count = 0; - - while (nbytes) { - /* Hash the pool to get the output */ - tmp[0] = 0x67452301; - tmp[1] = 0xefcdab89; - tmp[2] = 0x98badcfe; - tmp[3] = 0x10325476; - for (i = 0; i < POOLWORDS; i += 16) - MD5Transform(tmp, (char *)(r->pool+i)); - /* Modify pool so next hash will produce different results */ - add_entropy_word(r, tmp[0]); - add_entropy_word(r, tmp[1]); - add_entropy_word(r, tmp[2]); - add_entropy_word(r, tmp[3]); - /* - * Run the MD5 Transform one more time, since we want - * to add at least minimal obscuring of the inputs to - * add_entropy_word(). --- TYT - */ - MD5Transform(tmp, (char *)(r->pool)); - - /* Copy data to destination buffer */ - i = MIN(nbytes, 16); - bcopy(tmp, buf, i); - nbytes -= i; - buf += i; - } - - /* Wipe data from memory */ - bzero(tmp, sizeof(tmp)); - - return ret; -} - -#ifdef notused /* XXX NOT the exported kernel interface */ -/* - * This function is the exported kernel interface. It returns some - * number of good random numbers, suitable for seeding TCP sequence - * numbers, etc. - */ -void -get_random_bytes(void *buf, u_int nbytes) -{ - extract_entropy(&random_state, (char *) buf, nbytes); -} -#endif /* notused */ - -u_int -read_random(void *buf, u_int nbytes) -{ - if ((nbytes * 8) > random_state.entropy_count) - nbytes = random_state.entropy_count / 8; - - return extract_entropy(&random_state, (char *)buf, nbytes); -} - -u_int -read_random_unlimited(void *buf, u_int nbytes) -{ - return extract_entropy(&random_state, (char *)buf, nbytes); -} - -#ifdef notused -u_int -write_random(const char *buf, u_int nbytes) -{ - u_int i; - u_int32_t word, *p; - - for (i = nbytes, p = (u_int32_t *)buf; - i >= sizeof(u_int32_t); - i-= sizeof(u_int32_t), p++) - add_entropy_word(&random_state, *p); - if (i) { - word = 0; - bcopy(p, &word, i); - add_entropy_word(&random_state, word); - } - return nbytes; -} -#endif /* notused */ - -int -random_poll(dev_t dev, int events, struct proc *p) -{ - int revents = 0; - - mtx_enter_sched_quick(); - if (events & (POLLIN | POLLRDNORM)) { - if (random_state.entropy_count >= 8) - revents |= events & (POLLIN | POLLRDNORM); - else - selrecord(p, &random_state.rsel); - } - mtx_exit_sched_quick(); - if (events & (POLLOUT | POLLWRNORM)) - revents |= events & (POLLOUT | POLLWRNORM); /* heh */ - - return (revents); -} - diff --git a/sys/svr4/svr4_signal.c b/sys/svr4/svr4_signal.c deleted file mode 100644 index 46407ba..0000000 --- a/sys/svr4/svr4_signal.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright (c) 1998 Mark Newton - * Copyright (c) 1994 Christos Zoulas - * All rights reserved. - * - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/proc.h> -#include <sys/filedesc.h> -#include <sys/signal.h> -#include <sys/signalvar.h> -#include <sys/sysproto.h> - -#include <svr4/svr4.h> -#include <svr4/svr4_types.h> -#include <svr4/svr4_signal.h> -#include <svr4/svr4_proto.h> -#include <svr4/svr4_util.h> -#include <svr4/svr4_ucontext.h> - -#define svr4_sigmask(n) (1 << (((n) - 1) & 31)) -#define svr4_sigword(n) (((n) - 1) >> 5) -#define svr4_sigemptyset(s) memset((s), 0, sizeof(*(s))) -#define svr4_sigismember(s, n) ((s)->bits[svr4_sigword(n)] & svr4_sigmask(n)) -#define svr4_sigaddset(s, n) ((s)->bits[svr4_sigword(n)] |= svr4_sigmask(n)) - -void svr4_to_bsd_sigaction __P((const struct svr4_sigaction *, - struct sigaction *)); -void bsd_to_svr4_sigaction __P((const struct sigaction *, - struct svr4_sigaction *)); -void svr4_sigfillset __P((svr4_sigset_t *)); - -int bsd_to_svr4_sig[SVR4_SIGTBLSZ] = { - SVR4_SIGHUP, - SVR4_SIGINT, - SVR4_SIGQUIT, - SVR4_SIGILL, - SVR4_SIGTRAP, - SVR4_SIGABRT, - SVR4_SIGEMT, - SVR4_SIGFPE, - SVR4_SIGKILL, - SVR4_SIGBUS, - SVR4_SIGSEGV, - SVR4_SIGSYS, - SVR4_SIGPIPE, - SVR4_SIGALRM, - SVR4_SIGTERM, - SVR4_SIGURG, - SVR4_SIGSTOP, - SVR4_SIGTSTP, - SVR4_SIGCONT, - SVR4_SIGCHLD, - SVR4_SIGTTIN, - SVR4_SIGTTOU, - SVR4_SIGIO, - SVR4_SIGXCPU, - SVR4_SIGXFSZ, - SVR4_SIGVTALRM, - SVR4_SIGPROF, - SVR4_SIGWINCH, - 0, /* SIGINFO */ - SVR4_SIGUSR1, - SVR4_SIGUSR2, -}; - -int svr4_to_bsd_sig[SVR4_SIGTBLSZ] = { - SIGHUP, - SIGINT, - SIGQUIT, - SIGILL, - SIGTRAP, - SIGABRT, - SIGEMT, - SIGFPE, - SIGKILL, - SIGBUS, - SIGSEGV, - SIGSYS, - SIGPIPE, - SIGALRM, - SIGTERM, - SIGUSR1, - SIGUSR2, - SIGCHLD, - 0, /* XXX NetBSD uses SIGPWR here, but we don't seem to have one */ - SIGWINCH, - SIGURG, - SIGIO, - SIGSTOP, - SIGTSTP, - SIGCONT, - SIGTTIN, - SIGTTOU, - SIGVTALRM, - SIGPROF, - SIGXCPU, - SIGXFSZ, -}; - -void -svr4_sigfillset(s) - svr4_sigset_t *s; -{ - int i; - - svr4_sigemptyset(s); - for (i = 0; i < SVR4_NSIG; i++) - if (svr4_to_bsd_sig[i] != 0) - svr4_sigaddset(s, i); -} - -void -svr4_to_bsd_sigset(sss, bss) - const svr4_sigset_t *sss; - sigset_t *bss; -{ - int i, newsig; - - SIGEMPTYSET(*bss); - for (i = 0; i < SVR4_NSIG; i++) - if (svr4_sigismember(sss, i + 1)) { - newsig = svr4_to_bsd_sig[i]; - if (newsig) - SIGADDSET(*bss, newsig); - } -} - -void -bsd_to_svr4_sigset(bss, sss) - const sigset_t *bss; - svr4_sigset_t *sss; -{ - int i, newsig; - - svr4_sigemptyset(sss); - sss->bits[0] = bss->__bits[0] & ~((1U << SVR4_SIGTBLSZ) - 1); - sss->bits[1] = bss->__bits[1]; - sss->bits[2] = bss->__bits[2]; - sss->bits[3] = bss->__bits[3]; - for (i = 1; i <= SVR4_SIGTBLSZ; i++) { - if (SIGISMEMBER(*bss, i)) { - newsig = bsd_to_svr4_sig[_SIG_IDX(i)]; - if (newsig) - svr4_sigaddset(sss, newsig); - } - } -} - -/* - * XXX: Only a subset of the flags is currently implemented. - */ -void -svr4_to_bsd_sigaction(ssa, bsa) - const struct svr4_sigaction *ssa; - struct sigaction *bsa; -{ - - bsa->sa_handler = (sig_t) ssa->ssa_handler; - svr4_to_bsd_sigset(&ssa->ssa_mask, &bsa->sa_mask); - bsa->sa_flags = 0; - if ((ssa->ssa_flags & SVR4_SA_ONSTACK) != 0) - bsa->sa_flags |= SA_ONSTACK; - if ((ssa->ssa_flags & SVR4_SA_RESETHAND) != 0) - bsa->sa_flags |= SA_RESETHAND; - if ((ssa->ssa_flags & SVR4_SA_RESTART) != 0) - bsa->sa_flags |= SA_RESTART; - if ((ssa->ssa_flags & SVR4_SA_SIGINFO) != 0) - DPRINTF(("svr4_to_bsd_sigaction: SA_SIGINFO ignored\n")); - if ((ssa->ssa_flags & SVR4_SA_NOCLDSTOP) != 0) - bsa->sa_flags |= SA_NOCLDSTOP; - if ((ssa->ssa_flags & SVR4_SA_NODEFER) != 0) - bsa->sa_flags |= SA_NODEFER; - if ((ssa->ssa_flags & SVR4_SA_NOCLDWAIT) != 0) - bsa->sa_flags |= SA_NOCLDWAIT; - if ((ssa->ssa_flags & ~SVR4_SA_ALLBITS) != 0) - DPRINTF(("svr4_to_bsd_sigaction: extra bits ignored\n")); -} - -void -bsd_to_svr4_sigaction(bsa, ssa) - const struct sigaction *bsa; - struct svr4_sigaction *ssa; -{ - - ssa->ssa_handler = (svr4_sig_t) bsa->sa_handler; - bsd_to_svr4_sigset(&bsa->sa_mask, &ssa->ssa_mask); - ssa->ssa_flags = 0; - if ((bsa->sa_flags & SA_ONSTACK) != 0) - ssa->ssa_flags |= SVR4_SA_ONSTACK; - if ((bsa->sa_flags & SA_RESETHAND) != 0) - ssa->ssa_flags |= SVR4_SA_RESETHAND; - if ((bsa->sa_flags & SA_RESTART) != 0) - ssa->ssa_flags |= SVR4_SA_RESTART; - if ((bsa->sa_flags & SA_NODEFER) != 0) - ssa->ssa_flags |= SVR4_SA_NODEFER; - if ((bsa->sa_flags & SA_NOCLDSTOP) != 0) - ssa->ssa_flags |= SVR4_SA_NOCLDSTOP; -} - -void -svr4_to_bsd_sigaltstack(sss, bss) - const struct svr4_sigaltstack *sss; - struct sigaltstack *bss; -{ - - bss->ss_sp = sss->ss_sp; - bss->ss_size = sss->ss_size; - bss->ss_flags = 0; - if ((sss->ss_flags & SVR4_SS_DISABLE) != 0) - bss->ss_flags |= SS_DISABLE; - if ((sss->ss_flags & SVR4_SS_ONSTACK) != 0) - bss->ss_flags |= SS_ONSTACK; - if ((sss->ss_flags & ~SVR4_SS_ALLBITS) != 0) - /*XXX*/ uprintf("svr4_to_bsd_sigaltstack: extra bits ignored\n"); -} - -void -bsd_to_svr4_sigaltstack(bss, sss) - const struct sigaltstack *bss; - struct svr4_sigaltstack *sss; -{ - - sss->ss_sp = bss->ss_sp; - sss->ss_size = bss->ss_size; - sss->ss_flags = 0; - if ((bss->ss_flags & SS_DISABLE) != 0) - sss->ss_flags |= SVR4_SS_DISABLE; - if ((bss->ss_flags & SS_ONSTACK) != 0) - sss->ss_flags |= SVR4_SS_ONSTACK; -} - -int -svr4_sys_sigaction(p, uap) - register struct proc *p; - struct svr4_sys_sigaction_args *uap; -{ - struct svr4_sigaction *nisa, *oisa, tmpisa; - struct sigaction *nbsa, *obsa, tmpbsa; - struct sigaction_args sa; - caddr_t sg; - int error; - - DPRINTF(("@@@ svr4_sys_sigaction(%d, %d, %d)\n", p->p_pid, - SCARG(uap, signum), - SVR4_SVR42BSD_SIG(SCARG(uap, signum)))); - - sg = stackgap_init(); - nisa = SCARG(uap, nsa); - oisa = SCARG(uap, osa); - - if (oisa != NULL) - obsa = stackgap_alloc(&sg, sizeof(struct sigaction)); - else - obsa = NULL; - - if (nisa != NULL) { - nbsa = stackgap_alloc(&sg, sizeof(struct sigaction)); - if ((error = copyin(nisa, &tmpisa, sizeof(tmpisa))) != 0) - return error; - svr4_to_bsd_sigaction(&tmpisa, &tmpbsa); - if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0) - return error; - } else - nbsa = NULL; - -#if defined(DEBUG_SVR4) - { - int i; - for (i = 0; i < 4; i++) - DPRINTF(("\tssa_mask[%d] = %lx\n", i, - nisa->ssa_mask.bits[i])); - DPRINTF(("\tssa_handler = %lx\n", nisa->ssa_handler)); - } -#endif - - SCARG(&sa, sig) = SVR4_SVR42BSD_SIG(SCARG(uap, signum)); - SCARG(&sa, act) = nbsa; - SCARG(&sa, oact) = obsa; - - if ((error = sigaction(p, &sa)) != 0) - return error; - - if (oisa != NULL) { - if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0) - return error; - bsd_to_svr4_sigaction(&tmpbsa, &tmpisa); - if ((error = copyout(&tmpisa, oisa, sizeof(tmpisa))) != 0) - return error; - } - - return 0; -} - -int -svr4_sys_sigaltstack(p, uap) - register struct proc *p; - struct svr4_sys_sigaltstack_args *uap; -{ - struct svr4_sigaltstack *nsss, *osss, tmpsss; - struct sigaltstack *nbss, *obss, tmpbss; - struct sigaltstack_args sa; - caddr_t sg; - int error, *retval; - - retval = p->p_retval; - sg = stackgap_init(); - nsss = SCARG(uap, nss); - osss = SCARG(uap, oss); - - if (osss != NULL) - obss = stackgap_alloc(&sg, sizeof(struct sigaltstack)); - else - obss = NULL; - - if (nsss != NULL) { - nbss = stackgap_alloc(&sg, sizeof(struct sigaltstack)); - if ((error = copyin(nsss, &tmpsss, sizeof(tmpsss))) != 0) - return error; - svr4_to_bsd_sigaltstack(&tmpsss, &tmpbss); - if ((error = copyout(&tmpbss, nbss, sizeof(tmpbss))) != 0) - return error; - } else - nbss = NULL; - - SCARG(&sa, ss) = nbss; - SCARG(&sa, oss) = obss; - - if ((error = sigaltstack(p, &sa)) != 0) - return error; - - if (obss != NULL) { - if ((error = copyin(obss, &tmpbss, sizeof(tmpbss))) != 0) - return error; - bsd_to_svr4_sigaltstack(&tmpbss, &tmpsss); - if ((error = copyout(&tmpsss, osss, sizeof(tmpsss))) != 0) - return error; - } - - return 0; -} - -/* - * Stolen from the ibcs2 one - */ -int -svr4_sys_signal(p, uap) - register struct proc *p; - struct svr4_sys_signal_args *uap; -{ - int signum; - int error, *retval = p->p_retval; - caddr_t sg = stackgap_init(); - - DPRINTF(("@@@ svr4_sys_signal(%d)\n", p->p_pid)); - - signum = SVR4_SVR42BSD_SIG(SVR4_SIGNO(SCARG(uap, signum))); - if (signum <= 0 || signum > SVR4_NSIG) - return (EINVAL); - - switch (SVR4_SIGCALL(SCARG(uap, signum))) { - case SVR4_SIGDEFER_MASK: - if (SCARG(uap, handler) == SVR4_SIG_HOLD) - goto sighold; - /* FALLTHROUGH */ - - case SVR4_SIGNAL_MASK: - { - struct sigaction_args sa_args; - struct sigaction *nbsa, *obsa, sa; - - nbsa = stackgap_alloc(&sg, sizeof(struct sigaction)); - obsa = stackgap_alloc(&sg, sizeof(struct sigaction)); - SCARG(&sa_args, sig) = signum; - SCARG(&sa_args, act) = nbsa; - SCARG(&sa_args, oact) = obsa; - - sa.sa_handler = (sig_t) SCARG(uap, handler); - SIGEMPTYSET(sa.sa_mask); - sa.sa_flags = 0; - - if (signum != SIGALRM) - sa.sa_flags = SA_RESTART; - - if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0) - return error; - if ((error = sigaction(p, &sa_args)) != 0) { - DPRINTF(("signal: sigaction failed: %d\n", - error)); - *retval = (int)SVR4_SIG_ERR; - return error; - } - if ((error = copyin(obsa, &sa, sizeof(sa))) != 0) - return error; - *retval = (int)sa.sa_handler; - return 0; - } - - case SVR4_SIGHOLD_MASK: -sighold: - { - struct sigprocmask_args sa; - sigset_t *set; - - set = stackgap_alloc(&sg, sizeof(sigset_t)); - SIGEMPTYSET(*set); - SIGADDSET(*set, signum); - SCARG(&sa, how) = SIG_BLOCK; - SCARG(&sa, set) = set; - SCARG(&sa, oset) = NULL; - return sigprocmask(p, &sa); - } - - case SVR4_SIGRELSE_MASK: - { - struct sigprocmask_args sa; - sigset_t *set; - - set = stackgap_alloc(&sg, sizeof(sigset_t)); - SIGEMPTYSET(*set); - SIGADDSET(*set, signum); - SCARG(&sa, how) = SIG_UNBLOCK; - SCARG(&sa, set) = set; - SCARG(&sa, oset) = NULL; - return sigprocmask(p, &sa); - } - - case SVR4_SIGIGNORE_MASK: - { - struct sigaction_args sa_args; - struct sigaction *bsa, sa; - - bsa = stackgap_alloc(&sg, sizeof(struct sigaction)); - SCARG(&sa_args, sig) = signum; - SCARG(&sa_args, act) = bsa; - SCARG(&sa_args, oact) = NULL; - - sa.sa_handler = SIG_IGN; - SIGEMPTYSET(sa.sa_mask); - sa.sa_flags = 0; - if ((error = copyout(&sa, bsa, sizeof(sa))) != 0) - return error; - if ((error = sigaction(p, &sa_args)) != 0) { - DPRINTF(("sigignore: sigaction failed\n")); - return error; - } - return 0; - } - - case SVR4_SIGPAUSE_MASK: - { - struct sigsuspend_args sa; - sigset_t *set; - - set = stackgap_alloc(&sg, sizeof(sigset_t)); - *set = p->p_sigmask; - SIGDELSET(*set, signum); - SCARG(&sa, sigmask) = set; - return sigsuspend(p, &sa); - } - - default: - return (ENOSYS); - } -} - - -int -svr4_sys_sigprocmask(p, uap) - struct proc *p; - struct svr4_sys_sigprocmask_args *uap; -{ - svr4_sigset_t sss; - sigset_t bss; - int error = 0, *retval; - - retval = p->p_retval; - if (SCARG(uap, oset) != NULL) { - /* Fix the return value first if needed */ - bsd_to_svr4_sigset(&p->p_sigmask, &sss); - if ((error = copyout(&sss, SCARG(uap, oset), sizeof(sss))) != 0) - return error; - } - - if (SCARG(uap, set) == NULL) - /* Just examine */ - return 0; - - if ((error = copyin(SCARG(uap, set), &sss, sizeof(sss))) != 0) - return error; - - svr4_to_bsd_sigset(&sss, &bss); - - mtx_enter_sched_quick(); - - switch (SCARG(uap, how)) { - case SVR4_SIG_BLOCK: - SIGSETOR(p->p_sigmask, bss); - SIG_CANTMASK(p->p_sigmask); - break; - - case SVR4_SIG_UNBLOCK: - SIGSETNAND(p->p_sigmask, bss); - break; - - case SVR4_SIG_SETMASK: - p->p_sigmask = bss; - SIG_CANTMASK(p->p_sigmask); - break; - - default: - error = EINVAL; - break; - } - - mtx_exit_sched_quick(); - - return error; -} - -int -svr4_sys_sigpending(p, uap) - struct proc *p; - struct svr4_sys_sigpending_args *uap; -{ - sigset_t bss; - int *retval; - svr4_sigset_t sss; - - DPRINTF(("@@@ svr4_sys_sigpending(%d)\n", p->p_pid)); - retval = p->p_retval; - switch (SCARG(uap, what)) { - case 1: /* sigpending */ - if (SCARG(uap, mask) == NULL) - return 0; - bss = p->p_siglist; - SIGSETAND(bss, p->p_sigmask); - bsd_to_svr4_sigset(&bss, &sss); - break; - - case 2: /* sigfillset */ - svr4_sigfillset(&sss); -#if defined(DEBUG_SVR4) - { - int i; - for (i = 0; i < 4; i++) - DPRINTF(("new sigset[%d] = %lx\n", i, (long)sss.bits[i])); - } -#endif - break; - - default: - return EINVAL; - } - - return copyout(&sss, SCARG(uap, mask), sizeof(sss)); -} - -int -svr4_sys_sigsuspend(p, uap) - register struct proc *p; - struct svr4_sys_sigsuspend_args *uap; -{ - svr4_sigset_t sss; - sigset_t *bss; - struct sigsuspend_args sa; - int error; - caddr_t sg = stackgap_init(); - - if ((error = copyin(SCARG(uap, ss), &sss, sizeof(sss))) != 0) - return error; - - bss = stackgap_alloc(&sg, sizeof(sigset_t)); - svr4_to_bsd_sigset(&sss, bss); - - SCARG(&sa, sigmask) = bss; - return sigsuspend(p, &sa); -} - - -int -svr4_sys_kill(p, uap) - register struct proc *p; - struct svr4_sys_kill_args *uap; -{ - struct kill_args ka; - - SCARG(&ka, pid) = SCARG(uap, pid); - SCARG(&ka, signum) = SVR4_SVR42BSD_SIG(SCARG(uap, signum)); - return kill(p, &ka); -} - - -int -svr4_sys_context(p, uap) - register struct proc *p; - struct svr4_sys_context_args *uap; -{ - struct svr4_ucontext uc; - int error; - - switch (uap->func) { - case 0: - DPRINTF(("getcontext(%p)\n", uap->uc)); - svr4_getcontext(p, &uc, &p->p_sigmask, - p->p_sigstk.ss_flags & SS_ONSTACK); - return copyout(&uc, uap->uc, sizeof(uc)); - - case 1: - DPRINTF(("setcontext(%p)\n", uap->uc)); - if ((error = copyin(uap->uc, &uc, sizeof(uc))) != 0) - return error; - DPRINTF(("uc_flags = %lx\n", uc.uc_flags)); -#if defined(DEBUG_SVR4) - { - int i; - for (i = 0; i < 4; i++) - DPRINTF(("uc_sigmask[%d] = %lx\n", i, - uc.uc_sigmask.bits[i])); - } -#endif - return svr4_setcontext(p, &uc); - - default: - DPRINTF(("context(%d, %p)\n", uap->func, - uap->uc)); - return ENOSYS; - } - return 0; -} - -int -svr4_sys_pause(p, uap) - register struct proc *p; - struct svr4_sys_pause_args *uap; -{ - struct sigsuspend_args bsa; - - SCARG(&bsa, sigmask) = &p->p_sigmask; - return sigsuspend(p, &bsa); -} |