signotify.c revision 7be238fce69ba74b2163fc0ea898dfdc01a4aa22
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER START
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The contents of this file are subject to the terms of the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Common Development and Distribution License (the "License").
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You may not use this file except in compliance with the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * or http://www.opensolaris.org/os/licensing.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * See the License for the specific language governing permissions
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * and limitations under the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * When distributing Covered Code, include this CDDL HEADER in each
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If applicable, add the following below this CDDL HEADER, with the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * fields enclosed by brackets "[]" replaced with your own identifying
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * information: Portions Copyright [yyyy] [name of copyright owner]
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER END
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * Use is subject to license terms.
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roycopyin_siginfo(model_t datamodel, void *uaddr, k_siginfo_t *ksip)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (copyin(uaddr, ksip, sizeof (k_siginfo_t)));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (ret = copyin(uaddr, &si32, sizeof (si32)))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * To find secured 64 bit id for signotify() call
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This depends upon as_getmemid() which returns
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * unique vnode/offset for a user virtual address.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!as_getmemid(p->p_as, addr, &memid)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define SIGN_PTR(p, n) &((signotifyq_t *)(&p->p_signhdr[1]))[n];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailsignotify(int cmd, siginfo_t *siginfo, signotify_id_t *sn_id)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyin(sn_id, &id, sizeof (signotify_id_t)))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (id.sn_index >= _SIGNOTIFY_MAX || id.sn_index < 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* get snid for the given user address of signotifyid_t */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (copyin_siginfo(datamodel, siginfo, &info))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* The si_code value must indicate the signal will be queued */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!sigwillqueue(info.si_signo, info.si_code))
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* Allocate signotify pool first time */
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* hang the pool head on proc */
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* another lwp allocated the pool, free ours */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* fill the signotifyq_t fields */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* complete the signotify_id_t fields */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail id.sn_index = (signotifyq_t *)sqp - SIGN_PTR(cp, 0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((id.sn_pid <= 0) || ((p = prfind(id.sn_pid)) == NULL)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* cmd == SN_CANCEL or signo == 0 (SIGEV_NONE) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (((sigqueue_t *)snqp)->sq_info.si_signo <= 0)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyout(&id, sn_id, sizeof (signotify_id_t)))
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roysigresend(int sig, siginfo_t *siginfo, sigset_t *mask)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sigqueue_t *sqp = kmem_zalloc(sizeof (*sqp), KM_SLEEP);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (sig <= 0 || sig >= NSIG || sigismember(&cantmask, sig)) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyin_siginfo(get_udatamodel(), siginfo, &sqp->sq_info)) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * We don't need to acquire p->p_lock here;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * we are manipulating thread-private data.