support sigaltstack
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user