2006-07-10 15:45:13 +04:00
/*
2007-10-16 12:27:00 +04:00
* Copyright ( C ) 2000 - 2007 Jeff Dike ( jdike @ { addtoit , linux . intel } . com )
2005-04-17 02:20:36 +04:00
* Licensed under the GPL
*/
# include "linux/file.h"
2007-07-30 02:36:13 +04:00
# include "linux/fs.h"
2007-10-16 12:27:00 +04:00
# include "linux/mm.h"
# include "linux/sched.h"
2005-04-17 02:20:36 +04:00
# include "linux/utsname.h"
2009-12-01 01:37:04 +03:00
# include "linux/syscalls.h"
2007-10-16 12:27:00 +04:00
# include "asm/current.h"
2005-04-17 02:20:36 +04:00
# include "asm/mman.h"
# include "asm/uaccess.h"
2007-10-16 12:27:00 +04:00
# include "asm/unistd.h"
2008-08-18 12:01:47 +04:00
# include "internal.h"
2005-04-17 02:20:36 +04:00
long sys_fork ( void )
{
long ret ;
current - > thread . forking = 1 ;
2005-06-26 01:55:21 +04:00
ret = do_fork ( SIGCHLD , UPT_SP ( & current - > thread . regs . regs ) ,
& current - > thread . regs , 0 , NULL , NULL ) ;
2005-04-17 02:20:36 +04:00
current - > thread . forking = 0 ;
2007-10-16 12:27:00 +04:00
return ret ;
2005-04-17 02:20:36 +04:00
}
long sys_vfork ( void )
{
long ret ;
current - > thread . forking = 1 ;
2005-06-26 01:55:21 +04:00
ret = do_fork ( CLONE_VFORK | CLONE_VM | SIGCHLD ,
UPT_SP ( & current - > thread . regs . regs ) ,
& current - > thread . regs , 0 , NULL , NULL ) ;
2005-04-17 02:20:36 +04:00
current - > thread . forking = 0 ;
2007-10-16 12:27:00 +04:00
return ret ;
2005-04-17 02:20:36 +04:00
}
long old_mmap ( unsigned long addr , unsigned long len ,
unsigned long prot , unsigned long flags ,
unsigned long fd , unsigned long offset )
{
long err = - EINVAL ;
if ( offset & ~ PAGE_MASK )
goto out ;
2009-12-01 01:37:04 +03:00
err = sys_mmap_pgoff ( addr , len , prot , flags , fd , offset > > PAGE_SHIFT ) ;
2005-04-17 02:20:36 +04:00
out :
return err ;
}
2010-08-18 02:52:56 +04:00
int kernel_execve ( const char * filename ,
const char * const argv [ ] ,
const char * const envp [ ] )
2006-10-02 13:18:31 +04:00
{
mm_segment_t fs ;
int ret ;
fs = get_fs ( ) ;
set_fs ( KERNEL_DS ) ;
2010-09-23 00:05:07 +04:00
ret = um_execve ( filename , ( const char __user * const __user * ) argv ,
( const char __user * const __user * ) envp ) ;
2006-10-02 13:18:31 +04:00
set_fs ( fs ) ;
return ret ;
}