|
@@ -2608,9 +2608,22 @@ static inline void setup_thread_stack(struct task_struct *p, struct task_struct
|
|
|
task_thread_info(p)->task = p;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Return the address of the last usable long on the stack.
|
|
|
+ *
|
|
|
+ * When the stack grows down, this is just above the thread
|
|
|
+ * info struct. Going any lower will corrupt the threadinfo.
|
|
|
+ *
|
|
|
+ * When the stack grows up, this is the highest address.
|
|
|
+ * Beyond that position, we corrupt data on the next page.
|
|
|
+ */
|
|
|
static inline unsigned long *end_of_stack(struct task_struct *p)
|
|
|
{
|
|
|
+#ifdef CONFIG_STACK_GROWSUP
|
|
|
+ return (unsigned long *)((unsigned long)task_thread_info(p) + THREAD_SIZE) - 1;
|
|
|
+#else
|
|
|
return (unsigned long *)(task_thread_info(p) + 1);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
#endif
|