]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Support for __NR_ptrace, thanks to Jason Molenda. Now valgrind can be
authorJulian Seward <jseward@acm.org>
Tue, 17 Sep 2002 14:31:08 +0000 (14:31 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 17 Sep 2002 14:31:08 +0000 (14:31 +0000)
used to debug GDB.  Bwaha!

MERGE TO ERASER

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_1_0_BRANCH@1011

vg_syscall_mem.c
vg_unsafe.h

index 504bfb8906a293c7ad925f00be9418036659ba9d..66a68a5442f5ce2ea444caa15625dbb0ee47caf9 100644 (file)
@@ -417,6 +417,63 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
 
       /* !!!!!!!!!! New, untested syscalls !!!!!!!!!!!!!!!!!!!!! */
 
+#     if defined(__NR_ptrace)
+      case __NR_ptrace: /* syscall 26 */
+         /* long ptrace (enum __ptrace_request request, pid_t pid, 
+                         void *addr, void *data); ... sort of. */
+         switch (arg1) {
+             case 12:   /* PTRACE_GETREGS */
+                 must_be_writable (tst, "ptrace(getregs)", arg4, 
+                                   sizeof (struct user_regs_struct));
+                 break;
+             case 14:   /* PTRACE_GETFPREGS */
+                 must_be_writable (tst, "ptrace(getfpregs)", arg4, 
+                                   sizeof (struct user_fpregs_struct));
+                 break;
+             case 18:   /* PTRACE_GETFPXREGS */
+                 must_be_writable (tst, "ptrace(getfpxregs)", arg4, 
+                                   sizeof (struct user_fpxregs_struct));
+                 break;
+            case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
+                 must_be_writable (tst, "ptrace(peek)", arg4, sizeof (long));
+                 break;
+             case 13:   /* PTRACE_SETREGS */
+                 must_be_readable (tst, "ptrace(setregs)", arg4, 
+                                   sizeof (struct user_regs_struct));
+                 break;
+             case 15:   /* PTRACE_SETFPREGS */
+                 must_be_readable (tst, "ptrace(setfpregs)", arg4, 
+                                   sizeof (struct user_fpregs_struct));
+                 break;
+             case 19:   /* PTRACE_SETFPXREGS */
+                 must_be_readable (tst, "ptrace(setfpxregs)", arg4, 
+                                   sizeof (struct user_fpxregs_struct));
+                 break;
+             default:
+                 break;
+         }
+         KERNEL_DO_SYSCALL(tid, res);
+         if (!VG_(is_kerror)(res)) {
+             switch (arg1) {
+                 case 12:  /* PTRACE_GETREGS */
+                     make_readable (arg4, sizeof (struct user_regs_struct));
+                     break;
+                 case 14:  /* PTRACE_GETFPREGS */
+                     make_readable (arg4, sizeof (struct user_fpregs_struct));
+                     break;
+                 case 18:  /* PTRACE_GETFPXREGS */
+                     make_readable (arg4, sizeof (struct user_fpxregs_struct));
+                     break;
+                case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
+                     make_readable (arg4, sizeof (long));
+                     break;
+                 default:
+                     break;
+             }
+         }
+         break;
+#     endif
+
 #     if defined(__NR_setresgid)
       case __NR_setresgid: /* syscall 170 */
          /* int setresgid(gid_t rgid, gid_t egid, gid_t sgid); */
index 0862e0eb689dee2f176cdb31a675ee375e16f51f..7cac1f841592c4f51847b318749ac0d12d4c9830 100644 (file)
@@ -54,6 +54,7 @@
 #include <sched.h>        /* for struct sched_param */
 #include <linux/sysctl.h> /* for struct __sysctl_args */
 #include <linux/cdrom.h>  /* for cd-rom ioctls */
+#include <sys/user.h>     /* for struct user_regs_struct et al */
 
 #define __USE_LARGEFILE64
 #include <sys/stat.h>     /* for struct stat */