aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorBrian Gerst <brgerst@gmail.com>2009-12-09 19:01:53 -0500
committerH. Peter Anvin <hpa@zytor.com>2009-12-09 19:28:34 -0500
commit11cf88bd0b8165b65aaabaee0977e9a3ad474ab7 (patch)
tree33e74a88baf24ee971282ded562b78db40749bb9 /arch/x86/kernel
parent27f59559d63375a4d59e7c720a439d9f0b47edad (diff)
x86: Merge sys_execve
Change 32-bit sys_execve to PTREGSCALL3, and merge with 64-bit. Signed-off-by: Brian Gerst <brgerst@gmail.com> LKML-Reference: <1260403316-5679-4-git-send-email-brgerst@gmail.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/entry_32.S2
-rw-r--r--arch/x86/kernel/process.c26
-rw-r--r--arch/x86/kernel/process_32.c25
-rw-r--r--arch/x86/kernel/process_64.c19
4 files changed, 27 insertions, 45 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
index ab7fcef37453..a96a0d8a0fdb 100644
--- a/arch/x86/kernel/entry_32.S
+++ b/arch/x86/kernel/entry_32.S
@@ -762,7 +762,7 @@ PTREGSCALL1(iopl)
762PTREGSCALL0(fork) 762PTREGSCALL0(fork)
763PTREGSCALL0(clone) 763PTREGSCALL0(clone)
764PTREGSCALL0(vfork) 764PTREGSCALL0(vfork)
765PTREGSCALL0(execve) 765PTREGSCALL3(execve)
766PTREGSCALL0(sigaltstack) 766PTREGSCALL0(sigaltstack)
767PTREGSCALL0(sigreturn) 767PTREGSCALL0(sigreturn)
768PTREGSCALL0(rt_sigreturn) 768PTREGSCALL0(rt_sigreturn)
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 5e2ba634ea15..bb17bd9334fb 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -236,6 +236,32 @@ int sys_vfork(struct pt_regs *regs)
236 236
237 237
238/* 238/*
239 * sys_execve() executes a new program.
240 */
241long sys_execve(char __user *name, char __user * __user *argv,
242 char __user * __user *envp, struct pt_regs *regs)
243{
244 long error;
245 char *filename;
246
247 filename = getname(name);
248 error = PTR_ERR(filename);
249 if (IS_ERR(filename))
250 return error;
251 error = do_execve(filename, argv, envp, regs);
252
253#ifdef CONFIG_X86_32
254 if (error == 0) {
255 /* Make sure we don't return using sysenter.. */
256 set_thread_flag(TIF_IRET);
257 }
258#endif
259
260 putname(filename);
261 return error;
262}
263
264/*
239 * Idle related variables and functions 265 * Idle related variables and functions
240 */ 266 */
241unsigned long boot_option_idle_override = 0; 267unsigned long boot_option_idle_override = 0;
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 075580b35682..486e38e2900b 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -451,31 +451,6 @@ int sys_clone(struct pt_regs *regs)
451 return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); 451 return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
452} 452}
453 453
454/*
455 * sys_execve() executes a new program.
456 */
457int sys_execve(struct pt_regs *regs)
458{
459 int error;
460 char *filename;
461
462 filename = getname((char __user *) regs->bx);
463 error = PTR_ERR(filename);
464 if (IS_ERR(filename))
465 goto out;
466 error = do_execve(filename,
467 (char __user * __user *) regs->cx,
468 (char __user * __user *) regs->dx,
469 regs);
470 if (error == 0) {
471 /* Make sure we don't return using sysenter.. */
472 set_thread_flag(TIF_IRET);
473 }
474 putname(filename);
475out:
476 return error;
477}
478
479#define top_esp (THREAD_SIZE - sizeof(unsigned long)) 454#define top_esp (THREAD_SIZE - sizeof(unsigned long))
480#define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long)) 455#define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long))
481 456
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index c95c8f4e790a..671960d82587 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -520,25 +520,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
520 return prev_p; 520 return prev_p;
521} 521}
522 522
523/*
524 * sys_execve() executes a new program.
525 */
526asmlinkage
527long sys_execve(char __user *name, char __user * __user *argv,
528 char __user * __user *envp, struct pt_regs *regs)
529{
530 long error;
531 char *filename;
532
533 filename = getname(name);
534 error = PTR_ERR(filename);
535 if (IS_ERR(filename))
536 return error;
537 error = do_execve(filename, argv, envp, regs);
538 putname(filename);
539 return error;
540}
541
542void set_personality_64bit(void) 523void set_personality_64bit(void)
543{ 524{
544 /* inherit personality from parent */ 525 /* inherit personality from parent */