summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-12-19 11:31:28 +0000
committerkib <kib@FreeBSD.org>2009-12-19 11:31:28 +0000
commitd1f389d774670bd276da5e368fad88de21804cbb (patch)
treea7a50fa26b834316b071d799b764950c08018610 /sys/i386
parent523dfc4a2c6f06061212a6dd67e528c49b58f04a (diff)
downloadFreeBSD-src-d1f389d774670bd276da5e368fad88de21804cbb.zip
FreeBSD-src-d1f389d774670bd276da5e368fad88de21804cbb.tar.gz
MFC r198507:
Use kern_sigprocmask() instead of direct manipulation of td_sigmask to reschedule newly blocked signals. MFC r198590: Trapsignal() calls kern_sigprocmask() when delivering catched signal with proc lock held. MFC r198670: For trapsignal() and postsig(), kern_sigprocmask() is called with both process lock and curproc->p_sigacts->ps_mtx locked. Prevent lock recursion on ps_mtx in reschedule_signals().
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/machdep.c27
-rw-r--r--sys/i386/linux/linux_sysvec.c18
2 files changed, 12 insertions, 33 deletions
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 67a64c9..801af7c 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -756,7 +756,6 @@ osigreturn(td, uap)
struct osigcontext sc;
struct trapframe *regs;
struct osigcontext *scp;
- struct proc *p = td->td_proc;
int eflags, error;
ksiginfo_t ksi;
@@ -856,17 +855,14 @@ osigreturn(td, uap)
regs->tf_eip = scp->sc_pc;
regs->tf_eflags = eflags;
- PROC_LOCK(p);
#if defined(COMPAT_43)
if (scp->sc_onstack & 1)
td->td_sigstk.ss_flags |= SS_ONSTACK;
else
td->td_sigstk.ss_flags &= ~SS_ONSTACK;
#endif
- SIGSETOLD(td->td_sigmask, scp->sc_mask);
- SIG_CANTMASK(td->td_sigmask);
- signotify(td);
- PROC_UNLOCK(p);
+ kern_sigprocmask(td, SIG_SETMASK, (sigset_t *)&scp->sc_mask, NULL,
+ SIGPROCMASK_OLD);
return (EJUSTRETURN);
}
#endif /* COMPAT_43 */
@@ -883,9 +879,8 @@ freebsd4_sigreturn(td, uap)
} */ *uap;
{
struct ucontext4 uc;
- struct proc *p = td->td_proc;
struct trapframe *regs;
- const struct ucontext4 *ucp;
+ struct ucontext4 *ucp;
int cs, eflags, error;
ksiginfo_t ksi;
@@ -973,18 +968,13 @@ freebsd4_sigreturn(td, uap)
bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
}
- PROC_LOCK(p);
#if defined(COMPAT_43)
if (ucp->uc_mcontext.mc_onstack & 1)
td->td_sigstk.ss_flags |= SS_ONSTACK;
else
td->td_sigstk.ss_flags &= ~SS_ONSTACK;
#endif
-
- td->td_sigmask = ucp->uc_sigmask;
- SIG_CANTMASK(td->td_sigmask);
- signotify(td);
- PROC_UNLOCK(p);
+ kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0);
return (EJUSTRETURN);
}
#endif /* COMPAT_FREEBSD4 */
@@ -1000,9 +990,8 @@ sigreturn(td, uap)
} */ *uap;
{
ucontext_t uc;
- struct proc *p = td->td_proc;
struct trapframe *regs;
- const ucontext_t *ucp;
+ ucontext_t *ucp;
int cs, eflags, error, ret;
ksiginfo_t ksi;
@@ -1094,7 +1083,6 @@ sigreturn(td, uap)
bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
}
- PROC_LOCK(p);
#if defined(COMPAT_43)
if (ucp->uc_mcontext.mc_onstack & 1)
td->td_sigstk.ss_flags |= SS_ONSTACK;
@@ -1102,10 +1090,7 @@ sigreturn(td, uap)
td->td_sigstk.ss_flags &= ~SS_ONSTACK;
#endif
- td->td_sigmask = ucp->uc_sigmask;
- SIG_CANTMASK(td->td_sigmask);
- signotify(td);
- PROC_UNLOCK(p);
+ kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0);
return (EJUSTRETURN);
}
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index d07f655..069b5bb 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -667,10 +667,10 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
int
linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args)
{
- struct proc *p = td->td_proc;
struct l_sigframe frame;
struct trapframe *regs;
l_sigset_t lmask;
+ sigset_t bmask;
int eflags, i;
ksiginfo_t ksi;
@@ -725,11 +725,8 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args)
lmask.__bits[0] = frame.sf_sc.sc_mask;
for (i = 0; i < (LINUX_NSIG_WORDS-1); i++)
lmask.__bits[i+1] = frame.sf_extramask[i];
- PROC_LOCK(p);
- linux_to_bsd_sigset(&lmask, &td->td_sigmask);
- SIG_CANTMASK(td->td_sigmask);
- signotify(td);
- PROC_UNLOCK(p);
+ linux_to_bsd_sigset(&lmask, &bmask);
+ kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0);
/*
* Restore signal context.
@@ -767,9 +764,9 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args)
int
linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
{
- struct proc *p = td->td_proc;
struct l_ucontext uc;
struct l_sigcontext *context;
+ sigset_t bmask;
l_stack_t *lss;
stack_t ss;
struct trapframe *regs;
@@ -826,11 +823,8 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
return(EINVAL);
}
- PROC_LOCK(p);
- linux_to_bsd_sigset(&uc.uc_sigmask, &td->td_sigmask);
- SIG_CANTMASK(td->td_sigmask);
- signotify(td);
- PROC_UNLOCK(p);
+ linux_to_bsd_sigset(&uc.uc_sigmask, &bmask);
+ kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0);
/*
* Restore signal context
OpenPOWER on IntegriCloud