diff options
Diffstat (limited to 'kernel/compat.c')
| -rw-r--r-- | kernel/compat.c | 72 | 
1 files changed, 26 insertions, 46 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index f4bddb90018..19971d8c729 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -290,8 +290,8 @@ static inline long put_compat_itimerval(struct compat_itimerval __user *o,  		 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));  } -asmlinkage long compat_sys_getitimer(int which, -		struct compat_itimerval __user *it) +COMPAT_SYSCALL_DEFINE2(getitimer, int, which, +		struct compat_itimerval __user *, it)  {  	struct itimerval kit;  	int error; @@ -302,9 +302,9 @@ asmlinkage long compat_sys_getitimer(int which,  	return error;  } -asmlinkage long compat_sys_setitimer(int which, -		struct compat_itimerval __user *in, -		struct compat_itimerval __user *out) +COMPAT_SYSCALL_DEFINE3(setitimer, int, which, +		struct compat_itimerval __user *, in, +		struct compat_itimerval __user *, out)  {  	struct itimerval kin, kout;  	int error; @@ -381,9 +381,9 @@ static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set)  	memcpy(blocked->sig, &set, sizeof(set));  } -asmlinkage long compat_sys_sigprocmask(int how, -				       compat_old_sigset_t __user *nset, -				       compat_old_sigset_t __user *oset) +COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how, +		       compat_old_sigset_t __user *, nset, +		       compat_old_sigset_t __user *, oset)  {  	old_sigset_t old_set, new_set;  	sigset_t new_blocked; @@ -971,7 +971,7 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,  }  void -sigset_from_compat (sigset_t *set, compat_sigset_t *compat) +sigset_from_compat(sigset_t *set, const compat_sigset_t *compat)  {  	switch (_NSIG_WORDS) {  	case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 ); @@ -982,10 +982,20 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)  }  EXPORT_SYMBOL_GPL(sigset_from_compat); -asmlinkage long -compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese, -		struct compat_siginfo __user *uinfo, -		struct compat_timespec __user *uts, compat_size_t sigsetsize) +void +sigset_to_compat(compat_sigset_t *compat, const sigset_t *set) +{ +	switch (_NSIG_WORDS) { +	case 4: compat->sig[7] = (set->sig[3] >> 32); compat->sig[6] = set->sig[3]; +	case 3: compat->sig[5] = (set->sig[2] >> 32); compat->sig[4] = set->sig[2]; +	case 2: compat->sig[3] = (set->sig[1] >> 32); compat->sig[2] = set->sig[1]; +	case 1: compat->sig[1] = (set->sig[0] >> 32); compat->sig[0] = set->sig[0]; +	} +} + +COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese, +		struct compat_siginfo __user *, uinfo, +		struct compat_timespec __user *, uts, compat_size_t, sigsetsize)  {  	compat_sigset_t s32;  	sigset_t s; @@ -1013,18 +1023,6 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,  	}  	return ret; - -} - -asmlinkage long -compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, -			     struct compat_siginfo __user *uinfo) -{ -	siginfo_t info; - -	if (copy_siginfo_from_user32(&info, uinfo)) -		return -EFAULT; -	return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);  }  #ifdef __ARCH_WANT_COMPAT_SYS_TIME @@ -1067,23 +1065,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr)  #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ -#ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND -asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize) -{ -	sigset_t newset; -	compat_sigset_t newset32; - -	/* XXX: Don't preclude handling different sized sigset_t's.  */ -	if (sigsetsize != sizeof(sigset_t)) -		return -EINVAL; - -	if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) -		return -EFAULT; -	sigset_from_compat(&newset, &newset32); -	return sigsuspend(&newset); -} -#endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */ -  asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)  {  	struct timex txc; @@ -1222,9 +1203,9 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info)  	return 0;  } -#ifdef __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL -asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, -						 struct compat_timespec __user *interval) +COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, +		       compat_pid_t, pid, +		       struct compat_timespec __user *, interval)  {  	struct timespec t;  	int ret; @@ -1237,7 +1218,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,  		return -EFAULT;  	return ret;  } -#endif /* __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL */  /*   * Allocate user-space memory for the duration of a single system call,  |