2005-04-17 02:20:36 +04:00
/*
* S390 version
2012-07-20 13:15:04 +04:00
* Copyright IBM Corp . 1999 , 2000
2005-04-17 02:20:36 +04:00
* Author ( s ) : Martin Schwidefsky ( schwidefsky @ de . ibm . com ) ,
* Thomas Spatzier ( tspat @ de . ibm . com )
*
* Derived from " arch/i386/kernel/sys_i386.c "
*
* This file contains various random system calls that
* have a non - standard calling sequence on the Linux / s390
* platform .
*/
# include <linux/errno.h>
# include <linux/sched.h>
# include <linux/mm.h>
2007-07-30 02:36:13 +04:00
# include <linux/fs.h>
2005-04-17 02:20:36 +04:00
# include <linux/smp.h>
# include <linux/sem.h>
# include <linux/msg.h>
# include <linux/shm.h>
# include <linux/stat.h>
# include <linux/syscalls.h>
# include <linux/mman.h>
# include <linux/file.h>
# include <linux/utsname.h>
# include <linux/personality.h>
2006-10-02 13:18:34 +04:00
# include <linux/unistd.h>
2007-10-17 10:29:24 +04:00
# include <linux/ipc.h>
2005-04-17 02:20:36 +04:00
# include <asm/uaccess.h>
2008-04-17 09:46:26 +04:00
# include "entry.h"
2005-04-17 02:20:36 +04:00
/*
2010-03-11 02:21:15 +03:00
* Perform the mmap ( ) system call . Linux for S / 390 isn ' t able to handle more
* than 5 system call parameters , so this system call uses a memory block
* for parameter passing .
2005-04-17 02:20:36 +04:00
*/
2010-03-11 02:21:15 +03:00
struct s390_mmap_arg_struct {
2005-04-17 02:20:36 +04:00
unsigned long addr ;
unsigned long len ;
unsigned long prot ;
unsigned long flags ;
unsigned long fd ;
unsigned long offset ;
} ;
2010-03-11 02:21:15 +03:00
SYSCALL_DEFINE1 ( mmap2 , struct s390_mmap_arg_struct __user * , arg )
2005-04-17 02:20:36 +04:00
{
2010-03-11 02:21:15 +03:00
struct s390_mmap_arg_struct a ;
2005-04-17 02:20:36 +04:00
int error = - EFAULT ;
if ( copy_from_user ( & a , arg , sizeof ( a ) ) )
goto out ;
2009-12-01 01:37:04 +03:00
error = sys_mmap_pgoff ( a . addr , a . len , a . prot , a . flags , a . fd , a . offset ) ;
2005-04-17 02:20:36 +04:00
out :
return error ;
}
/*
2011-12-27 14:27:21 +04:00
* sys_ipc ( ) is the de - multiplexer for the SysV IPC calls .
2005-04-17 02:20:36 +04:00
*/
2010-03-11 02:21:18 +03:00
SYSCALL_DEFINE5 ( s390_ipc , uint , call , int , first , unsigned long , second ,
2009-01-14 16:14:36 +03:00
unsigned long , third , void __user * , ptr )
2005-04-17 02:20:36 +04:00
{
2011-12-27 14:27:21 +04:00
if ( call > > 16 )
return - EINVAL ;
/* The s390 sys_ipc variant has only five parameters instead of six
* like the generic variant . The only difference is the handling of
* the SEMTIMEDOP subcall where on s390 the third parameter is used
* as a pointer to a struct timespec where the generic variant uses
* the fifth parameter .
* Therefore we can call the generic variant by simply passing the
* third parameter also as fifth parameter .
*/
return sys_ipc ( call , first , second , third , ptr , third ) ;
2005-04-17 02:20:36 +04:00
}
2010-08-13 12:06:39 +04:00
SYSCALL_DEFINE1 ( s390_personality , unsigned int , personality )
2005-04-17 02:20:36 +04:00
{
2010-08-13 12:06:39 +04:00
unsigned int ret ;
2005-04-17 02:20:36 +04:00
2012-08-02 11:11:23 +04:00
if ( personality ( current - > personality ) = = PER_LINUX32 & &
personality ( personality ) = = PER_LINUX )
personality | = PER_LINUX32 ;
2005-04-17 02:20:36 +04:00
ret = sys_personality ( personality ) ;
2012-08-02 11:11:23 +04:00
if ( personality ( ret ) = = PER_LINUX32 )
ret & = ~ PER_LINUX32 ;
2005-04-17 02:20:36 +04:00
return ret ;
}