|
From: <sv...@va...> - 2012-11-04 20:40:44
|
philippe 2012-11-04 20:40:33 +0000 (Sun, 04 Nov 2012)
New Revision: 13104
Log:
factorise sys_socketcall
sys_socketcall was duplicated in syswrap-{ppc64|ppc32|arm|mips32|s390x}-linux.c
=>
* Similarly for what was done for sys_ipc, factorise the code in syswrap-linux.c
* re-enabled PRE_MEM_READ for VKI_SYS_SENDMSG and VKI_SYS_RECVMSG
(PRE_MEM_READ calls were commented out around 2003, for what
was supposed a glibc bug.
The PRE_MEM_READ calls were already re-enabled in s390x)
* s390x also had some more checking to verify the addressibility of
the args and fail the syscall with EFAULT if not addressable
=> same checks are now done for all platforms.
(tested on x86/amd64/mips32/s390x/ppc32/ppc64,
compiled for arm-android-emulator)
Modified files:
trunk/coregrind/m_syswrap/priv_syswrap-generic.h
trunk/coregrind/m_syswrap/priv_syswrap-linux.h
trunk/coregrind/m_syswrap/syswrap-arm-linux.c
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/coregrind/m_syswrap/syswrap-mips32-linux.c
trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
trunk/coregrind/m_syswrap/syswrap-s390x-linux.c
trunk/coregrind/m_syswrap/syswrap-x86-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-s390x-linux.c (+1 -320)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-s390x-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-s390x-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -339,7 +339,6 @@
magic. */
DECL_TEMPLATE(s390x_linux, sys_ptrace);
-DECL_TEMPLATE(s390x_linux, sys_socketcall);
DECL_TEMPLATE(s390x_linux, sys_mmap);
DECL_TEMPLATE(s390x_linux, sys_clone);
DECL_TEMPLATE(s390x_linux, sys_sigreturn);
@@ -439,324 +438,6 @@
}
}
-
-PRE(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- *flags |= SfMayBlock;
- PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
- PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
-
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- /* int socketpair(int d, int type, int protocol, int sv[2]); */
- PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
- break;
-
- case VKI_SYS_SOCKET:
- /* int socket(int domain, int type, int protocol); */
- PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- break;
-
- case VKI_SYS_ACCEPT: {
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_SENDTO:
- /* int sendto(int s, const void *msg, int len,
- unsigned int flags,
- const struct sockaddr *to, int tolen); */
- PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_SEND:
- /* int send(int s, const void *msg, size_t len, int flags); */
- PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_RECVFROM:
- /* int recvfrom(int s, void *buf, int len, unsigned int flags,
- struct sockaddr *from, int *fromlen); */
- PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 6*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- /* int recv(int s, void *buf, int len, unsigned int flags); */
- /* man 2 recv says:
- The recv call is normally used only on a connected socket
- (see connect(2)) and is identical to recvfrom with a NULL
- from parameter.
- */
- PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 4*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- /* int connect(int sockfd,
- struct sockaddr *serv_addr, int addrlen ); */
- PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SETSOCKOPT:
- /* int setsockopt(int s, int level, int optname,
- const void *optval, int optlen); */
- PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKOPT:
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 5*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- /* int getsockname(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- /* int getpeername(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- /* int shutdown(int s, int how); */
- PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 2*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- break;
-
- case VKI_SYS_SENDMSG: {
- /* int sendmsg(int s, const struct msghdr *msg, int flags); */
- PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- case VKI_SYS_RECVMSG: {
- /* int recvmsg(int s, struct msghdr *msg, int flags); */
- PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
- if (!ML_(valid_client_addr)(ARG2, 3*sizeof(Addr), tid, NULL)) {
- SET_STATUS_Failure( VKI_EFAULT );
- break;
- }
- ML_(generic_PRE_sys_recvmsg)( tid, "msg2", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- default:
- VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
- SET_STATUS_Failure( VKI_EINVAL );
- break;
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
-POST(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- SysRes r;
- vg_assert(SUCCESS);
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- r = ML_(generic_POST_sys_socketpair)(
- tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2, ARG2_3
- );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SOCKET:
- r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- break;
-
- case VKI_SYS_ACCEPT:
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SENDTO:
- break;
-
- case VKI_SYS_SEND:
- break;
-
- case VKI_SYS_RECVFROM:
- ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- break;
-
- case VKI_SYS_SETSOCKOPT:
- break;
-
- case VKI_SYS_GETSOCKOPT:
- ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- break;
-
- case VKI_SYS_SENDMSG:
- break;
-
- case VKI_SYS_RECVMSG:
- ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
- break;
-
- default:
- VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
- VG_(core_panic)("... bye!\n");
- break; /*NOTREACHED*/
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
PRE(sys_mmap)
{
UWord a0, a1, a2, a3, a4, a5;
@@ -1081,7 +762,7 @@
GENXY(__NR_fstatfs, sys_fstatfs), // 100
GENX_(101, sys_ni_syscall), /* unimplemented (by the kernel) */ // 101
- PLAXY(__NR_socketcall, sys_socketcall), // 102
+ LINXY(__NR_socketcall, sys_socketcall), // 102
LINXY(__NR_syslog, sys_syslog), // 103
GENXY(__NR_setitimer, sys_setitimer), // 104
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c (+1 -268)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -439,7 +439,6 @@
aren't visible outside this file, but that requires even more macro
magic. */
-DECL_TEMPLATE(ppc64_linux, sys_socketcall);
DECL_TEMPLATE(ppc64_linux, sys_mmap);
//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
//zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
@@ -450,272 +449,6 @@
DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
DECL_TEMPLATE(ppc64_linux, sys_fadvise64);
-PRE(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- *flags |= SfMayBlock;
- PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
- PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
-
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- /* int socketpair(int d, int type, int protocol, int sv[2]); */
- PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
- break;
-
- case VKI_SYS_SOCKET:
- /* int socket(int domain, int type, int protocol); */
- PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_ACCEPT: {
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_ACCEPT4: {
- /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
- PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_SENDTO:
- /* int sendto(int s, const void *msg, int len,
- unsigned int flags,
- const struct sockaddr *to, int tolen); */
- PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_SEND:
- /* int send(int s, const void *msg, size_t len, int flags); */
- PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_RECVFROM:
- /* int recvfrom(int s, void *buf, int len, unsigned int flags,
- struct sockaddr *from, int *fromlen); */
- PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- /* int recv(int s, void *buf, int len, unsigned int flags); */
- /* man 2 recv says:
- The recv call is normally used only on a connected socket
- (see connect(2)) and is identical to recvfrom with a NULL
- from parameter.
- */
- PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- /* int connect(int sockfd,
- struct sockaddr *serv_addr, int addrlen ); */
- PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SETSOCKOPT:
- /* int setsockopt(int s, int level, int optname,
- const void *optval, int optlen); */
- PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKOPT:
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- /* int getsockname(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- /* int getpeername(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- /* int shutdown(int s, int how); */
- PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_SENDMSG: {
- /* int sendmsg(int s, const struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- case VKI_SYS_RECVMSG: {
- /* int recvmsg(int s, struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- default:
- VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
- SET_STATUS_Failure( VKI_EINVAL );
- break;
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
-POST(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- SysRes r;
- vg_assert(SUCCESS);
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- r = ML_(generic_POST_sys_socketpair)(
- tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2, ARG2_3
- );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SOCKET:
- r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- break;
-
- case VKI_SYS_ACCEPT:
- case VKI_SYS_ACCEPT4:
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
- r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SENDTO:
- break;
-
- case VKI_SYS_SEND:
- break;
-
- case VKI_SYS_RECVFROM:
- ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- break;
-
- case VKI_SYS_SETSOCKOPT:
- break;
-
- case VKI_SYS_GETSOCKOPT:
- ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- break;
-
- case VKI_SYS_SENDMSG:
- break;
-
- case VKI_SYS_RECVMSG:
- ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
- break;
-
- default:
- VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
- VG_(core_panic)("... bye!\n");
- break; /*NOTREACHED*/
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
PRE(sys_mmap)
{
SysRes r;
@@ -1066,7 +799,7 @@
GENXY(__NR_fstatfs, sys_fstatfs), // 100
// _____(__NR_ioperm, sys_ioperm), // 101
- PLAXY(__NR_socketcall, sys_socketcall), // 102
+ LINXY(__NR_socketcall, sys_socketcall), // 102
LINXY(__NR_syslog, sys_syslog), // 103
GENXY(__NR_setitimer, sys_setitimer), // 104
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c (+273 -1)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -3301,7 +3301,7 @@
return *a_p;
}
-Bool semctl_cmd_has_4args (UWord cmd)
+static Bool semctl_cmd_has_4args (UWord cmd)
{
switch (cmd & ~VKI_IPC_64)
{
@@ -3502,6 +3502,278 @@
#endif
/* ---------------------------------------------------------------------
+ Generic handler for sys_socketcall
+ Depending on the platform, some socket related syscalls (e.g. socketpair,
+ socket, bind, ...)
+ are either direct system calls, or are all implemented via sys_socketcall.
+ ------------------------------------------------------------------ */
+#ifdef __NR_socketcall
+PRE(sys_socketcall)
+{
+# define ARG2_0 (((UWord*)ARG2)[0])
+# define ARG2_1 (((UWord*)ARG2)[1])
+# define ARG2_2 (((UWord*)ARG2)[2])
+# define ARG2_3 (((UWord*)ARG2)[3])
+# define ARG2_4 (((UWord*)ARG2)[4])
+# define ARG2_5 (((UWord*)ARG2)[5])
+
+// call PRE_MEM_READ and check for EFAULT result.
+#define PRE_MEM_READ_ef(msg, arg, size) \
+ { \
+ PRE_MEM_READ( msg, arg, size); \
+ if (!ML_(valid_client_addr)(arg, size, tid, NULL)) { \
+ SET_STATUS_Failure( VKI_EFAULT ); \
+ break; \
+ } \
+ }
+
+ *flags |= SfMayBlock;
+ PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
+ PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
+
+ switch (ARG1 /* request */) {
+
+ case VKI_SYS_SOCKETPAIR:
+ /* int socketpair(int d, int type, int protocol, int sv[2]); */
+ PRE_MEM_READ_ef( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
+ break;
+
+ case VKI_SYS_SOCKET:
+ /* int socket(int domain, int type, int protocol); */
+ PRE_MEM_READ_ef( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_BIND:
+ /* int bind(int sockfd, struct sockaddr *my_addr,
+ int addrlen); */
+ PRE_MEM_READ_ef( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_LISTEN:
+ /* int listen(int s, int backlog); */
+ PRE_MEM_READ_ef( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_ACCEPT:
+ /* int accept(int s, struct sockaddr *addr, int *addrlen); */
+ PRE_MEM_READ_ef( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_ACCEPT4:
+ /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
+ PRE_MEM_READ_ef( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SENDTO:
+ /* int sendto(int s, const void *msg, int len,
+ unsigned int flags,
+ const struct sockaddr *to, int tolen); */
+ PRE_MEM_READ_ef( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
+ ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_SEND:
+ /* int send(int s, const void *msg, size_t len, int flags); */
+ PRE_MEM_READ_ef( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_RECVFROM:
+ /* int recvfrom(int s, void *buf, int len, unsigned int flags,
+ struct sockaddr *from, int *fromlen); */
+ PRE_MEM_READ_ef( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
+ ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_RECV:
+ /* int recv(int s, void *buf, int len, unsigned int flags); */
+ /* man 2 recv says:
+ The recv call is normally used only on a connected socket
+ (see connect(2)) and is identical to recvfrom with a NULL
+ from parameter.
+ */
+ PRE_MEM_READ_ef( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
+ ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_CONNECT:
+ /* int connect(int sockfd,
+ struct sockaddr *serv_addr, int addrlen ); */
+ PRE_MEM_READ_ef( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SETSOCKOPT:
+ /* int setsockopt(int s, int level, int optname,
+ const void *optval, int optlen); */
+ PRE_MEM_READ_ef( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
+ ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKOPT:
+ /* int getsockopt(int s, int level, int optname,
+ void *optval, socklen_t *optlen); */
+ PRE_MEM_READ_ef( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
+ ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKNAME:
+ /* int getsockname(int s, struct sockaddr* name, int* namelen) */
+ PRE_MEM_READ_ef( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_GETPEERNAME:
+ /* int getpeername(int s, struct sockaddr* name, int* namelen) */
+ PRE_MEM_READ_ef( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SHUTDOWN:
+ /* int shutdown(int s, int how); */
+ PRE_MEM_READ_ef( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
+ break;
+
+ case VKI_SYS_SENDMSG:
+ /* int sendmsg(int s, const struct msghdr *msg, int flags); */
+ PRE_MEM_READ_ef( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
+ break;
+
+ case VKI_SYS_RECVMSG:
+ /* int recvmsg(int s, struct msghdr *msg, int flags); */
+ PRE_MEM_READ_ef("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
+ ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
+ break;
+
+ default:
+ VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
+ SET_STATUS_Failure( VKI_EINVAL );
+ break;
+ }
+# undef ARG2_0
+# undef ARG2_1
+# undef ARG2_2
+# undef ARG2_3
+# undef ARG2_4
+# undef ARG2_5
+}
+
+POST(sys_socketcall)
+{
+# define ARG2_0 (((UWord*)ARG2)[0])
+# define ARG2_1 (((UWord*)ARG2)[1])
+# define ARG2_2 (((UWord*)ARG2)[2])
+# define ARG2_3 (((UWord*)ARG2)[3])
+# define ARG2_4 (((UWord*)ARG2)[4])
+# define ARG2_5 (((UWord*)ARG2)[5])
+
+ SysRes r;
+ vg_assert(SUCCESS);
+ switch (ARG1 /* request */) {
+
+ case VKI_SYS_SOCKETPAIR:
+ r = ML_(generic_POST_sys_socketpair)(
+ tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2, ARG2_3
+ );
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_SOCKET:
+ r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_BIND:
+ /* int bind(int sockfd, struct sockaddr *my_addr,
+ int addrlen); */
+ break;
+
+ case VKI_SYS_LISTEN:
+ /* int listen(int s, int backlog); */
+ break;
+
+ case VKI_SYS_ACCEPT:
+ case VKI_SYS_ACCEPT4:
+ /* int accept(int s, struct sockaddr *addr, int *addrlen); */
+ /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */
+ r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2 );
+ SET_STATUS_from_SysRes(r);
+ break;
+
+ case VKI_SYS_SENDTO:
+ break;
+
+ case VKI_SYS_SEND:
+ break;
+
+ case VKI_SYS_RECVFROM:
+ ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4, ARG2_5 );
+ break;
+
+ case VKI_SYS_RECV:
+ ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_CONNECT:
+ break;
+
+ case VKI_SYS_SETSOCKOPT:
+ break;
+
+ case VKI_SYS_GETSOCKOPT:
+ ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1,
+ ARG2_2, ARG2_3, ARG2_4 );
+ break;
+
+ case VKI_SYS_GETSOCKNAME:
+ ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_GETPEERNAME:
+ ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
+ ARG2_0, ARG2_1, ARG2_2 );
+ break;
+
+ case VKI_SYS_SHUTDOWN:
+ break;
+
+ case VKI_SYS_SENDMSG:
+ break;
+
+ case VKI_SYS_RECVMSG:
+ ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
+ break;
+
+ default:
+ VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
+ VG_(core_panic)("... bye!\n");
+ break; /*NOTREACHED*/
+ }
+# undef ARG2_0
+# undef ARG2_1
+# undef ARG2_2
+# undef ARG2_3
+# undef ARG2_4
+# undef ARG2_5
+}
+#endif
+
+/* ---------------------------------------------------------------------
*at wrappers
------------------------------------------------------------------ */
Modified: trunk/coregrind/m_syswrap/priv_syswrap-linux.h (+2 -1)
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -294,9 +294,10 @@
#undef UW
#undef SR
-/* sys_ipc is a multiplexor which implements several syscalls.
+/* sys_ipc and sys_socketcall are multiplexors which implements several syscalls.
Used e.g. by x86, ppc32, ppc64, ... */
DECL_TEMPLATE(linux, sys_ipc);
+DECL_TEMPLATE(linux, sys_socketcall);
#endif // __PRIV_SYSWRAP_LINUX_H
Modified: trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c (+1 -267)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -410,7 +410,6 @@
aren't visible outside this file, but that requires even more macro
magic. */
-DECL_TEMPLATE(ppc32_linux, sys_socketcall);
DECL_TEMPLATE(ppc32_linux, sys_mmap);
DECL_TEMPLATE(ppc32_linux, sys_mmap2);
DECL_TEMPLATE(ppc32_linux, sys_stat64);
@@ -424,271 +423,6 @@
DECL_TEMPLATE(ppc32_linux, sys_spu_create);
DECL_TEMPLATE(ppc32_linux, sys_spu_run);
-PRE(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- *flags |= SfMayBlock;
- PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
- PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
-
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- /* int socketpair(int d, int type, int protocol, int sv[2]); */
- PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
- break;
-
- case VKI_SYS_SOCKET:
- /* int socket(int domain, int type, int protocol); */
- PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_ACCEPT: {
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_ACCEPT4: {
- /* int accept(int s, struct sockaddr *addr, int *addrlen, int args); */
- PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_SENDTO:
- /* int sendto(int s, const void *msg, int len,
- unsigned int flags,
- const struct sockaddr *to, int tolen); */
- PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_SEND:
- /* int send(int s, const void *msg, size_t len, int flags); */
- PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_RECVFROM:
- /* int recvfrom(int s, void *buf, int len, unsigned int flags,
- struct sockaddr *from, int *fromlen); */
- PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- /* int recv(int s, void *buf, int len, unsigned int flags); */
- /* man 2 recv says:
- The recv call is normally used only on a connected socket
- (see connect(2)) and is identical to recvfrom with a NULL
- from parameter.
- */
- PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- /* int connect(int sockfd,
- struct sockaddr *serv_addr, int addrlen ); */
- PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SETSOCKOPT:
- /* int setsockopt(int s, int level, int optname,
- const void *optval, int optlen); */
- PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKOPT:
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- /* int getsockname(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- /* int getpeername(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- /* int shutdown(int s, int how); */
- PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_SENDMSG: {
- /* int sendmsg(int s, const struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- case VKI_SYS_RECVMSG: {
- /* int recvmsg(int s, struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- default:
- VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%lx\n",ARG1);
- SET_STATUS_Failure( VKI_EINVAL );
- break;
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
-POST(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
-
- SysRes r;
- vg_assert(SUCCESS);
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- r = ML_(generic_POST_sys_socketpair)(
- tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2, ARG2_3
- );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SOCKET:
- r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- break;
-
- case VKI_SYS_ACCEPT:
- case VKI_SYS_ACCEPT4:
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- SET_STATUS_from_SysRes(r);
- break;
-
- case VKI_SYS_SENDTO:
- break;
-
- case VKI_SYS_SEND:
- break;
-
- case VKI_SYS_RECVFROM:
- ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- break;
-
- case VKI_SYS_SETSOCKOPT:
- break;
-
- case VKI_SYS_GETSOCKOPT:
- ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- break;
-
- case VKI_SYS_SENDMSG:
- break;
-
- case VKI_SYS_RECVMSG:
- ML_(generic_POST_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1, RES );
- break;
-
- default:
- VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%lx\n",ARG1);
- VG_(core_panic)("... bye!\n");
- break; /*NOTREACHED*/
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
PRE(sys_mmap)
{
SysRes r;
@@ -1265,7 +999,7 @@
//..
GENXY(__NR_fstatfs, sys_fstatfs), // 100
//.. LINX_(__NR_ioperm, sys_ioperm), // 101
- PLAXY(__NR_socketcall, sys_socketcall), // 102
+ LINXY(__NR_socketcall, sys_socketcall), // 102
LINXY(__NR_syslog, sys_syslog), // 103
GENXY(__NR_setitimer, sys_setitimer), // 104
Modified: trunk/coregrind/m_syswrap/syswrap-mips32-linux.c (+1 -223)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-mips32-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-mips32-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -373,7 +373,6 @@
aren't visible outside this file, but that requires even more macro
magic. */
//DECL_TEMPLATE (mips_linux, sys_syscall);
-DECL_TEMPLATE (mips_linux, sys_socketcall);
DECL_TEMPLATE (mips_linux, sys_socket);
DECL_TEMPLATE (mips_linux, sys_setsockopt);
DECL_TEMPLATE (mips_linux, sys_getsockopt);
@@ -415,227 +414,6 @@
DECL_TEMPLATE (mips_linux, sys_set_thread_area);
DECL_TEMPLATE (mips_linux, sys_pipe);
-PRE (sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
- *flags |= SfMayBlock;
- PRINT ("sys_socketcall ( %ld, %#lx )", ARG1, ARG2);
- PRE_REG_READ2 (long, "socketcall", int, call, unsigned long *, args);
- switch (ARG1 /* request */ )
- {
- case VKI_SYS_SOCKETPAIR:
- /* int socketpair(int d, int type, int protocol, int sv[2]); */
- PRE_MEM_READ ("socketcall.socketpair(args)", ARG2,
- 4 * sizeof (Addr));
- ML_ (generic_PRE_sys_socketpair) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3);
- break;
- case VKI_SYS_SOCKET:
- /* int socket(int domain, int type, int protocol); */
- PRE_MEM_READ ("socketcall.socket(args)", ARG2, 3 * sizeof (Addr));
- break;
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- PRE_MEM_READ ("socketcall.bind(args)", ARG2, 3 * sizeof (Addr));
- ML_ (generic_PRE_sys_bind) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- PRE_MEM_READ ("socketcall.listen(args)", ARG2, 2 * sizeof (Addr));
- break;
- case VKI_SYS_ACCEPT:
- {
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- PRE_MEM_READ ("socketcall.accept(args)", ARG2, 3 * sizeof (Addr));
- ML_ (generic_PRE_sys_accept) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- }
- case VKI_SYS_SENDTO:
- /* int sendto(int s, const void *msg, int len,
- unsigned int flags,
- const struct sockaddr *to, int tolen); */
- PRE_MEM_READ ("socketcall.sendto(args)", ARG2, 6 * sizeof (Addr));
- ML_ (generic_PRE_sys_sendto) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3,
- ARG2_4, ARG2_5);
- break;
- case VKI_SYS_SEND:
- /* int send(int s, const void *msg, size_t len, int flags); */
- PRE_MEM_READ ("socketcall.send(args)", ARG2, 4 * sizeof (Addr));
- ML_ (generic_PRE_sys_send) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_RECVFROM:
- /* int recvfrom(int s, void *buf, int len, unsigned int flags,
- struct sockaddr *from, int *fromlen); */
- PRE_MEM_READ ("socketcall.recvfrom(args)", ARG2, 6 * sizeof (Addr));
- ML_ (generic_PRE_sys_recvfrom) (tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5);
- break;
- case VKI_SYS_RECV:
- /* int recv(int s, void *buf, int len, unsigned int flags); */
- /* man 2 recv says:
- The recv call is normally used only on a connected socket
- (see connect(2)) and is identical to recvfrom with a NULL
- from parameter.
- */
- PRE_MEM_READ ("socketcall.recv(args)", ARG2, 4 * sizeof (Addr));
- ML_ (generic_PRE_sys_recv) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_CONNECT:
- /* int connect(int sockfd,
- struct sockaddr *serv_addr, int addrlen ); */
- PRE_MEM_READ ("socketcall.connect(args)", ARG2, 3 * sizeof (Addr));
- ML_ (generic_PRE_sys_connect) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_SETSOCKOPT:
- /* int setsockopt(int s, int level, int optname,
- const void *optval, int optlen); */
- PRE_MEM_READ ("socketcall.setsockopt(args)", ARG2, 5 * sizeof (Addr));
- ML_ (generic_PRE_sys_setsockopt) (tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4);
- break;
- case VKI_SYS_GETSOCKOPT:
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- PRE_MEM_READ ("socketcall.getsockopt(args)", ARG2, 5 * sizeof (Addr));
- ML_ (linux_PRE_sys_getsockopt) (tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3, ARG2_4);
- break;
- case VKI_SYS_GETSOCKNAME:
- /* int getsockname(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ ("socketcall.getsockname(args)", ARG2, 3 * sizeof (Addr));
- ML_ (generic_PRE_sys_getsockname) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_GETPEERNAME:
- /* int getpeername(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ ("socketcall.getpeername(args)", ARG2, 3 * sizeof (Addr));
- ML_ (generic_PRE_sys_getpeername) (tid, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_SHUTDOWN:
- /* int shutdown(int s, int how); */
- PRE_MEM_READ ("socketcall.shutdown(args)", ARG2, 2 * sizeof (Addr));
- break;
- case VKI_SYS_SENDMSG:
- {
- /* int sendmsg(int s, const struct msghdr *msg, int flags); */
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_ (generic_PRE_sys_sendmsg) (tid, (UChar *)ARG2_0, (struct vki_msghdr *)ARG2_1);
- break;
- }
- case VKI_SYS_RECVMSG:
- {
- /* int recvmsg(int s, struct msghdr *msg, int flags); */
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_ (generic_PRE_sys_recvmsg) (tid, (UChar *)ARG2_0,
- (struct vki_msghdr *)ARG2_1);
- break;
- }
- default:
- VG_ (message) (Vg_DebugMsg, "Warning: unhandled socketcall 0x%lx", ARG1);
- SET_STATUS_Failure (VKI_EINVAL);
- break;
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
-POST (sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
- SysRes r;
- vg_assert (SUCCESS);
- switch (ARG1 /* request */ )
- {
- case VKI_SYS_SOCKETPAIR:
- r = ML_ (generic_POST_sys_socketpair) ( tid,
- VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2, ARG2_3);
- SET_STATUS_from_SysRes (r);
- break;
- case VKI_SYS_SOCKET:
- r = ML_ (generic_POST_sys_socket) (tid, VG_ (mk_SysRes_Success) (RES));
- SET_STATUS_from_SysRes (r);
- break;
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr, int addrlen); */
- break;
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- break;
- case VKI_SYS_ACCEPT:
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- r = ML_ (generic_POST_sys_accept) (tid, VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2);
- SET_STATUS_from_SysRes (r);
- break;
- case VKI_SYS_SENDTO:
- break;
- case VKI_SYS_SEND:
- break;
- case VKI_SYS_RECVFROM:
- ML_ (generic_POST_sys_recvfrom) (tid, VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2, ARG2_3,
- ARG2_4, ARG2_5);
- break;
- case VKI_SYS_RECV:
- ML_ (generic_POST_sys_recv) (tid, RES, ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_CONNECT:
- break;
- case VKI_SYS_SETSOCKOPT:
- break;
- case VKI_SYS_GETSOCKOPT:
- ML_ (linux_POST_sys_getsockopt) (tid, VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4);
- break;
- case VKI_SYS_GETSOCKNAME:
- ML_ (generic_POST_sys_getsockname) (tid, VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_GETPEERNAME:
- ML_ (generic_POST_sys_getpeername) (tid, VG_ (mk_SysRes_Success) (RES),
- ARG2_0, ARG2_1, ARG2_2);
- break;
- case VKI_SYS_SHUTDOWN:
- break;
- case VKI_SYS_SENDMSG:
- break;
- case VKI_SYS_RECVMSG:
- ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- default:
- VG_ (message) (Vg_DebugMsg, "FATAL: unhandled socketcall 0x%lx", ARG1);
- VG_ (core_panic) ("... bye!\n");
- break;
- /*NOTREACHED*/
- }
-# undef ARG2_0
-# undef ARG2_1
-# undef ARG2_2
-# undef ARG2_3
-# undef ARG2_4
-# undef ARG2_5
-}
-
PRE (sys_socket)
{
PRINT ("sys_socket ( %ld, %ld, %ld )", ARG1, ARG2, ARG3);
@@ -1372,7 +1150,7 @@
//..
GENXY (__NR_fstatfs, sys_fstatfs), // 100
//.. LINX_(__NR_ioperm, sys_ioperm), // 101
- PLAXY (__NR_socketcall, sys_socketcall), // 102
+ LINXY (__NR_socketcall, sys_socketcall), // 102
LINXY (__NR_syslog, sys_syslog), // 103
GENXY (__NR_setitimer, sys_setitimer), // 104
//..
Modified: trunk/coregrind/m_syswrap/priv_syswrap-generic.h (+1 -2)
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-generic.h 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/priv_syswrap-generic.h 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -191,7 +191,6 @@
DECL_TEMPLATE(generic, sys_statfs); // * L?
DECL_TEMPLATE(generic, sys_fstatfs); // * L?
DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L
-DECL_TEMPLATE(generic, sys_ipc); // (x86) L
DECL_TEMPLATE(generic, sys_newuname); // * P
DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?)
DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?)
@@ -210,7 +209,7 @@
/* ---------------------------------------------------------------------
Wrappers for sockets and ipc-ery. These are split into standalone
- procedures because x86-linux hides them inside multiplexors
+ procedures because some platforms hides them inside multiplexors
(sys_socketcall and sys_ipc).
------------------------------------------------------------------ */
Modified: trunk/coregrind/m_syswrap/syswrap-arm-linux.c (+1 -267)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-arm-linux.c 2012-11-03 19:32:28 +00:00 (rev 13103)
+++ trunk/coregrind/m_syswrap/syswrap-arm-linux.c 2012-11-04 20:40:33 +00:00 (rev 13104)
@@ -344,7 +344,6 @@
aren't visible outside this file, but that requires even more macro
magic. */
-DECL_TEMPLATE(arm_linux, sys_socketcall);
DECL_TEMPLATE(arm_linux, sys_socket);
DECL_TEMPLATE(arm_linux, sys_setsockopt);
DECL_TEMPLATE(arm_linux, sys_getsockopt);
@@ -392,272 +391,7 @@
DECL_TEMPLATE(arm_linux, sys_cacheflush);
DECL_TEMPLATE(arm_linux, sys_ptrace);
-PRE(sys_socketcall)
-{
-# define ARG2_0 (((UWord*)ARG2)[0])
-# define ARG2_1 (((UWord*)ARG2)[1])
-# define ARG2_2 (((UWord*)ARG2)[2])
-# define ARG2_3 (((UWord*)ARG2)[3])
-# define ARG2_4 (((UWord*)ARG2)[4])
-# define ARG2_5 (((UWord*)ARG2)[5])
- *flags |= SfMayBlock;
- PRINT("sys_socketcall ( %ld, %#lx )",ARG1,ARG2);
- PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
-
- switch (ARG1 /* request */) {
-
- case VKI_SYS_SOCKETPAIR:
- /* int socketpair(int d, int type, int protocol, int sv[2]); */
- PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
- break;
-
- case VKI_SYS_SOCKET:
- /* int socket(int domain, int type, int protocol); */
- PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
- break;
-
- case VKI_SYS_BIND:
- /* int bind(int sockfd, struct sockaddr *my_addr,
- int addrlen); */
- PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_LISTEN:
- /* int listen(int s, int backlog); */
- PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_ACCEPT: {
- /* int accept(int s, struct sockaddr *addr, int *addrlen); */
- PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_ACCEPT4: {
- /*int accept(int s, struct sockaddr *add, int *addrlen, int flags)*/
- PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
- }
-
- case VKI_SYS_SENDTO:
- /* int sendto(int s, const void *msg, int len,
- unsigned int flags,
- const struct sockaddr *to, int tolen); */
- PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_SEND:
- /* int send(int s, const void *msg, size_t len, int flags); */
- PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_RECVFROM:
- /* int recvfrom(int s, void *buf, int len, unsigned int flags,
- struct sockaddr *from, int *fromlen); */
- PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
- ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4, ARG2_5 );
- break;
-
- case VKI_SYS_RECV:
- /* int recv(int s, void *buf, int len, unsigned int flags); */
- /* man 2 recv says:
- The recv call is normally used only on a connected socket
- (see connect(2)) and is identical to recvfrom with a NULL
- from parameter.
- */
- PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
- ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_CONNECT:
- /* int connect(int sockfd,
- struct sockaddr *serv_addr, int addrlen ); */
- PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SETSOCKOPT:
- /* int setsockopt(int s, int level, int optname,
- const void *optval, int optlen); */
- PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKOPT:
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
- break;
-
- case VKI_SYS_GETSOCKNAME:
- /* int getsockname(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_GETPEERNAME:
- /* int getpeername(int s, struct sockaddr* name, int* namelen) */
- PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
- ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
- break;
-
- case VKI_SYS_SHUTDOWN:
- /* int shutdown(int s, int how); */
- PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
- break;
-
- case VKI_SYS_SENDMSG: {
- /* int sendmsg(int s, const struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_sendmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
-
- case VKI_SYS_RECVMSG: {
- /* int recvmsg(int s, struct msghdr *msg, int flags); */
-
- /* this causes warnings, and I don't get why. glibc bug?
- * (after all it's glibc providing the arguments array)
- PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
- */
- ML_(generic_PRE_sys_recvmsg)( tid, "msg", (struct vki_msghdr *)ARG2_1 );
- break;
- }
...
[truncated message content] |