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