diff options
| author | Brian Gerst <brgerst@gmail.com> | 2009-12-09 19:01:56 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2009-12-09 19:29:42 -0500 |
| commit | f839bbc5c81b1c92ff8e81c360e9564f7b961b2e (patch) | |
| tree | 038fef1b902db9ec43b1ab6b82861ebf2d56eef5 /arch/x86/kernel | |
| parent | f1382f157fb1175bba008abad0907310a1e459ce (diff) | |
x86: Merge sys_clone
Change 32-bit sys_clone to new PTREGSCALL stub, and merge with 64-bit.
Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1260403316-5679-7-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.S | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/process.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/process_32.c | 15 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 9 |
4 files changed, 22 insertions, 25 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 6c2f25d9b9d5..6492555d123d 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -760,7 +760,6 @@ ptregs_##name: \ | |||
| 760 | 760 | ||
| 761 | PTREGSCALL1(iopl) | 761 | PTREGSCALL1(iopl) |
| 762 | PTREGSCALL0(fork) | 762 | PTREGSCALL0(fork) |
| 763 | PTREGSCALL0(clone) | ||
| 764 | PTREGSCALL0(vfork) | 763 | PTREGSCALL0(vfork) |
| 765 | PTREGSCALL3(execve) | 764 | PTREGSCALL3(execve) |
| 766 | PTREGSCALL2(sigaltstack) | 765 | PTREGSCALL2(sigaltstack) |
| @@ -769,6 +768,19 @@ PTREGSCALL0(rt_sigreturn) | |||
| 769 | PTREGSCALL2(vm86) | 768 | PTREGSCALL2(vm86) |
| 770 | PTREGSCALL1(vm86old) | 769 | PTREGSCALL1(vm86old) |
| 771 | 770 | ||
| 771 | /* Clone is an oddball. The 4th arg is in %edi */ | ||
| 772 | ALIGN; | ||
| 773 | ptregs_clone: | ||
| 774 | leal 4(%esp),%eax | ||
| 775 | pushl %eax | ||
| 776 | pushl PT_EDI(%eax) | ||
| 777 | movl PT_EDX(%eax),%ecx | ||
| 778 | movl PT_ECX(%eax),%edx | ||
| 779 | movl PT_EBX(%eax),%eax | ||
| 780 | call sys_clone | ||
| 781 | addl $8,%esp | ||
| 782 | ret | ||
| 783 | |||
| 772 | .macro FIXUP_ESPFIX_STACK | 784 | .macro FIXUP_ESPFIX_STACK |
| 773 | /* | 785 | /* |
| 774 | * Switch back for ESPFIX stack to the normal zerobased stack | 786 | * Switch back for ESPFIX stack to the normal zerobased stack |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index bb17bd9334fb..f3c1a6b3a65e 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -234,6 +234,15 @@ int sys_vfork(struct pt_regs *regs) | |||
| 234 | NULL, NULL); | 234 | NULL, NULL); |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | long | ||
| 238 | sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
| 239 | void __user *parent_tid, void __user *child_tid, struct pt_regs *regs) | ||
| 240 | { | ||
| 241 | if (!newsp) | ||
| 242 | newsp = regs->sp; | ||
| 243 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); | ||
| 244 | } | ||
| 245 | |||
| 237 | 246 | ||
| 238 | /* | 247 | /* |
| 239 | * sys_execve() executes a new program. | 248 | * sys_execve() executes a new program. |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 486e38e2900b..506d5a7ba17c 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -436,21 +436,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 436 | return prev_p; | 436 | return prev_p; |
| 437 | } | 437 | } |
| 438 | 438 | ||
| 439 | int sys_clone(struct pt_regs *regs) | ||
| 440 | { | ||
| 441 | unsigned long clone_flags; | ||
| 442 | unsigned long newsp; | ||
| 443 | int __user *parent_tidptr, *child_tidptr; | ||
| 444 | |||
| 445 | clone_flags = regs->bx; | ||
| 446 | newsp = regs->cx; | ||
| 447 | parent_tidptr = (int __user *)regs->dx; | ||
| 448 | child_tidptr = (int __user *)regs->di; | ||
| 449 | if (!newsp) | ||
| 450 | newsp = regs->sp; | ||
| 451 | return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); | ||
| 452 | } | ||
| 453 | |||
| 454 | #define top_esp (THREAD_SIZE - sizeof(unsigned long)) | 439 | #define top_esp (THREAD_SIZE - sizeof(unsigned long)) |
| 455 | #define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long)) | 440 | #define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long)) |
| 456 | 441 | ||
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 671960d82587..83019f94b83d 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -534,15 +534,6 @@ void set_personality_64bit(void) | |||
| 534 | current->personality &= ~READ_IMPLIES_EXEC; | 534 | current->personality &= ~READ_IMPLIES_EXEC; |
| 535 | } | 535 | } |
| 536 | 536 | ||
| 537 | asmlinkage long | ||
| 538 | sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
| 539 | void __user *parent_tid, void __user *child_tid, struct pt_regs *regs) | ||
| 540 | { | ||
| 541 | if (!newsp) | ||
| 542 | newsp = regs->sp; | ||
| 543 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); | ||
| 544 | } | ||
| 545 | |||
| 546 | unsigned long get_wchan(struct task_struct *p) | 537 | unsigned long get_wchan(struct task_struct *p) |
| 547 | { | 538 | { |
| 548 | unsigned long stack; | 539 | unsigned long stack; |
