signotify.c revision 7be238fce69ba74b2163fc0ea898dfdc01a4aa22
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER START
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
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 *
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 *
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 *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER END
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan/*
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * Use is subject to license terms.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/param.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/types.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/sysmacros.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/systm.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/errno.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/proc.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/procset.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/fault.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/signal.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/siginfo.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/schedctl.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <vm/as.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/debug.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/contract/process_impl.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy/*ARGSUSED*/
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roystatic int
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roycopyin_siginfo(model_t datamodel, void *uaddr, k_siginfo_t *ksip)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy{
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy#ifdef _SYSCALL32_IMPL
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy int ret;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (datamodel == DATAMODEL_NATIVE) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy#endif
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (copyin(uaddr, ksip, sizeof (k_siginfo_t)));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy#ifdef _SYSCALL32_IMPL
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy } else {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy siginfo32_t si32;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (ret = copyin(uaddr, &si32, sizeof (si32)))
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (ret);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy siginfo_32tok(&si32, ksip);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
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 */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic u_longlong_t
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailget_sigid(proc_t *p, caddr_t addr)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail u_longlong_t snid = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail memid_t memid;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy quad_t *tquad = (quad_t *)&snid;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!as_getmemid(p->p_as, addr, &memid)) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy tquad->val[0] = (int)memid.val[0];
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy tquad->val[1] = (int)memid.val[1];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (snid);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define SIGN_PTR(p, n) &((signotifyq_t *)(&p->p_signhdr[1]))[n];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailint
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailsignotify(int cmd, siginfo_t *siginfo, signotify_id_t *sn_id)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail k_siginfo_t info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail signotify_id_t id;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail proc_t *p;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail proc_t *cp = curproc;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail signotifyq_t *snqp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct cred *cr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sigqueue_t *sqp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sigqhdr_t *sqh;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail u_longlong_t sid;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail model_t datamodel = get_udatamodel();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyin(sn_id, &id, sizeof (signotify_id_t)))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EFAULT));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (id.sn_index >= _SIGNOTIFY_MAX || id.sn_index < 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EINVAL));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (cmd) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SN_PROC:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* get snid for the given user address of signotifyid_t */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sid = get_sigid(cp, (caddr_t)sn_id);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (id.sn_pid > 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_enter(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((p = prfind(id.sn_pid)) != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_enter(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p->p_signhdr != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail snqp = SIGN_PTR(p, id.sn_index);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (snqp->sn_snid == sid) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EBUSY));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan mutex_exit(&p->p_lock);
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (copyin_siginfo(datamodel, siginfo, &info))
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan return (set_errno(EFAULT));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
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 return (set_errno(EINVAL));
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (cp->p_signhdr == NULL) {
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* Allocate signotify pool first time */
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan sqh = sigqhdralloc(sizeof (signotifyq_t),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail _SIGNOTIFY_MAX);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_enter(&cp->p_lock);
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan if (cp->p_signhdr == NULL) {
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* hang the pool head on proc */
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan cp->p_signhdr = sqh;
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan } else {
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan /* another lwp allocated the pool, free ours */
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan sigqhdrfree(sqh);
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan }
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan } else {
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan mutex_enter(&cp->p_lock);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan sqp = sigqalloc(cp->p_signhdr);
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan if (sqp == NULL) {
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan mutex_exit(&cp->p_lock);
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan return (set_errno(EAGAIN));
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan }
f1e9465bc27e0b59eff81249c9c2e3fd268727a6Sowmini Varadhan cr = CRED();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sqp->sq_info = info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sqp->sq_info.si_pid = cp->p_pid;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sqp->sq_info.si_ctid = PRCTID(cp);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sqp->sq_info.si_zoneid = getzoneid();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sqp->sq_info.si_uid = crgetruid(cr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* fill the signotifyq_t fields */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ((signotifyq_t *)sqp)->sn_snid = sid;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy mutex_exit(&cp->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* complete the signotify_id_t fields */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail id.sn_index = (signotifyq_t *)sqp - SIGN_PTR(cp, 0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail id.sn_pid = cp->p_pid;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SN_CANCEL:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SN_SEND:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sid = get_sigid(cp, (caddr_t)sn_id);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_enter(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((id.sn_pid <= 0) || ((p = prfind(id.sn_pid)) == NULL)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EINVAL));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_enter(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&pidlock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p->p_signhdr == NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EINVAL));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail snqp = SIGN_PTR(p, id.sn_index);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (snqp->sn_snid == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EINVAL));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (snqp->sn_snid != sid) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (set_errno(EINVAL));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail snqp->sn_snid = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* cmd == SN_CANCEL or signo == 0 (SIGEV_NONE) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (((sigqueue_t *)snqp)->sq_info.si_signo <= 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmd = SN_CANCEL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sigqsend(cmd, p, 0, (sigqueue_t *)snqp);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail mutex_exit(&p->p_lock);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy id.sn_pid = 0;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy id.sn_index = 0;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy break;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy default :
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (set_errno(EINVAL));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyout(&id, sn_id, sizeof (signotify_id_t)))
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (set_errno(EFAULT));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (0);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy}
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Royint
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roysigresend(int sig, siginfo_t *siginfo, sigset_t *mask)
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy{
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy kthread_t *t = curthread;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy klwp_t *lwp = ttolwp(t);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sigqueue_t *sqp = kmem_zalloc(sizeof (*sqp), KM_SLEEP);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sigset_t set;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy k_sigset_t kset;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy int error;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (sig <= 0 || sig >= NSIG || sigismember(&cantmask, sig)) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy error = EINVAL;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy goto bad;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (siginfo == NULL) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sqp->sq_info.si_signo = sig;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sqp->sq_info.si_code = SI_NOINFO;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy } else {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyin_siginfo(get_udatamodel(), siginfo, &sqp->sq_info)) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy error = EFAULT;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy goto bad;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (sqp->sq_info.si_signo != sig) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy error = EINVAL;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy goto bad;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (copyin(mask, &set, sizeof (set))) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy error = EFAULT;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy goto bad;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy sigutok(&set, &kset);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy /*
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * We don't need to acquire p->p_lock here;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy * we are manipulating thread-private data.
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy */
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy if (lwp->lwp_cursig || lwp->lwp_curinfo) {
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy t->t_sig_check = 1;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy error = EAGAIN;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy goto bad;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy }
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy lwp->lwp_cursig = sig;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy lwp->lwp_curinfo = sqp;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy schedctl_finish_sigblock(t);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy t->t_hold = kset;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy t->t_sig_check = 1;
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (0);
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roybad:
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy kmem_free(sqp, sizeof (*sqp));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy return (set_errno(error));
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy}
299625c6492013aa7bd163862f0d181854f69b3cSebastien Roy