fixes r7363, r7356, r7352 from trunk

This commit is contained in:
Ben Gras 2010-06-18 13:54:30 +00:00
parent 2ec255bb5e
commit f4499bd4a0
4 changed files with 17 additions and 21 deletions

View File

@ -79,6 +79,7 @@ PUBLIC int do_procstat()
if (m_in.stat_nr == SELF) { if (m_in.stat_nr == SELF) {
mp->mp_reply.sig_set = mp->mp_sigpending; mp->mp_reply.sig_set = mp->mp_sigpending;
sigemptyset(&mp->mp_sigpending); sigemptyset(&mp->mp_sigpending);
sigemptyset(&mp->mp_ksigpending);
} }
else { else {
return(ENOSYS); return(ENOSYS);

View File

@ -41,6 +41,7 @@ EXTERN struct mproc {
sigset_t mp_sigmask; /* signals to be blocked */ sigset_t mp_sigmask; /* signals to be blocked */
sigset_t mp_sigmask2; /* saved copy of mp_sigmask */ sigset_t mp_sigmask2; /* saved copy of mp_sigmask */
sigset_t mp_sigpending; /* pending signals to be handled */ sigset_t mp_sigpending; /* pending signals to be handled */
sigset_t mp_ksigpending; /* bitmap for pending signals from the kernel */
sigset_t mp_sigtrace; /* signals to hand to tracer first */ sigset_t mp_sigtrace; /* signals to hand to tracer first */
struct sigaction mp_sigact[_NSIG]; /* as in sigaction(2) */ struct sigaction mp_sigact[_NSIG]; /* as in sigaction(2) */
vir_bytes mp_sigreturn; /* address of C library __sigreturn function */ vir_bytes mp_sigreturn; /* address of C library __sigreturn function */

View File

@ -67,6 +67,7 @@ PUBLIC int do_sigaction()
if (svec.sa_handler == SIG_IGN) { if (svec.sa_handler == SIG_IGN) {
sigaddset(&mp->mp_ignore, m_in.sig_nr); sigaddset(&mp->mp_ignore, m_in.sig_nr);
sigdelset(&mp->mp_sigpending, m_in.sig_nr); sigdelset(&mp->mp_sigpending, m_in.sig_nr);
sigdelset(&mp->mp_ksigpending, m_in.sig_nr);
sigdelset(&mp->mp_catch, m_in.sig_nr); sigdelset(&mp->mp_catch, m_in.sig_nr);
} else if (svec.sa_handler == SIG_DFL) { } else if (svec.sa_handler == SIG_DFL) {
sigdelset(&mp->mp_ignore, m_in.sig_nr); sigdelset(&mp->mp_ignore, m_in.sig_nr);
@ -347,6 +348,7 @@ int ksig; /* non-zero means signal comes from kernel */
if (rmp->mp_flags & FS_CALL) { if (rmp->mp_flags & FS_CALL) {
sigaddset(&rmp->mp_sigpending, signo); sigaddset(&rmp->mp_sigpending, signo);
if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
if (!(rmp->mp_flags & PM_SIG_PENDING)) { if (!(rmp->mp_flags & PM_SIG_PENDING)) {
/* No delay calls: FS_CALL implies the process called us. */ /* No delay calls: FS_CALL implies the process called us. */
@ -361,6 +363,11 @@ int ksig; /* non-zero means signal comes from kernel */
/* Handle system signals for system processes first. */ /* Handle system signals for system processes first. */
if(rmp->mp_flags & PRIV_PROC) { if(rmp->mp_flags & PRIV_PROC) {
/* Always skip signals for PM (only necessary when broadcasting). */
if(rmp->mp_endpoint == PM_PROC_NR) {
return;
}
/* System signals have always to go through the kernel first to let it /* System signals have always to go through the kernel first to let it
* pick the right signal manager. If PM is the assigned signal manager, * pick the right signal manager. If PM is the assigned signal manager,
* the signal will come back and will actually be processed. * the signal will come back and will actually be processed.
@ -370,11 +377,6 @@ int ksig; /* non-zero means signal comes from kernel */
return; return;
} }
/* Always skip signals for PM (only necessary when broadcasting). */
if(rmp->mp_endpoint == PM_PROC_NR) {
return;
}
/* Print stacktrace if necessary. */ /* Print stacktrace if necessary. */
if(SIGS_IS_STACKTRACE(signo)) { if(SIGS_IS_STACKTRACE(signo)) {
sys_sysctl_stacktrace(rmp->mp_endpoint); sys_sysctl_stacktrace(rmp->mp_endpoint);
@ -406,6 +408,7 @@ int ksig; /* non-zero means signal comes from kernel */
if (!badignore && sigismember(&rmp->mp_sigmask, signo)) { if (!badignore && sigismember(&rmp->mp_sigmask, signo)) {
/* Signal should be blocked. */ /* Signal should be blocked. */
sigaddset(&rmp->mp_sigpending, signo); sigaddset(&rmp->mp_sigpending, signo);
if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
return; return;
} }
@ -415,6 +418,7 @@ int ksig; /* non-zero means signal comes from kernel */
* will be delivered using the check_pending() calls in do_trace(). * will be delivered using the check_pending() calls in do_trace().
*/ */
sigaddset(&rmp->mp_sigpending, signo); sigaddset(&rmp->mp_sigpending, signo);
if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
return; return;
} }
if (!badignore && sigismember(&rmp->mp_catch, signo)) { if (!badignore && sigismember(&rmp->mp_catch, signo)) {
@ -428,6 +432,7 @@ int ksig; /* non-zero means signal comes from kernel */
if (!(rmp->mp_flags & UNPAUSED)) { if (!(rmp->mp_flags & UNPAUSED)) {
/* not yet unpaused; continue later */ /* not yet unpaused; continue later */
sigaddset(&rmp->mp_sigpending, signo); sigaddset(&rmp->mp_sigpending, signo);
if(ksig) sigaddset(&rmp->mp_ksigpending, signo);
return; return;
} }
@ -564,12 +569,15 @@ register struct mproc *rmp;
*/ */
int i; int i;
int ksig;
for (i = 1; i < _NSIG; i++) { for (i = 1; i < _NSIG; i++) {
if (sigismember(&rmp->mp_sigpending, i) && if (sigismember(&rmp->mp_sigpending, i) &&
!sigismember(&rmp->mp_sigmask, i)) { !sigismember(&rmp->mp_sigmask, i)) {
ksig = sigismember(&rmp->mp_ksigpending, i);
sigdelset(&rmp->mp_sigpending, i); sigdelset(&rmp->mp_sigpending, i);
sig_proc(rmp, i, FALSE /*trace*/, FALSE /* ksig */); sigdelset(&rmp->mp_ksigpending, i);
sig_proc(rmp, i, FALSE /*trace*/, ksig);
if (rmp->mp_flags & FS_CALL) if (rmp->mp_flags & FS_CALL)
break; break;
@ -711,6 +719,7 @@ int signo; /* signal to send to process (1 to _NSIG-1) */
rmp->mp_sigact[signo].sa_handler = SIG_DFL; rmp->mp_sigact[signo].sa_handler = SIG_DFL;
} }
sigdelset(&rmp->mp_sigpending, signo); sigdelset(&rmp->mp_sigpending, signo);
sigdelset(&rmp->mp_ksigpending, signo);
if(vm_push_sig(rmp->mp_endpoint, &cur_sp) != OK) if(vm_push_sig(rmp->mp_endpoint, &cur_sp) != OK)
return(FALSE); return(FALSE);

View File

@ -559,21 +559,6 @@ PUBLIC void pb_unreferenced(struct vir_region *region, struct phys_region *pr)
panic("strange phys flags"); panic("strange phys flags");
} }
SLABFREE(pb); SLABFREE(pb);
} else {
struct phys_region *others;
int n = 0;
for(others = pb->firstregion; others;
others = others->next_ph_list) {
if(WRITABLE(region, others->ph)) {
if(map_ph_writept(others->parent->parent,
others->parent, others) != OK) {
printf("VM: map_ph_writept failed unexpectedly\n");
}
}
n++;
}
assert(n == pb->refcount);
} }
} }