Darwin-specific parts.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9186
ML_(notify_aspacem_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
UInt mm_flags, Int fd, Off64T offset );
+extern void
+ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
+ Char* buf_s, Char* buflen_s );
+extern void
+ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
+ Addr buf_p, Addr buflen_p, Char* s );
+
DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented
DECL_TEMPLATE(generic, sys_exit);
extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW );
extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW );
-extern void ML_(generic_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
-extern void ML_(generic_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW );
extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW );
extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW );
#define UW UWord
#define SR SysRes
-extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW );
-extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW );
-extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW );
-extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW );
-extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW );
+extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW );
+extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW );
+extern void ML_(linux_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
+extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
#undef TId
#undef UW
PRE_REG_READ5(long, "getsockopt",
int, s, int, level, int, optname,
void *, optval, int, *optlen);
- ML_(generic_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
+ ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
}
POST(sys_getsockopt)
{
vg_assert(SUCCESS);
- ML_(generic_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
- ARG1,ARG2,ARG3,ARG4,ARG5);
+ ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
+ ARG1,ARG2,ARG3,ARG4,ARG5);
}
PRE(sys_connect)
return *a_p;
}
-static
-void buf_and_len_pre_check( ThreadId tid, Addr buf_p, Addr buflen_p,
- Char* buf_s, Char* buflen_s )
+void ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
+ Char* buf_s, Char* buflen_s )
{
if (VG_(tdict).track_pre_mem_write) {
UInt buflen_in = deref_UInt( tid, buflen_p, buflen_s);
}
}
-static
-void buf_and_len_post_check( ThreadId tid, SysRes res,
- Addr buf_p, Addr buflen_p, Char* s )
+void ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
+ Addr buf_p, Addr buflen_p, Char* s )
{
if (!res.isError && VG_(tdict).track_post_mem_write) {
UInt buflen_out = deref_UInt( tid, buflen_p, s);
Addr addr_p = arg1;
Addr addrlen_p = arg2;
if (addr_p != (Addr)NULL)
- buf_and_len_pre_check ( tid, addr_p, addrlen_p,
- "socketcall.accept(addr)",
- "socketcall.accept(addrlen_in)" );
+ ML_(buf_and_len_pre_check) ( tid, addr_p, addrlen_p,
+ "socketcall.accept(addr)",
+ "socketcall.accept(addrlen_in)" );
}
SysRes
Addr addr_p = arg1;
Addr addrlen_p = arg2;
if (addr_p != (Addr)NULL)
- buf_and_len_post_check ( tid, res, addr_p, addrlen_p,
- "socketcall.accept(addrlen_out)" );
+ ML_(buf_and_len_post_check) ( tid, res, addr_p, addrlen_p,
+ "socketcall.accept(addrlen_out)" );
if (VG_(clo_track_fds))
ML_(record_fd_open_nameless)(tid, res.res);
}
Addr fromlen_p = arg5;
PRE_MEM_WRITE( "socketcall.recvfrom(buf)", buf_p, len );
if (from_p != (Addr)NULL)
- buf_and_len_pre_check ( tid, from_p, fromlen_p,
- "socketcall.recvfrom(from)",
- "socketcall.recvfrom(fromlen_in)" );
+ ML_(buf_and_len_pre_check) ( tid, from_p, fromlen_p,
+ "socketcall.recvfrom(from)",
+ "socketcall.recvfrom(fromlen_in)" );
}
void
vg_assert(!res.isError); /* guaranteed by caller */
if (from_p != (Addr)NULL)
- buf_and_len_post_check ( tid, res, from_p, fromlen_p,
- "socketcall.recvfrom(fromlen_out)" );
+ ML_(buf_and_len_post_check) ( tid, res, from_p, fromlen_p,
+ "socketcall.recvfrom(fromlen_out)" );
POST_MEM_WRITE( buf_p, len );
}
/* ------ */
-void
-ML_(generic_PRE_sys_getsockopt) ( ThreadId tid,
- UWord arg0, UWord arg1, UWord arg2,
- UWord arg3, UWord arg4 )
-{
- /* int getsockopt(int s, int level, int optname,
- void *optval, socklen_t *optlen); */
- Addr optval_p = arg3;
- Addr optlen_p = arg4;
- /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
- if (optval_p != (Addr)NULL) {
- buf_and_len_pre_check ( tid, optval_p, optlen_p,
- "socketcall.getsockopt(optval)",
- "socketcall.getsockopt(optlen)" );
- if (arg1 == VKI_SOL_SCTP &&
- (arg2 == VKI_SCTP_GET_PEER_ADDRS || arg2 == VKI_SCTP_GET_LOCAL_ADDRS)) {
- struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
- int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
- PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)", (Addr)ga->addrs, address_bytes );
- }
- }
-}
-
-void
-ML_(generic_POST_sys_getsockopt) ( ThreadId tid,
- SysRes res,
- UWord arg0, UWord arg1, UWord arg2,
- UWord arg3, UWord arg4 )
-{
- Addr optval_p = arg3;
- Addr optlen_p = arg4;
- vg_assert(!res.isError); /* guaranteed by caller */
- if (optval_p != (Addr)NULL) {
- buf_and_len_post_check ( tid, res, optval_p, optlen_p,
- "socketcall.getsockopt(optlen_out)" );
- if (arg1 == VKI_SOL_SCTP &&
- (arg2 == VKI_SCTP_GET_PEER_ADDRS || arg2 == VKI_SCTP_GET_LOCAL_ADDRS)) {
- struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
- struct vki_sockaddr *a = ga->addrs;
- int i;
- for (i = 0; i < ga->addr_num; i++) {
- int sl = 0;
- if (a->sa_family == VKI_AF_INET)
- sl = sizeof(struct vki_sockaddr_in);
- else if (a->sa_family == VKI_AF_INET6)
- sl = sizeof(struct vki_sockaddr_in6);
- else {
- VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled address type %d", a->sa_family);
- }
- a = (struct vki_sockaddr*)((char*)a + sl);
- }
- POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
- }
- }
-}
-
-/* ------ */
-
void
ML_(generic_PRE_sys_getsockname) ( ThreadId tid,
UWord arg0, UWord arg1, UWord arg2 )
Addr name_p = arg1;
Addr namelen_p = arg2;
/* Nb: name_p cannot be NULL */
- buf_and_len_pre_check ( tid, name_p, namelen_p,
- "socketcall.getsockname(name)",
- "socketcall.getsockname(namelen_in)" );
+ ML_(buf_and_len_pre_check) ( tid, name_p, namelen_p,
+ "socketcall.getsockname(name)",
+ "socketcall.getsockname(namelen_in)" );
}
void
Addr name_p = arg1;
Addr namelen_p = arg2;
vg_assert(!res.isError); /* guaranteed by caller */
- buf_and_len_post_check ( tid, res, name_p, namelen_p,
- "socketcall.getsockname(namelen_out)" );
+ ML_(buf_and_len_post_check) ( tid, res, name_p, namelen_p,
+ "socketcall.getsockname(namelen_out)" );
}
/* ------ */
Addr name_p = arg1;
Addr namelen_p = arg2;
/* Nb: name_p cannot be NULL */
- buf_and_len_pre_check ( tid, name_p, namelen_p,
- "socketcall.getpeername(name)",
- "socketcall.getpeername(namelen_in)" );
+ ML_(buf_and_len_pre_check) ( tid, name_p, namelen_p,
+ "socketcall.getpeername(name)",
+ "socketcall.getpeername(namelen_in)" );
}
void
Addr name_p = arg1;
Addr namelen_p = arg2;
vg_assert(!res.isError); /* guaranteed by caller */
- buf_and_len_post_check ( tid, res, name_p, namelen_p,
- "socketcall.getpeername(namelen_out)" );
+ ML_(buf_and_len_post_check) ( tid, res, name_p, namelen_p,
+ "socketcall.getpeername(namelen_out)" );
}
/* ------ */
}
#endif
+/* ---------------------------------------------------------------------
+ socketcall wrapper helpers
+ ------------------------------------------------------------------ */
+
+void
+ML_(linux_PRE_sys_getsockopt) ( ThreadId tid,
+ UWord arg0, UWord arg1, UWord arg2,
+ UWord arg3, UWord arg4 )
+{
+ /* int getsockopt(int s, int level, int optname,
+ void *optval, socklen_t *optlen); */
+ Addr optval_p = arg3;
+ Addr optlen_p = arg4;
+ /* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
+ if (optval_p != (Addr)NULL) {
+ ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
+ "socketcall.getsockopt(optval)",
+ "socketcall.getsockopt(optlen)" );
+ if (arg1 == VKI_SOL_SCTP &&
+ (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
+ arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
+ {
+ struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
+ int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
+ PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)",
+ (Addr)ga->addrs, address_bytes );
+ }
+ }
+}
+
+void
+ML_(linux_POST_sys_getsockopt) ( ThreadId tid,
+ SysRes res,
+ UWord arg0, UWord arg1, UWord arg2,
+ UWord arg3, UWord arg4 )
+{
+ Addr optval_p = arg3;
+ Addr optlen_p = arg4;
+ vg_assert(!res.isError); /* guaranteed by caller */
+ if (optval_p != (Addr)NULL) {
+ ML_(buf_and_len_post_check) ( tid, res, optval_p, optlen_p,
+ "socketcall.getsockopt(optlen_out)" );
+ if (arg1 == VKI_SOL_SCTP &&
+ (arg2 == VKI_SCTP_GET_PEER_ADDRS ||
+ arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
+ {
+ struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
+ struct vki_sockaddr *a = ga->addrs;
+ int i;
+ for (i = 0; i < ga->addr_num; i++) {
+ int sl = 0;
+ if (a->sa_family == VKI_AF_INET)
+ sl = sizeof(struct vki_sockaddr_in);
+ else if (a->sa_family == VKI_AF_INET6)
+ sl = sizeof(struct vki_sockaddr_in6);
+ else {
+ VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled address type %d", a->sa_family);
+ }
+ a = (struct vki_sockaddr*)((char*)a + sl);
+ }
+ POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
+ }
+ }
+}
+
+
#undef PRE
#undef POST
/* int getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen); */
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
+ ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
break;
case VKI_SYS_GETSOCKNAME:
break;
case VKI_SYS_GETSOCKOPT:
- ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
+ 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:
/* int getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen); */
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
+ ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
break;
case VKI_SYS_GETSOCKNAME:
break;
case VKI_SYS_GETSOCKOPT:
- ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
+ 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:
/* int getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen); */
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
- ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
- ARG2_3, ARG2_4 );
+ ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
+ ARG2_3, ARG2_4 );
break;
case VKI_SYS_GETSOCKNAME:
break;
case VKI_SYS_GETSOCKOPT:
- ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
- ARG2_0, ARG2_1,
- ARG2_2, ARG2_3, ARG2_4 );
+ 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: