|
@@ -1064,26 +1064,13 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
|
|
|
regs, 0, NULL, NULL);
|
|
|
}
|
|
|
|
|
|
-int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
|
|
|
- unsigned long a3, unsigned long a4, unsigned long a5,
|
|
|
- struct pt_regs *regs)
|
|
|
+void __ret_from_kernel_execve(struct pt_regs *normal)
|
|
|
+__noreturn;
|
|
|
+
|
|
|
+void ret_from_kernel_execve(struct pt_regs *normal)
|
|
|
{
|
|
|
- int error;
|
|
|
- char *filename;
|
|
|
-
|
|
|
- filename = getname((const char __user *) a0);
|
|
|
- error = PTR_ERR(filename);
|
|
|
- if (IS_ERR(filename))
|
|
|
- goto out;
|
|
|
- flush_fp_to_thread(current);
|
|
|
- flush_altivec_to_thread(current);
|
|
|
- flush_spe_to_thread(current);
|
|
|
- error = do_execve(filename,
|
|
|
- (const char __user *const __user *) a1,
|
|
|
- (const char __user *const __user *) a2, regs);
|
|
|
- putname(filename);
|
|
|
-out:
|
|
|
- return error;
|
|
|
+ set_thread_flag(TIF_RESTOREALL);
|
|
|
+ __ret_from_kernel_execve(normal);
|
|
|
}
|
|
|
|
|
|
static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
|