2006-07-10 15:45:13 +04:00
/*
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 2000 , 2001 Jeff Dike ( jdike @ karaya . com )
* Licensed under the GPL
*/
# include "linux/slab.h"
# include "linux/smp_lock.h"
# include "linux/ptrace.h"
# include "asm/ptrace.h"
# include "asm/pgtable.h"
# include "asm/tlbflush.h"
# include "asm/uaccess.h"
# include "user_util.h"
# include "kern_util.h"
# include "mem_user.h"
# include "kern.h"
# include "irq_user.h"
# include "tlb.h"
# include "os.h"
# include "choose-mode.h"
# include "mode_kern.h"
void flush_thread ( void )
{
2006-03-31 14:30:22 +04:00
arch_flush_thread ( & current - > thread . arch ) ;
2005-04-17 02:20:36 +04:00
CHOOSE_MODE ( flush_thread_tt ( ) , flush_thread_skas ( ) ) ;
}
void start_thread ( struct pt_regs * regs , unsigned long eip , unsigned long esp )
{
CHOOSE_MODE_PROC ( start_thread_tt , start_thread_skas , regs , eip , esp ) ;
}
2006-07-10 15:45:13 +04:00
# ifdef CONFIG_TTY_LOG
extern void log_exec ( char * * argv , void * tty ) ;
# endif
2005-04-17 02:20:36 +04:00
static long execve1 ( char * file , char __user * __user * argv ,
2006-02-01 14:06:29 +03:00
char __user * __user * env )
2005-04-17 02:20:36 +04:00
{
long error ;
2006-12-08 13:36:04 +03:00
struct tty_struct * tty ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_TTY_LOG
2006-09-26 10:33:08 +04:00
mutex_lock ( & tty_mutex ) ;
2006-12-08 13:36:04 +03:00
tty = get_current_tty ( ) ;
if ( tty )
log_exec ( argv , tty ) ;
2006-09-26 10:33:08 +04:00
mutex_unlock ( & tty_mutex ) ;
2005-04-17 02:20:36 +04:00
# endif
error = do_execve ( file , argv , env , & current - > thread . regs ) ;
if ( error = = 0 ) {
task_lock ( current ) ;
current - > ptrace & = ~ PT_DTRACE ;
2006-07-10 15:45:13 +04:00
# ifdef SUBARCH_EXECVE1
SUBARCH_EXECVE1 ( & current - > thread . regs . regs ) ;
# endif
2005-04-17 02:20:36 +04:00
task_unlock ( current ) ;
set_cmdline ( current_cmd ( ) ) ;
}
return ( error ) ;
}
long um_execve ( char * file , char __user * __user * argv , char __user * __user * env )
{
long err ;
err = execve1 ( file , argv , env ) ;
if ( ! err )
do_longjmp ( current - > thread . exec_buf , 1 ) ;
return ( err ) ;
}
2006-03-31 14:30:15 +04:00
long sys_execve ( char __user * file , char __user * __user * argv ,
2005-04-17 02:20:36 +04:00
char __user * __user * env )
{
long error ;
char * filename ;
lock_kernel ( ) ;
2006-03-31 14:30:15 +04:00
filename = getname ( file ) ;
2005-04-17 02:20:36 +04:00
error = PTR_ERR ( filename ) ;
if ( IS_ERR ( filename ) ) goto out ;
error = execve1 ( filename , argv , env ) ;
putname ( filename ) ;
out :
unlock_kernel ( ) ;
return ( error ) ;
}