]> err.no Git - linux-2.6/blobdiff - arch/powerpc/kernel/process.c
Merge branch 'linus' into x86/urgent
[linux-2.6] / arch / powerpc / kernel / process.c
index 4ec605521504d0e4ef8a01bc9902504d57908e7f..7de41c3948ec2dd4d148800c0dcd6421a3c77a2d 100644 (file)
@@ -589,6 +589,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
        kregs = (struct pt_regs *) sp;
        sp -= STACK_FRAME_OVERHEAD;
        p->thread.ksp = sp;
+       p->thread.ksp_limit = (unsigned long)task_stack_page(p) +
+                               _ALIGN_UP(sizeof(struct thread_info), 16);
 
 #ifdef CONFIG_PPC64
        if (cpu_has_feature(CPU_FTR_SLB)) {
@@ -868,11 +870,6 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
        flush_spe_to_thread(current);
        error = do_execve(filename, (char __user * __user *) a1,
                          (char __user * __user *) a2, regs);
-       if (error == 0) {
-               task_lock(current);
-               current->ptrace &= ~PT_DTRACE;
-               task_unlock(current);
-       }
        putname(filename);
 out:
        return error;
@@ -919,20 +916,6 @@ int validate_sp(unsigned long sp, struct task_struct *p,
        return valid_irq_stack(sp, p, nbytes);
 }
 
-#ifdef CONFIG_PPC64
-#define MIN_STACK_FRAME        112     /* same as STACK_FRAME_OVERHEAD, in fact */
-#define FRAME_LR_SAVE  2
-#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD + 288)
-#define REGS_MARKER    0x7265677368657265ul
-#define FRAME_MARKER   12
-#else
-#define MIN_STACK_FRAME        16
-#define FRAME_LR_SAVE  1
-#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
-#define REGS_MARKER    0x72656773ul
-#define FRAME_MARKER   2
-#endif
-
 EXPORT_SYMBOL(validate_sp);
 
 unsigned long get_wchan(struct task_struct *p)
@@ -944,15 +927,15 @@ unsigned long get_wchan(struct task_struct *p)
                return 0;
 
        sp = p->thread.ksp;
-       if (!validate_sp(sp, p, MIN_STACK_FRAME))
+       if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
                return 0;
 
        do {
                sp = *(unsigned long *)sp;
-               if (!validate_sp(sp, p, MIN_STACK_FRAME))
+               if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
                        return 0;
                if (count > 0) {
-                       ip = ((unsigned long *)sp)[FRAME_LR_SAVE];
+                       ip = ((unsigned long *)sp)[STACK_FRAME_LR_SAVE];
                        if (!in_sched_functions(ip))
                                return ip;
                }
@@ -981,12 +964,12 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
        lr = 0;
        printk("Call Trace:\n");
        do {
-               if (!validate_sp(sp, tsk, MIN_STACK_FRAME))
+               if (!validate_sp(sp, tsk, STACK_FRAME_OVERHEAD))
                        return;
 
                stack = (unsigned long *) sp;
                newsp = stack[0];
-               ip = stack[FRAME_LR_SAVE];
+               ip = stack[STACK_FRAME_LR_SAVE];
                if (!firstframe || ip != lr) {
                        printk("["REG"] ["REG"] ", sp, ip);
                        print_symbol("%s", ip);
@@ -1000,8 +983,8 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
                 * See if this is an exception frame.
                 * We look for the "regshere" marker in the current frame.
                 */
-               if (validate_sp(sp, tsk, INT_FRAME_SIZE)
-                   && stack[FRAME_MARKER] == REGS_MARKER) {
+               if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE)
+                   && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
                        struct pt_regs *regs = (struct pt_regs *)
                                (sp + STACK_FRAME_OVERHEAD);
                        printk("--- Exception: %lx", regs->trap);
@@ -1052,3 +1035,34 @@ void ppc64_runlatch_off(void)
        }
 }
 #endif
+
+#if THREAD_SHIFT < PAGE_SHIFT
+
+static struct kmem_cache *thread_info_cache;
+
+struct thread_info *alloc_thread_info(struct task_struct *tsk)
+{
+       struct thread_info *ti;
+
+       ti = kmem_cache_alloc(thread_info_cache, GFP_KERNEL);
+       if (unlikely(ti == NULL))
+               return NULL;
+#ifdef CONFIG_DEBUG_STACK_USAGE
+       memset(ti, 0, THREAD_SIZE);
+#endif
+       return ti;
+}
+
+void free_thread_info(struct thread_info *ti)
+{
+       kmem_cache_free(thread_info_cache, ti);
+}
+
+void thread_info_cache_init(void)
+{
+       thread_info_cache = kmem_cache_create("thread_info", THREAD_SIZE,
+                                             THREAD_SIZE, 0, NULL);
+       BUG_ON(thread_info_cache == NULL);
+}
+
+#endif /* THREAD_SHIFT < PAGE_SHIFT */