support sigaltstack

This commit is contained in:
Tomoki Shirasawa
2014-06-25 13:45:33 +09:00
parent bbb7f77706
commit 770eae0186
5 changed files with 59 additions and 25 deletions

View File

@@ -173,7 +173,7 @@ struct process {
int tid;
volatile int sigevent;
sigset_t sigmask;
sigset_t supmask;
stack_t sigstack;
ihk_spinlock_t sigpendinglock;
struct list_head sigpending;
struct sig_shared *sigshared;

View File

@@ -148,6 +148,10 @@ struct process *create_process(unsigned long user_pc)
ihk_mc_spinlock_init(&proc->sigpendinglock);
INIT_LIST_HEAD(&proc->sigpending);
proc->sigstack.ss_sp = NULL;
proc->sigstack.ss_flags = SS_DISABLE;
proc->sigstack.ss_size = 0;
ihk_mc_init_user_process(&proc->ctx, &proc->uctx,
((char *)proc) +
KERNEL_STACK_NR_PAGES * PAGE_SIZE, user_pc, 0);
@@ -218,7 +222,11 @@ struct process *clone_process(struct process *org, unsigned long pc,
if (clone_flags & CLONE_VM) {
ihk_atomic_inc(&org->vm->refcount);
proc->vm = org->vm;
proc->sigstack.ss_sp = NULL;
proc->sigstack.ss_flags = SS_DISABLE;
proc->sigstack.ss_size = 0;
proc->sighandler = org->sighandler;
ihk_atomic_inc(&org->sighandler->use);

View File

@@ -1424,7 +1424,6 @@ SYSCALL_DECLARE(rt_sigprocmask)
break;
}
}
proc->supmask = proc->sigmask;
ihk_mc_spinlock_unlock(&proc->sighandler->lock, flag);
return 0;
fault:
@@ -1587,15 +1586,28 @@ SYSCALL_DECLARE(sigaltstack)
stack_t *oss = (stack_t *)ihk_mc_syscall_arg1(ctx);
stack_t wss;
memset(&wss, '\0', sizeof wss);
if(oss)
if(copy_to_user(proc, oss, &wss, sizeof wss))
if(copy_to_user(proc, oss, &proc->sigstack, sizeof wss))
return -EFAULT;
if(ss)
if(ss){
if(copy_from_user(proc, &wss, ss, sizeof wss))
return -EFAULT;
if(wss.ss_flags != 0 && wss.ss_flags != SS_DISABLE)
return -EINVAL;
if(wss.ss_flags == SS_DISABLE){
proc->sigstack.ss_sp = NULL;
proc->sigstack.ss_flags = SS_DISABLE;
proc->sigstack.ss_size = 0;
}
else{
if(wss.ss_size < MINSIGSTKSZ)
return -ENOMEM;
return -EOPNOTSUPP;
memcpy(&proc->sigstack, &wss, sizeof wss);
}
}
return 0;
}
SYSCALL_DECLARE(madvise)