From 3799ec8c9b514d1e6e9feb82272575e22ff91a33 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 17 Sep 2002 14:31:08 +0000 Subject: [PATCH] Support for __NR_ptrace, thanks to Jason Molenda. Now valgrind can be 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 | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ vg_unsafe.h | 1 + 2 files changed, 58 insertions(+) diff --git a/vg_syscall_mem.c b/vg_syscall_mem.c index 504bfb8906..66a68a5442 100644 --- a/vg_syscall_mem.c +++ b/vg_syscall_mem.c @@ -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); */ diff --git a/vg_unsafe.h b/vg_unsafe.h index 0862e0eb68..7cac1f8415 100644 --- a/vg_unsafe.h +++ b/vg_unsafe.h @@ -54,6 +54,7 @@ #include /* for struct sched_param */ #include /* for struct __sysctl_args */ #include /* for cd-rom ioctls */ +#include /* for struct user_regs_struct et al */ #define __USE_LARGEFILE64 #include /* for struct stat */ -- 2.47.2