Yet more system calls.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4227 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h
index 770b5e5..99c3d50 100644
--- a/coregrind/m_syswrap/priv_syswrap-linux.h
+++ b/coregrind/m_syswrap/priv_syswrap-linux.h
@@ -89,6 +89,9 @@
DECL_TEMPLATE(linux, sys_io_submit);
DECL_TEMPLATE(linux, sys_io_cancel);
+DECL_TEMPLATE(linux, sys_set_mempolicy);
+DECL_TEMPLATE(linux, sys_get_mempolicy);
+
#endif // __PRIV_SYSWRAP_LINUX_H
/*--------------------------------------------------------------------*/
diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c
index 46a21b4..b033b54 100644
--- a/coregrind/m_syswrap/syswrap-amd64-linux.c
+++ b/coregrind/m_syswrap/syswrap-amd64-linux.c
@@ -584,6 +584,7 @@
DECL_TEMPLATE(amd64_linux, sys_shmdt);
DECL_TEMPLATE(amd64_linux, sys_shmctl);
DECL_TEMPLATE(amd64_linux, sys_arch_prctl);
+DECL_TEMPLATE(amd64_linux, sys_ptrace);
DECL_TEMPLATE(amd64_linux, sys_pread64);
DECL_TEMPLATE(amd64_linux, sys_pwrite64);
@@ -739,6 +740,60 @@
SET_STATUS_Success( 0 );
}
+// Parts of this are amd64-specific, but the *PEEK* cases are generic.
+// XXX: Why is the memory pointed to by ARG3 never checked?
+PRE(sys_ptrace)
+{
+ PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
+ PRE_REG_READ4(int, "ptrace",
+ long, request, long, pid, long, addr, long, data);
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ PRE_MEM_WRITE( "ptrace(peek)", ARG4,
+ sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
+ sizeof (struct vki_user_i387_struct));
+ break;
+ case VKI_PTRACE_SETREGS:
+ PRE_MEM_READ( "ptrace(setregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_SETFPREGS:
+ PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
+ sizeof (struct vki_user_i387_struct));
+ break;
+ default:
+ break;
+ }
+}
+
+POST(sys_ptrace)
+{
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ POST_MEM_WRITE( ARG4, sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
+ break;
+ default:
+ break;
+ }
+}
+
PRE(sys_socket)
{
PRINT("sys_socket ( %d, %d, %d )",ARG1,ARG2,ARG3);
@@ -1234,7 +1289,7 @@
LINXY(__NR_sysinfo, sys_sysinfo), // 99
GENXY(__NR_times, sys_times), // 100
- // (__NR_ptrace, sys_ptrace), // 101
+ PLAXY(__NR_ptrace, sys_ptrace), // 101
GENX_(__NR_getuid, sys_getuid), // 102
// (__NR_syslog, sys_syslog), // 103
GENX_(__NR_getgid, sys_getgid), // 104
@@ -1261,7 +1316,7 @@
GENX_(__NR_getpgid, sys_getpgid), // 121
LINX_(__NR_setfsuid, sys_setfsuid), // 122
LINX_(__NR_setfsgid, sys_setfsgid), // 123
- // (__NR_getsid, sys_getsid), // 124
+ GENX_(__NR_getsid, sys_getsid), // 124
// (__NR_capget, sys_capget), // 125
// (__NR_capset, sys_capset), // 126
@@ -1275,7 +1330,7 @@
GENX_(__NR_mknod, sys_mknod), // 133
// (__NR_uselib, sys_uselib), // 134
- // (__NR_personality, sys_personality), // 135
+ LINX_(__NR_personality, sys_personality), // 135
// (__NR_ustat, sys_ustat), // 136
GENXY(__NR_statfs, sys_statfs), // 137
// (__NR_fstatfs, sys_fstatfs), // 138
@@ -1320,7 +1375,7 @@
// (__NR_sethostname, sys_sethostname), // 170
// (__NR_setdomainname, sys_setdomainname), // 171
// (__NR_iopl, stub_iopl), // 172
- // (__NR_ioperm, sys_ioperm), // 173
+ LINX_(__NR_ioperm, sys_ioperm), // 173
// (__NR_create_module, sys_ni_syscall), // 174
// (__NR_init_module, sys_init_module), // 175
@@ -1356,8 +1411,8 @@
// (__NR_tkill, sys_tkill), // 200
GENXY(__NR_time, sys_time), /*was sys_time64*/ // 201
LINXY(__NR_futex, sys_futex), // 202
- // (__NR_sched_setaffinity, sys_sched_setaffinity), // 203
- // (__NR_sched_getaffinity, sys_sched_getaffinity), // 204
+ GENX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 203
+ GENXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 204
// (__NR_set_thread_area, sys_ni_syscall), // 205
LINX_(__NR_io_setup, sys_io_setup), // 206
@@ -1399,9 +1454,9 @@
// (__NR_vserver, sys_ni_syscall), // 236
// (__NR_vserver, sys_ni_syscall), // 236
// (__NR_mbind, sys_mbind), // 237
- // (__NR_set_mempolicy, sys_set_mempolicy), // 238
+ LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 238
- // (__NR_get_mempolicy, sys_get_mempolicy), // 239
+ LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 239
GENXY(__NR_mq_open, sys_mq_open), // 240
GENX_(__NR_mq_unlink, sys_mq_unlink), // 241
GENX_(__NR_mq_timedsend, sys_mq_timedsend), // 242
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
index 4416818..965470d 100644
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -829,6 +829,37 @@
POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) );
}
+PRE(sys_set_mempolicy)
+{
+ PRINT("sys_set_mempolicy( %d, %p, %d )", ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "set_mempolicy",
+ int, policy, unsigned long *, nodemask,
+ unsigned long, maxnode);
+ PRE_MEM_READ( "set_mempolicy(nodemask)", ARG2,
+ VG_ROUNDUP( ARG3, sizeof(UWord) ) / sizeof(UWord) );
+}
+
+PRE(sys_get_mempolicy)
+{
+ PRINT("sys_get_mempolicy( %p, %p, %d, %p, %x )", ARG1,ARG2,ARG3,ARG4,ARG5);
+ PRE_REG_READ5(long, "get_mempolicy",
+ int *, policy, unsigned long *, nodemask,
+ unsigned long, maxnode, unsigned long, addr,
+ unsigned long, flags);
+ if (ARG1 != 0)
+ PRE_MEM_WRITE( "get_mempolicy(policy)", ARG1, sizeof(Int) );
+ if (ARG2 != 0)
+ PRE_MEM_WRITE( "get_mempolicy(nodemask)", ARG2,
+ VG_ROUNDUP( ARG3, sizeof(UWord) * 8 ) / sizeof(UWord) );
+}
+POST(sys_get_mempolicy)
+{
+ if (ARG1 != 0)
+ POST_MEM_WRITE( ARG1, sizeof(Int) );
+ if (ARG2 != 0)
+ POST_MEM_WRITE( ARG2, VG_ROUNDUP( ARG3, sizeof(UWord) * 8 ) / sizeof(UWord) );
+}
+
#undef PRE
#undef POST
diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c
index b5c7a9b..8e7d2d4 100644
--- a/coregrind/m_syswrap/syswrap-x86-linux.c
+++ b/coregrind/m_syswrap/syswrap-x86-linux.c
@@ -2273,8 +2273,8 @@
GENX_(__NR_vserver, sys_ni_syscall), // 273
//zz // (__NR_mbind, sys_mbind), // 274 ?/?
//zz
-//zz // (__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/?
-//zz // (__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/?
+ LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/?
+ LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/?
GENXY(__NR_mq_open, sys_mq_open), // 277
GENX_(__NR_mq_unlink, sys_mq_unlink), // (mq_open+1)
GENX_(__NR_mq_timedsend, sys_mq_timedsend), // (mq_open+2)
diff --git a/include/vki-amd64-linux.h b/include/vki-amd64-linux.h
index badff2a..934a276 100644
--- a/include/vki-amd64-linux.h
+++ b/include/vki-amd64-linux.h
@@ -445,6 +445,20 @@
// From linux-2.6.9/include/asm-x86_64/user.h
//----------------------------------------------------------------------
+struct vki_user_i387_struct {
+ unsigned short cwd;
+ unsigned short swd;
+ unsigned short twd; /* Note this is not the same as the 32bit/x87/FSAVE twd */
+ unsigned short fop;
+ __vki_u64 rip;
+ __vki_u64 rdp;
+ __vki_u32 mxcsr;
+ __vki_u32 mxcsr_mask;
+ __vki_u32 st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
+ __vki_u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg = 256 bytes */
+ __vki_u32 padding[24];
+};
+
struct vki_user_regs_struct {
unsigned long r15,r14,r13,r12,rbp,rbx,r11,r10;
unsigned long r9,r8,rax,rcx,rdx,rsi,rdi,orig_rax;
@@ -611,6 +625,15 @@
};
//----------------------------------------------------------------------
+// From linux-2.6.12.2/include/asm-x86_64/ptrace.h
+//----------------------------------------------------------------------
+
+#define VKI_PTRACE_GETREGS 12
+#define VKI_PTRACE_SETREGS 13
+#define VKI_PTRACE_GETFPREGS 14
+#define VKI_PTRACE_SETFPREGS 15
+
+//----------------------------------------------------------------------
// And that's it!
//----------------------------------------------------------------------