summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-09-06 22:20:41 +0000
committerjhb <jhb@FreeBSD.org>2001-09-06 22:20:41 +0000
commit054237d0bedad367db7ff79d400580da3e2f908f (patch)
tree81a6a9426eb4bd4704877e5d2c62645d4c91f07e /sys
parentfc76d31ce4a861706e4b49312b7a2f88a61bd53d (diff)
downloadFreeBSD-src-054237d0bedad367db7ff79d400580da3e2f908f.zip
FreeBSD-src-054237d0bedad367db7ff79d400580da3e2f908f.tar.gz
Call sendsig() with the proc lock held and return with it held.
Diffstat (limited to 'sys')
-rw-r--r--sys/alpha/alpha/machdep.c6
-rw-r--r--sys/alpha/osf1/osf1_signal.c4
-rw-r--r--sys/amd64/amd64/machdep.c9
-rw-r--r--sys/i386/i386/machdep.c9
-rw-r--r--sys/i386/linux/linux_sysvec.c4
-rw-r--r--sys/i386/svr4/svr4_machdep.c3
-rw-r--r--sys/ia64/ia64/machdep.c4
-rw-r--r--sys/kern/kern_sig.c4
8 files changed, 16 insertions, 27 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index b8cbbf9..3b62476 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -1163,7 +1163,6 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -1216,7 +1215,6 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
frame->tf_regs[FRAME_A1] = (u_int64_t)sip;
else
frame->tf_regs[FRAME_A1] = code;
- PROC_UNLOCK(p);
frame->tf_regs[FRAME_A2] = (u_int64_t)&sip->si_sc;
frame->tf_regs[FRAME_T12] = (u_int64_t)catcher; /* t12 is pv */
alpha_pal_wrusp((unsigned long)sip);
@@ -1232,7 +1230,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
struct sigframe sf, *sfp;
int oonstack, rndfsize;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
#ifdef COMPAT_43
if (SIGISMEMBER(psp->ps_osigset, sig)) {
@@ -1305,7 +1303,6 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -1349,7 +1346,6 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
}
else
frame->tf_regs[FRAME_A1] = code;
- PROC_UNLOCK(p);
frame->tf_regs[FRAME_A2] = (u_int64_t)&(sfp->sf_uc);
frame->tf_regs[FRAME_T12] = (u_int64_t)catcher; /* t12 is pv */
diff --git a/sys/alpha/osf1/osf1_signal.c b/sys/alpha/osf1/osf1_signal.c
index 66aa3a9..b35acad 100644
--- a/sys/alpha/osf1/osf1_signal.c
+++ b/sys/alpha/osf1/osf1_signal.c
@@ -585,7 +585,7 @@ osf1_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
struct sigacts *psp;
p = curproc;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
frame = p->p_frame;
@@ -620,7 +620,6 @@ osf1_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -674,6 +673,7 @@ osf1_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
frame->tf_regs[FRAME_A3] = (u_int64_t)catcher; /* a3 is pv */
frame->tf_regs[FRAME_FLAGS] = 0; /* full restore */
alpha_pal_wrusp((unsigned long)sip);
+ PROC_LOCK(p);
}
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 1df1f2d..e0dade2 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -294,7 +294,7 @@ osendsig(catcher, sig, mask, code)
int oonstack;
p = curproc;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
regs = p->p_frame;
oonstack = sigonstack(regs->tf_esp);
@@ -328,7 +328,6 @@ osendsig(catcher, sig, mask, code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -422,6 +421,7 @@ osendsig(catcher, sig, mask, code)
regs->tf_fs = _udatasel;
load_gs(_udatasel);
regs->tf_ss = _udatasel;
+ PROC_LOCK(p);
}
#endif
@@ -440,11 +440,10 @@ sendsig(catcher, sig, mask, code)
int oonstack;
p = curproc;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
#ifdef COMPAT_43
if (SIGISMEMBER(psp->ps_osigset, sig)) {
- PROC_UNLOCK(p);
osendsig(catcher, sig, mask, code);
return;
}
@@ -494,7 +493,6 @@ sendsig(catcher, sig, mask, code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -574,6 +572,7 @@ sendsig(catcher, sig, mask, code)
regs->tf_es = _udatasel;
regs->tf_fs = _udatasel;
regs->tf_ss = _udatasel;
+ PROC_LOCK(p);
}
/*
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 1df1f2d..e0dade2 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -294,7 +294,7 @@ osendsig(catcher, sig, mask, code)
int oonstack;
p = curproc;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
regs = p->p_frame;
oonstack = sigonstack(regs->tf_esp);
@@ -328,7 +328,6 @@ osendsig(catcher, sig, mask, code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -422,6 +421,7 @@ osendsig(catcher, sig, mask, code)
regs->tf_fs = _udatasel;
load_gs(_udatasel);
regs->tf_ss = _udatasel;
+ PROC_LOCK(p);
}
#endif
@@ -440,11 +440,10 @@ sendsig(catcher, sig, mask, code)
int oonstack;
p = curproc;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
#ifdef COMPAT_43
if (SIGISMEMBER(psp->ps_osigset, sig)) {
- PROC_UNLOCK(p);
osendsig(catcher, sig, mask, code);
return;
}
@@ -494,7 +493,6 @@ sendsig(catcher, sig, mask, code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -574,6 +572,7 @@ sendsig(catcher, sig, mask, code)
regs->tf_es = _udatasel;
regs->tf_fs = _udatasel;
regs->tf_ss = _udatasel;
+ PROC_LOCK(p);
}
/*
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index fbb6d6f..306b411 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -215,6 +215,7 @@ linux_rt_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
struct linux_rt_sigframe *fp, frame;
int oonstack;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
regs = p->p_frame;
oonstack = sigonstack(regs->tf_esp);
@@ -226,7 +227,6 @@ linux_rt_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
/*
* Allocate space for the signal handler context.
*/
- PROC_LOCK(p);
if ((p->p_flag & P_ALTSTACK) && !oonstack &&
SIGISMEMBER(p->p_sigacts->ps_sigonstack, sig)) {
fp = (struct linux_rt_sigframe *)(p->p_sigstk.ss_sp +
@@ -258,7 +258,6 @@ linux_rt_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
fp, oonstack);
#endif
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -343,6 +342,7 @@ linux_rt_sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
regs->tf_es = _udatasel;
regs->tf_fs = _udatasel;
regs->tf_ss = _udatasel;
+ PROC_LOCK(p);
}
diff --git a/sys/i386/svr4/svr4_machdep.c b/sys/i386/svr4/svr4_machdep.c
index 18d50d5..7dc2d47 100644
--- a/sys/i386/svr4/svr4_machdep.c
+++ b/sys/i386/svr4/svr4_machdep.c
@@ -418,7 +418,7 @@ svr4_sendsig(catcher, sig, mask, code)
#if defined(DEBUG_SVR4)
printf("svr4_sendsig(%d)\n", sig);
#endif
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
tf = p->p_frame;
@@ -495,6 +495,7 @@ svr4_sendsig(catcher, sig, mask, code)
tf->tf_fs = _udatasel;
load_gs(_udatasel);
tf->tf_ss = _udatasel;
+ PROC_LOCK(p);
#endif
}
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 3f2365d..da02b6f 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -752,7 +752,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
u_int64_t sbs = 0;
int oonstack, rndfsize;
- PROC_LOCK(p);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
psp = p->p_sigacts;
frame = p->p_frame;
oonstack = sigonstack(frame->tf_r[FRAME_SP]);
@@ -844,7 +844,6 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
psignal(p, SIGILL);
- PROC_UNLOCK(p);
return;
}
@@ -885,7 +884,6 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
}
else
frame->tf_r[FRAME_R15] = code;
- PROC_UNLOCK(p);
frame->tf_r[FRAME_SP] = (u_int64_t)sfp - 16;
frame->tf_r[FRAME_R14] = sig;
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 16d2463..c64af8f 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1153,10 +1153,8 @@ trapsignal(p, sig, code)
ktrpsig(p->p_tracep, sig, ps->ps_sigact[_SIG_IDX(sig)],
&p->p_sigmask, code);
#endif
- PROC_UNLOCK(p); /* XXX ??? */
(*p->p_sysent->sv_sendsig)(ps->ps_sigact[_SIG_IDX(sig)], sig,
&p->p_sigmask, code);
- PROC_LOCK(p);
SIGSETOR(p->p_sigmask, ps->ps_catchmask[_SIG_IDX(sig)]);
if (!SIGISMEMBER(ps->ps_signodefer, sig))
SIGADDSET(p->p_sigmask, sig);
@@ -1693,9 +1691,7 @@ postsig(sig)
p->p_code = 0;
p->p_sig = 0;
}
- PROC_UNLOCK(p);
(*p->p_sysent->sv_sendsig)(action, sig, &returnmask, code);
- PROC_LOCK(p);
}
}
OpenPOWER on IntegriCloud