[PATCH] powerpc: task_stack_page()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Al Viro and committed by Linus Torvalds 0cec6fd1 b5e2fc1c

+8 -10
+4 -6
arch/powerpc/kernel/process.c
··· 503 503 { 504 504 struct pt_regs *childregs, *kregs; 505 505 extern void ret_from_fork(void); 506 - unsigned long sp = (unsigned long)p->thread_info + THREAD_SIZE; 506 + unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; 507 507 508 508 CHECK_FULL_REGS(regs); 509 509 /* Copy registers */ ··· 588 588 * set. Do it now. 589 589 */ 590 590 if (!current->thread.regs) { 591 - unsigned long childregs = (unsigned long)current->thread_info + 592 - THREAD_SIZE; 593 - childregs -= sizeof(struct pt_regs); 594 - current->thread.regs = (struct pt_regs *)childregs; 591 + struct pt_regs *regs = task_stack_page(current) + THREAD_SIZE; 592 + current->thread.regs = regs - 1; 595 593 } 596 594 597 595 memset(regs->gpr, 0, sizeof(regs->gpr)); ··· 765 767 static int validate_sp(unsigned long sp, struct task_struct *p, 766 768 unsigned long nbytes) 767 769 { 768 - unsigned long stack_page = (unsigned long)p->thread_info; 770 + unsigned long stack_page = (unsigned long)task_stack_page(p); 769 771 770 772 if (sp >= stack_page + sizeof(struct thread_struct) 771 773 && sp <= stack_page + THREAD_SIZE - nbytes)
+4 -4
arch/ppc/kernel/process.c
··· 482 482 { 483 483 struct pt_regs *childregs, *kregs; 484 484 extern void ret_from_fork(void); 485 - unsigned long sp = (unsigned long)p->thread_info + THREAD_SIZE; 485 + unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; 486 486 unsigned long childframe; 487 487 488 488 CHECK_FULL_REGS(regs); ··· 702 702 sp = tsk->thread.ksp; 703 703 } 704 704 705 - prev_sp = (unsigned long) (tsk->thread_info + 1); 706 - stack_top = (unsigned long) tsk->thread_info + THREAD_SIZE; 705 + prev_sp = (unsigned long) end_of_stack(tsk); 706 + stack_top = (unsigned long) task_stack_page(tsk) + THREAD_SIZE; 707 707 while (count < 16 && sp > prev_sp && sp < stack_top && (sp & 3) == 0) { 708 708 if (count == 0) { 709 709 printk("Call trace:"); ··· 832 832 unsigned long get_wchan(struct task_struct *p) 833 833 { 834 834 unsigned long ip, sp; 835 - unsigned long stack_page = (unsigned long) p->thread_info; 835 + unsigned long stack_page = (unsigned long) task_stack_page(p); 836 836 int count = 0; 837 837 if (!p || p == current || p->state == TASK_RUNNING) 838 838 return 0;