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!
 //----------------------------------------------------------------------