repair signal implementation.

- can not interrupt syscall
- can not recieve SIGKILL
This commit is contained in:
Tomoki Shirasawa
2014-10-31 16:34:59 +09:00
parent 3fe7e39607
commit c4e0b84792

View File

@@ -747,6 +747,9 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
else{ else{
pending->sigmask.__val[0] = mask; pending->sigmask.__val[0] = mask;
memcpy(&pending->info, info, sizeof(siginfo_t)); memcpy(&pending->info, info, sizeof(siginfo_t));
if(sig == SIGKILL || sig == SIGSTOP)
list_add(&pending->list, head);
else
list_add_tail(&pending->list, head); list_add_tail(&pending->list, head);
tproc->sigevent = 1; tproc->sigevent = 1;
} }
@@ -760,53 +763,31 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
} }
if (doint && !(mask & tproc->sigmask.__val[0])) { if (doint && !(mask & tproc->sigmask.__val[0])) {
switch(sig) { int cpuid = tproc->cpu_id;
case SIGKILL: int pid = tproc->ftn->pid;
case SIGCONT: int status = tproc->ftn->status;
break;
case SIGSTOP:
default:
if (proc != tproc) { if (proc != tproc) {
dkprintf("do_kill,ipi,pid=%d,cpu_id=%d\n", dkprintf("do_kill,ipi,pid=%d,cpu_id=%d\n",
tproc->ftn->pid, tproc->cpu_id); tproc->ftn->pid, tproc->cpu_id);
ihk_mc_interrupt_cpu(get_x86_cpu_local_variable(tproc->cpu_id)->apic_id, 0xd0); ihk_mc_interrupt_cpu(get_x86_cpu_local_variable(tproc->cpu_id)->apic_id, 0xd0);
} }
break;
}
ihk_mc_spinlock_unlock_noirq(savelock); ihk_mc_spinlock_unlock_noirq(savelock);
cpu_restore_interrupt(irqstate); cpu_restore_interrupt(irqstate);
interrupt_syscall(pid, cpuid);
if (status != PS_RUNNING) {
switch(sig) { switch(sig) {
case SIGKILL: case SIGKILL:
#if 0
/* Is this really needed? */
kprintf("do_kill,sending kill to mcexec,pid=%d,cpuid=%d\n",
tproc->pid, tproc->cpu_id);
interrupt_syscall(tproc->pid, tproc->cpu_id);
#endif
/* Wake up the target only when stopped by ptrace-reporting */ /* Wake up the target only when stopped by ptrace-reporting */
sched_wakeup_process(tproc, PS_TRACED); sched_wakeup_process(tproc, PS_TRACED | PS_STOPPED);
ihk_mc_spinlock_lock_noirq(&tproc->ftn->lock);
if (tproc->ftn->status & PS_TRACED) {
xchg4((int *)(&tproc->ftn->status), PS_RUNNING);
}
ihk_mc_spinlock_unlock_noirq(&tproc->ftn->lock);
break; break;
case SIGCONT: case SIGCONT:
/* Wake up the target only when stopped by SIGSTOP */ /* Wake up the target only when stopped by SIGSTOP */
sched_wakeup_process(tproc, PS_STOPPED); sched_wakeup_process(tproc, PS_STOPPED);
ihk_mc_spinlock_lock_noirq(&tproc->ftn->lock); break;
if (tproc->ftn->status & PS_STOPPED) {
xchg4((int *)(&tproc->ftn->status), PS_RUNNING);
/* Reap and set singal_flags */
tproc->ftn->signal_flags = SIGNAL_STOP_CONTINUED;
} }
ihk_mc_spinlock_unlock_noirq(&tproc->ftn->lock);
break;
case SIGSTOP:
default:
break;
} }
} }
else { else {