diff options
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/process.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 85bd56d44314..96e3ea6b17c7 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -400,11 +400,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, | |||
400 | int err; | 400 | int err; |
401 | 401 | ||
402 | childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1; | 402 | childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1; |
403 | *childregs = *regs; | ||
404 | childregs->eax = 0; | ||
405 | childregs->esp = esp; | ||
406 | |||
407 | p->thread.esp = (unsigned long) childregs; | ||
408 | /* | 403 | /* |
409 | * The below -8 is to reserve 8 bytes on top of the ring0 stack. | 404 | * The below -8 is to reserve 8 bytes on top of the ring0 stack. |
410 | * This is necessary to guarantee that the entire "struct pt_regs" | 405 | * This is necessary to guarantee that the entire "struct pt_regs" |
@@ -415,7 +410,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, | |||
415 | * "struct pt_regs" is possible, but they may contain the | 410 | * "struct pt_regs" is possible, but they may contain the |
416 | * completely wrong values. | 411 | * completely wrong values. |
417 | */ | 412 | */ |
418 | p->thread.esp0 = (unsigned long) (childregs+1) - 8; | 413 | childregs = (struct pt_regs *) ((unsigned long) childregs - 8); |
414 | *childregs = *regs; | ||
415 | childregs->eax = 0; | ||
416 | childregs->esp = esp; | ||
417 | |||
418 | p->thread.esp = (unsigned long) childregs; | ||
419 | p->thread.esp0 = (unsigned long) (childregs+1); | ||
419 | 420 | ||
420 | p->thread.eip = (unsigned long) ret_from_fork; | 421 | p->thread.eip = (unsigned long) ret_from_fork; |
421 | 422 | ||