From: Tom Hughes Date: Fri, 22 Jul 2005 15:04:14 +0000 (+0000) Subject: Yet more system calls. X-Git-Tag: svn/VALGRIND_3_0_0~91 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a74aa1e74dbc5f10bc2fb6534f75eebfaafe0543;p=thirdparty%2Fvalgrind.git Yet more system calls. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4227 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 770b5e5ce1..99c3d5048e 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_getevents); 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 46a21b4a06..b033b54ce2 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_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 @@ PRE(sys_arch_prctl) 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 @@ const SyscallTableEntry ML_(syscall_table)[] = { 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 @@ const SyscallTableEntry ML_(syscall_table)[] = { 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 @@ const SyscallTableEntry ML_(syscall_table)[] = { 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 @@ const SyscallTableEntry ML_(syscall_table)[] = { // (__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 @@ const SyscallTableEntry ML_(syscall_table)[] = { // (__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 @@ const SyscallTableEntry ML_(syscall_table)[] = { // (__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 44168184f4..965470d35d 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -829,6 +829,37 @@ POST(sys_io_cancel) 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 b5c7a9b7f3..8e7d2d4238 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -2273,8 +2273,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { 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 badff2af53..934a2769aa 100644 --- a/include/vki-amd64-linux.h +++ b/include/vki-amd64-linux.h @@ -445,6 +445,20 @@ struct vki_pollfd { // 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; @@ -610,6 +624,15 @@ struct vki_shminfo64 { unsigned long __unused4; }; +//---------------------------------------------------------------------- +// 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! //----------------------------------------------------------------------