|
From: <sv...@va...> - 2009-05-22 08:12:54
|
Author: njn
Date: 2009-05-22 09:12:46 +0100 (Fri, 22 May 2009)
New Revision: 10106
Log:
DARWIN sync: all the timeval stuff
Modified:
trunk/coregrind/m_syswrap/priv_syswrap-generic.h
trunk/coregrind/m_syswrap/priv_types_n_macros.h
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/memcheck/tests/x86-linux/scalar.c
trunk/memcheck/tests/x86-linux/scalar.stderr.exp
Modified: trunk/coregrind/m_syswrap/priv_syswrap-generic.h
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-generic.h 2009-05-22 08:07:13 UTC (rev 10105)
+++ trunk/coregrind/m_syswrap/priv_syswrap-generic.h 2009-05-22 08:12:46 UTC (rev 10106)
@@ -252,6 +252,26 @@
extern SysRes ML_(generic_PRE_sys_mmap) ( TId, UW, UW, UW, UW, UW, Off64T );
+#define PRE_timeval_READ(zzname, zzarg) \
+ do { \
+ struct vki_timeval *zztv = (struct vki_timeval *)zzarg; \
+ PRE_FIELD_READ(zzname, zztv->tv_sec); \
+ PRE_FIELD_READ(zzname, zztv->tv_usec); \
+ } while (0)
+#define PRE_timeval_WRITE(zzname, zzarg) \
+ do { \
+ struct vki_timeval *zztv = (struct vki_timeval *)zzarg; \
+ PRE_FIELD_WRITE(zzname, zztv->tv_sec); \
+ PRE_FIELD_WRITE(zzname, zztv->tv_usec); \
+ } while (0)
+#define POST_timeval_WRITE(zzarg) \
+ do { \
+ struct vki_timeval *zztv = (struct vki_timeval *)zzarg; \
+ POST_FIELD_WRITE(zztv->tv_sec); \
+ POST_FIELD_WRITE(zztv->tv_usec); \
+ } while (0)
+
+
#undef TId
#undef UW
#undef SR
Modified: trunk/coregrind/m_syswrap/priv_types_n_macros.h
===================================================================
--- trunk/coregrind/m_syswrap/priv_types_n_macros.h 2009-05-22 08:07:13 UTC (rev 10105)
+++ trunk/coregrind/m_syswrap/priv_types_n_macros.h 2009-05-22 08:12:46 UTC (rev 10106)
@@ -453,6 +453,16 @@
VG_TRACK( post_mem_write, Vg_CoreSysCall, tid, zzaddr, zzlen)
+#define PRE_FIELD_READ(zzname, zzfield) \
+ PRE_MEM_READ(zzname, (UWord)&zzfield, sizeof(zzfield))
+
+#define PRE_FIELD_WRITE(zzname, zzfield) \
+ PRE_MEM_WRITE(zzname, (UWord)&zzfield, sizeof(zzfield))
+
+#define POST_FIELD_WRITE(zzfield) \
+ POST_MEM_WRITE((UWord)&zzfield, sizeof(zzfield))
+
+
#endif // __PRIV_TYPES_N_MACROS_H
/*--------------------------------------------------------------------*/
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-generic.c 2009-05-22 08:07:13 UTC (rev 10105)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2009-05-22 08:12:46 UTC (rev 10106)
@@ -2129,14 +2129,19 @@
PRE(sys_getitimer)
{
+ struct vki_itimerval *value = (struct vki_itimerval*)ARG2;
PRINT("sys_getitimer ( %ld, %#lx )", ARG1, ARG2);
PRE_REG_READ2(long, "getitimer", int, which, struct itimerval *, value);
- PRE_MEM_WRITE( "getitimer(value)", ARG2, sizeof(struct vki_itimerval) );
+
+ PRE_timeval_WRITE( "getitimer(&value->it_interval)", &(value->it_interval));
+ PRE_timeval_WRITE( "getitimer(&value->it_value)", &(value->it_value));
}
POST(sys_getitimer)
{
if (ARG2 != (Addr)NULL) {
- POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerval));
+ struct vki_itimerval *value = (struct vki_itimerval*)ARG2;
+ POST_timeval_WRITE( &(value->it_interval) );
+ POST_timeval_WRITE( &(value->it_value) );
}
}
@@ -2146,16 +2151,28 @@
PRE_REG_READ3(long, "setitimer",
int, which,
struct itimerval *, value, struct itimerval *, ovalue);
- if (ARG2 != (Addr)NULL)
- PRE_MEM_READ( "setitimer(value)", ARG2, sizeof(struct vki_itimerval) );
- if (ARG3 != (Addr)NULL)
- PRE_MEM_WRITE( "setitimer(ovalue)", ARG3, sizeof(struct vki_itimerval));
+ if (ARG2 != (Addr)NULL) {
+ struct vki_itimerval *value = (struct vki_itimerval*)ARG2;
+ PRE_timeval_READ( "setitimer(&value->it_interval)",
+ &(value->it_interval));
+ PRE_timeval_READ( "setitimer(&value->it_value)",
+ &(value->it_value));
+ }
+ if (ARG3 != (Addr)NULL) {
+ struct vki_itimerval *ovalue = (struct vki_itimerval*)ARG3;
+ PRE_timeval_WRITE( "setitimer(&ovalue->it_interval)",
+ &(ovalue->it_interval));
+ PRE_timeval_WRITE( "setitimer(&ovalue->it_value)",
+ &(ovalue->it_value));
+ }
}
POST(sys_setitimer)
{
if (ARG3 != (Addr)NULL) {
- POST_MEM_WRITE(ARG3, sizeof(struct vki_itimerval));
+ struct vki_itimerval *ovalue = (struct vki_itimerval*)ARG3;
+ POST_timeval_WRITE( &(ovalue->it_interval) );
+ POST_timeval_WRITE( &(ovalue->it_value) );
}
}
@@ -3046,7 +3063,8 @@
PRINT("sys_gettimeofday ( %#lx, %#lx )", ARG1,ARG2);
PRE_REG_READ2(long, "gettimeofday",
struct timeval *, tv, struct timezone *, tz);
- PRE_MEM_WRITE( "gettimeofday(tv)", ARG1, sizeof(struct vki_timeval) );
+ if (ARG1 != 0)
+ PRE_timeval_WRITE( "gettimeofday(tv)", ARG1 );
if (ARG2 != 0)
PRE_MEM_WRITE( "gettimeofday(tz)", ARG2, sizeof(struct vki_timezone) );
}
@@ -3055,7 +3073,8 @@
{
vg_assert(SUCCESS);
if (RES == 0) {
- POST_MEM_WRITE( ARG1, sizeof(struct vki_timeval) );
+ if (ARG1 != 0)
+ POST_timeval_WRITE( ARG1 );
if (ARG2 != 0)
POST_MEM_WRITE( ARG2, sizeof(struct vki_timezone) );
}
@@ -3066,7 +3085,8 @@
PRINT("sys_settimeofday ( %#lx, %#lx )", ARG1,ARG2);
PRE_REG_READ2(long, "settimeofday",
struct timeval *, tv, struct timezone *, tz);
- PRE_MEM_READ( "settimeofday(tv)", ARG1, sizeof(struct vki_timeval) );
+ if (ARG1 != 0)
+ PRE_MEM_READ( "settimeofday(tv)", ARG1, sizeof(struct vki_timeval) );
if (ARG2 != 0) {
PRE_MEM_READ( "settimeofday(tz)", ARG2, sizeof(struct vki_timezone) );
/* maybe should warn if tz->tz_dsttime is non-zero? */
@@ -3632,7 +3652,7 @@
PRE_MEM_READ( "select(exceptfds)",
ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
if (ARG5 != 0)
- PRE_MEM_READ( "select(timeout)", ARG5, sizeof(struct vki_timeval) );
+ PRE_timeval_READ( "select(timeout)", ARG5 );
}
PRE(sys_setgid)
@@ -3895,8 +3915,11 @@
PRINT("sys_utimes ( %#lx(%s), %#lx )", ARG1,(char*)ARG1,ARG2);
PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp);
PRE_MEM_RASCIIZ( "utimes(filename)", ARG1 );
- if (ARG2 != 0)
- PRE_MEM_READ( "utimes(tvp)", ARG2, 2 * sizeof(struct vki_timeval) );
+ if (ARG2 != 0) {
+ PRE_timeval_READ( "utimes(tvp[0])", ARG2 );
+ PRE_timeval_READ( "utimes(tvp[1])", ARG2+sizeof(struct vki_timeval) );
+ }
+
}
PRE(sys_acct)
Modified: trunk/memcheck/tests/x86-linux/scalar.c
===================================================================
--- trunk/memcheck/tests/x86-linux/scalar.c 2009-05-22 08:07:13 UTC (rev 10105)
+++ trunk/memcheck/tests/x86-linux/scalar.c 2009-05-22 08:12:46 UTC (rev 10106)
@@ -371,11 +371,11 @@
// __NR_gettimeofday 78
GO(__NR_gettimeofday, "2s 2m");
- SY(__NR_gettimeofday, x0, x0+1); FAIL;
+ SY(__NR_gettimeofday, x0+1, x0+1); FAIL;
// __NR_settimeofday 79
GO(__NR_settimeofday, "2s 2m");
- SY(__NR_settimeofday, x0, x0+1); FAIL;
+ SY(__NR_settimeofday, x0+1, x0+1); FAIL;
// __NR_getgroups 80
GO(__NR_getgroups, "2s 1m");
Modified: trunk/memcheck/tests/x86-linux/scalar.stderr.exp
===================================================================
--- trunk/memcheck/tests/x86-linux/scalar.stderr.exp 2009-05-22 08:07:13 UTC (rev 10105)
+++ trunk/memcheck/tests/x86-linux/scalar.stderr.exp 2009-05-22 08:12:46 UTC (rev 10106)
@@ -978,13 +978,21 @@
Syscall param setitimer(ovalue) contains uninitialised byte(s)
...
-Syscall param setitimer(value) points to unaddressable byte(s)
+Syscall param setitimer(&value->it_interval) points to unaddressable byte(s)
...
Address 0x........ is not stack'd, malloc'd or (recently) free'd
-Syscall param setitimer(ovalue) points to unaddressable byte(s)
+Syscall param setitimer(&value->it_value) points to unaddressable byte(s)
...
Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param setitimer(&ovalue->it_interval) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param setitimer(&ovalue->it_value) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
105: __NR_getitimer 2s 1m
-----------------------------------------------------
@@ -995,9 +1003,13 @@
Syscall param getitimer(value) contains uninitialised byte(s)
...
-Syscall param getitimer(value) points to unaddressable byte(s)
+Syscall param getitimer(&value->it_interval) points to unaddressable byte(s)
...
Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param getitimer(&value->it_value) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
106: __NR_stat 2s 2m
-----------------------------------------------------
@@ -3085,9 +3097,13 @@
...
Address 0x........ is not stack'd, malloc'd or (recently) free'd
-Syscall param utimes(tvp) points to unaddressable byte(s)
+Syscall param utimes(tvp[0]) points to unaddressable byte(s)
...
Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param utimes(tvp[1]) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
272: __NR_fadvise64_64 n/a
-----------------------------------------------------
|