repair signal implementation.
- can not interrupt syscall - can not recieve SIGKILL
This commit is contained in:
@ -747,7 +747,10 @@ 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));
|
||||||
list_add_tail(&pending->list, head);
|
if(sig == SIGKILL || sig == SIGSTOP)
|
||||||
|
list_add(&pending->list, head);
|
||||||
|
else
|
||||||
|
list_add_tail(&pending->list, head);
|
||||||
tproc->sigevent = 1;
|
tproc->sigevent = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -759,57 +762,35 @@ do_kill(int pid, int tid, int sig, siginfo_t *info)
|
|||||||
ihk_mc_spinlock_unlock_noirq(&tproc->sigpendinglock);
|
ihk_mc_spinlock_unlock_noirq(&tproc->sigpendinglock);
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
if (proc != tproc) {
|
||||||
default:
|
dkprintf("do_kill,ipi,pid=%d,cpu_id=%d\n",
|
||||||
if(proc != tproc){
|
tproc->ftn->pid, tproc->cpu_id);
|
||||||
dkprintf("do_kill,ipi,pid=%d,cpu_id=%d\n",
|
ihk_mc_interrupt_cpu(get_x86_cpu_local_variable(tproc->cpu_id)->apic_id, 0xd0);
|
||||||
tproc->ftn->pid, tproc->cpu_id);
|
|
||||||
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);
|
||||||
|
|
||||||
switch(sig) {
|
if (status != PS_RUNNING) {
|
||||||
case SIGKILL:
|
switch(sig) {
|
||||||
#if 0
|
case SIGKILL:
|
||||||
/* Is this really needed? */
|
/* Wake up the target only when stopped by ptrace-reporting */
|
||||||
kprintf("do_kill,sending kill to mcexec,pid=%d,cpuid=%d\n",
|
sched_wakeup_process(tproc, PS_TRACED | PS_STOPPED);
|
||||||
tproc->pid, tproc->cpu_id);
|
break;
|
||||||
interrupt_syscall(tproc->pid, tproc->cpu_id);
|
case SIGCONT:
|
||||||
#endif
|
/* Wake up the target only when stopped by SIGSTOP */
|
||||||
/* Wake up the target only when stopped by ptrace-reporting */
|
sched_wakeup_process(tproc, PS_STOPPED);
|
||||||
sched_wakeup_process(tproc, PS_TRACED);
|
break;
|
||||||
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;
|
|
||||||
case SIGCONT:
|
|
||||||
/* Wake up the target only when stopped by SIGSTOP */
|
|
||||||
sched_wakeup_process(tproc, PS_STOPPED);
|
|
||||||
ihk_mc_spinlock_lock_noirq(&tproc->ftn->lock);
|
|
||||||
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 {
|
||||||
ihk_mc_spinlock_unlock_noirq(savelock);
|
ihk_mc_spinlock_unlock_noirq(savelock);
|
||||||
cpu_restore_interrupt(irqstate);
|
cpu_restore_interrupt(irqstate);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user