/* When I and D space are separate, these will need to be fixed.  */
        case PTRACE_PEEKTEXT: /* read word at location addr. */
        case PTRACE_PEEKDATA:
-               copied = access_process_vm(child, addr, &tmp, sizeof(tmp),
+               copied = ptrace_access_vm(child, addr, &tmp, sizeof(tmp),
                                FOLL_FORCE);
                ret = -EIO;
                if (copied != sizeof(tmp))
 
                        switch (bfin_mem_access_type(addr, to_copy)) {
                        case BFIN_MEM_ACCESS_CORE:
                        case BFIN_MEM_ACCESS_CORE_ONLY:
-                               copied = access_process_vm(child, addr, &tmp,
+                               copied = ptrace_access_vm(child, addr, &tmp,
                                                           to_copy, FOLL_FORCE);
                                if (copied)
                                        break;
                        switch (bfin_mem_access_type(addr, to_copy)) {
                        case BFIN_MEM_ACCESS_CORE:
                        case BFIN_MEM_ACCESS_CORE_ONLY:
-                               copied = access_process_vm(child, addr, &data,
+                               copied = ptrace_access_vm(child, addr, &data,
                                                           to_copy,
                                                           FOLL_FORCE | FOLL_WRITE);
                                break;
 
                                /* The trampoline page is globally mapped, no page table to traverse.*/
                                tmp = *(unsigned long*)addr;
                        } else {
-                               copied = access_process_vm(child, addr, &tmp, sizeof(tmp), FOLL_FORCE);
+                               copied = ptrace_access_vm(child, addr, &tmp, sizeof(tmp), FOLL_FORCE);
 
                                if (copied != sizeof(tmp))
                                        break;
 
        case PTRACE_PEEKTEXT:
        case PTRACE_PEEKDATA:
                /* read word at location addr */
-               if (access_process_vm(child, addr, &data, sizeof(data),
+               if (ptrace_access_vm(child, addr, &data, sizeof(data),
                                FOLL_FORCE)
                    != sizeof(data))
                        return -EIO;
 
                if (get_user(addrOthers, (u32 __user * __user *) (unsigned long) addr) != 0)
                        break;
 
-               copied = access_process_vm(child, (u64)addrOthers, &tmp,
+               copied = ptrace_access_vm(child, (u64)addrOthers, &tmp,
                                sizeof(tmp), FOLL_FORCE);
                if (copied != sizeof(tmp))
                        break;
                if (get_user(addrOthers, (u32 __user * __user *) (unsigned long) addr) != 0)
                        break;
                ret = 0;
-               if (access_process_vm(child, (u64)addrOthers, &data,
+               if (ptrace_access_vm(child, (u64)addrOthers, &data,
                                        sizeof(data),
                                        FOLL_FORCE | FOLL_WRITE) == sizeof(data))
                        break;
 
                if (get_user(addrOthers, (u32 __user * __user *)addr) != 0)
                        break;
 
-               copied = access_process_vm(child, (u64)addrOthers, &tmp,
+               copied = ptrace_access_vm(child, (u64)addrOthers, &tmp,
                                sizeof(tmp), FOLL_FORCE);
                if (copied != sizeof(tmp))
                        break;
                if (get_user(addrOthers, (u32 __user * __user *)addr) != 0)
                        break;
                ret = 0;
-               if (access_process_vm(child, (u64)addrOthers, &tmp,
+               if (ptrace_access_vm(child, (u64)addrOthers, &tmp,
                                        sizeof(tmp),
                                        FOLL_FORCE | FOLL_WRITE) == sizeof(tmp))
                        break;
 
                unsigned int gup_flags);
 extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
                void *buf, int len, unsigned int gup_flags);
+extern int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+               unsigned long addr, void *buf, int len, unsigned int gup_flags);
 
 long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm,
                            unsigned long start, unsigned long nr_pages,
 
 #include <linux/pid_namespace.h>       /* For task_active_pid_ns.  */
 #include <uapi/linux/ptrace.h>
 
+extern int ptrace_access_vm(struct task_struct *tsk, unsigned long addr,
+                           void *buf, int len, unsigned int gup_flags);
+
 /*
  * Ptrace flags
  *
 
 #include <linux/cn_proc.h>
 #include <linux/compat.h>
 
+/*
+ * Access another process' address space via ptrace.
+ * Source/target buffer must be kernel space,
+ * Do not walk the page table directly, use get_user_pages
+ */
+int ptrace_access_vm(struct task_struct *tsk, unsigned long addr,
+                    void *buf, int len, unsigned int gup_flags)
+{
+       struct mm_struct *mm;
+       int ret;
+
+       mm = get_task_mm(tsk);
+       if (!mm)
+               return 0;
+
+       if (!tsk->ptrace ||
+           (current != tsk->parent) ||
+           ((get_dumpable(mm) != SUID_DUMP_USER) &&
+            !ptracer_capable(tsk, mm->user_ns))) {
+               mmput(mm);
+               return 0;
+       }
+
+       ret = __access_remote_vm(tsk, mm, addr, buf, len, gup_flags);
+       mmput(mm);
+
+       return ret;
+}
+
 
 /*
  * ptrace a task: make the debugger its new parent and
                int this_len, retval;
 
                this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
-               retval = access_process_vm(tsk, src, buf, this_len, FOLL_FORCE);
+               retval = ptrace_access_vm(tsk, src, buf, this_len, FOLL_FORCE);
+
                if (!retval) {
                        if (copied)
                                break;
                this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
                if (copy_from_user(buf, src, this_len))
                        return -EFAULT;
-               retval = access_process_vm(tsk, dst, buf, this_len,
+               retval = ptrace_access_vm(tsk, dst, buf, this_len,
                                FOLL_FORCE | FOLL_WRITE);
                if (!retval) {
                        if (copied)
        unsigned long tmp;
        int copied;
 
-       copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), FOLL_FORCE);
+       copied = ptrace_access_vm(tsk, addr, &tmp, sizeof(tmp), FOLL_FORCE);
        if (copied != sizeof(tmp))
                return -EIO;
        return put_user(tmp, (unsigned long __user *)data);
 {
        int copied;
 
-       copied = access_process_vm(tsk, addr, &data, sizeof(data),
+       copied = ptrace_access_vm(tsk, addr, &data, sizeof(data),
                        FOLL_FORCE | FOLL_WRITE);
        return (copied == sizeof(data)) ? 0 : -EIO;
 }
        switch (request) {
        case PTRACE_PEEKTEXT:
        case PTRACE_PEEKDATA:
-               ret = access_process_vm(child, addr, &word, sizeof(word),
+               ret = ptrace_access_vm(child, addr, &word, sizeof(word),
                                FOLL_FORCE);
                if (ret != sizeof(word))
                        ret = -EIO;
 
        case PTRACE_POKETEXT:
        case PTRACE_POKEDATA:
-               ret = access_process_vm(child, addr, &data, sizeof(data),
+               ret = ptrace_access_vm(child, addr, &data, sizeof(data),
                                FOLL_FORCE | FOLL_WRITE);
                ret = (ret != sizeof(data) ? -EIO : 0);
                break;
 
  * Access another process' address space as given in mm.  If non-NULL, use the
  * given task for page fault accounting.
  */
-static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
                unsigned long addr, void *buf, int len, unsigned int gup_flags)
 {
        struct vm_area_struct *vma;
 
 }
 EXPORT_SYMBOL(filemap_map_pages);
 
-static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
                unsigned long addr, void *buf, int len, unsigned int gup_flags)
 {
        struct vm_area_struct *vma;