summaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/process.c')
-rw-r--r--arch/mips/kernel/process.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index f8b10bdea..08dd13c6c 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -64,16 +64,23 @@ void release_thread(struct task_struct *dead_task)
{
}
+#define roundup(val, rnd) ({ \
+ unsigned _v = val; \
+ unsigned long _r = rnd; \
+ _v = (_v + _r - 1) & ~(_r - 1); \
+ _v; \
+})
+
int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
struct task_struct * p, struct pt_regs * regs)
{
struct pt_regs * childregs;
long childksp;
- childksp = p->kernel_stack_page + KERNEL_STACK_SIZE - 8;
+ childksp = roundup((unsigned long)p, KERNEL_STACK_SIZE) - 8;
/* set up new TSS. */
- childregs = ((struct pt_regs *) (p->kernel_stack_page + PAGE_SIZE)) - 1;
+ childregs = ((struct pt_regs *) ((unsigned long)p + KERNEL_STACK_SIZE)) - 1;
*childregs = *regs;
childregs->regs[7] = 0; /* Clear error flag */
if(current->personality == PER_LINUX) {