all-archs: consolidate .text section definition in asm-generic
[safe/jmp/linux-2.6] / arch / powerpc / kernel / ptrace.c
index 943425a..f4f391c 100644 (file)
  * this archive for more details.
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/smp.h>
-#include <linux/smp_lock.h>
 #include <linux/errno.h>
 #include <linux/ptrace.h>
 #include <linux/user.h>
@@ -36,8 +34,9 @@
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
+
 #ifdef CONFIG_PPC64
-#include <asm/ptrace-common.h>
+#include "ptrace-common.h"
 #endif
 
 #ifdef CONFIG_PPC32
@@ -248,46 +247,10 @@ void ptrace_disable(struct task_struct *child)
        clear_single_step(child);
 }
 
-int sys_ptrace(long request, long pid, long addr, long data)
+long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 {
-       struct task_struct *child;
        int ret = -EPERM;
 
-       lock_kernel();
-       if (request == PTRACE_TRACEME) {
-               /* are we already being traced? */
-               if (current->ptrace & PT_PTRACED)
-                       goto out;
-               ret = security_ptrace(current->parent, current);
-               if (ret)
-                       goto out;
-               /* set the ptrace bit in the process flags. */
-               current->ptrace |= PT_PTRACED;
-               ret = 0;
-               goto out;
-       }
-       ret = -ESRCH;
-       read_lock(&tasklist_lock);
-       child = find_task_by_pid(pid);
-       if (child)
-               get_task_struct(child);
-       read_unlock(&tasklist_lock);
-       if (!child)
-               goto out;
-
-       ret = -EPERM;
-       if (pid == 1)           /* you may not mess with init */
-               goto out_tsk;
-
-       if (request == PTRACE_ATTACH) {
-               ret = ptrace_attach(child);
-               goto out_tsk;
-       }
-
-       ret = ptrace_check_attach(child, request == PTRACE_KILL);
-       if (ret < 0)
-               goto out_tsk;
-
        switch (request) {
        /* when I and D space are separate, these will need to be fixed. */
        case PTRACE_PEEKTEXT: /* read word at location addr. */
@@ -439,7 +402,6 @@ int sys_ptrace(long request, long pid, long addr, long data)
                ret = ptrace_detach(child, data);
                break;
 
-#ifdef CONFIG_PPC64
        case PPC_PTRACE_GETREGS: { /* Get GPRs 0 - 31. */
                int i;
                unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
@@ -503,7 +465,6 @@ int sys_ptrace(long request, long pid, long addr, long data)
                }
                break;
        }
-#endif /* CONFIG_PPC64 */
 
 #ifdef CONFIG_ALTIVEC
        case PTRACE_GETVRREGS:
@@ -540,10 +501,7 @@ int sys_ptrace(long request, long pid, long addr, long data)
                ret = ptrace_request(child, request, addr, data);
                break;
        }
-out_tsk:
-       put_task_struct(child);
-out:
-       unlock_kernel();
+
        return ret;
 }
 
@@ -567,47 +525,38 @@ static void do_syscall_trace(void)
 
 void do_syscall_trace_enter(struct pt_regs *regs)
 {
-#ifdef CONFIG_PPC64
        secure_computing(regs->gpr[0]);
-#endif
 
        if (test_thread_flag(TIF_SYSCALL_TRACE)
            && (current->ptrace & PT_PTRACED))
                do_syscall_trace();
 
-       if (unlikely(current->audit_context))
-               audit_syscall_entry(current,
-#ifdef CONFIG_PPC32
-                                   AUDIT_ARCH_PPC,
-#else
-                                   test_thread_flag(TIF_32BIT)?AUDIT_ARCH_PPC:AUDIT_ARCH_PPC64,
+       if (unlikely(current->audit_context)) {
+#ifdef CONFIG_PPC64
+               if (!test_thread_flag(TIF_32BIT))
+                       audit_syscall_entry(AUDIT_ARCH_PPC64,
+                                           regs->gpr[0],
+                                           regs->gpr[3], regs->gpr[4],
+                                           regs->gpr[5], regs->gpr[6]);
+               else
 #endif
-                                   regs->gpr[0],
-                                   regs->gpr[3], regs->gpr[4],
-                                   regs->gpr[5], regs->gpr[6]);
+                       audit_syscall_entry(AUDIT_ARCH_PPC,
+                                           regs->gpr[0],
+                                           regs->gpr[3] & 0xffffffff,
+                                           regs->gpr[4] & 0xffffffff,
+                                           regs->gpr[5] & 0xffffffff,
+                                           regs->gpr[6] & 0xffffffff);
+       }
 }
 
 void do_syscall_trace_leave(struct pt_regs *regs)
 {
-#ifdef CONFIG_PPC32
-       secure_computing(regs->gpr[0]);
-#endif
-
        if (unlikely(current->audit_context))
-               audit_syscall_exit(current,
-                                  (regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
+               audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
                                   regs->result);
 
        if ((test_thread_flag(TIF_SYSCALL_TRACE)
-#ifdef CONFIG_PPC64
-            || test_thread_flag(TIF_SINGLESTEP)
-#endif
-            )
+            || test_thread_flag(TIF_SINGLESTEP))
            && (current->ptrace & PT_PTRACED))
                do_syscall_trace();
 }
-
-#ifdef CONFIG_PPC32
-EXPORT_SYMBOL(do_syscall_trace_enter);
-EXPORT_SYMBOL(do_syscall_trace_leave);
-#endif