PERFORCE change 152437 for review
Peter Wemm
peter at FreeBSD.org
Mon Nov 3 15:00:38 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=152437
Change 152437 by peter at peter_overcee on 2008/11/03 23:00:10
Begin fleshing out umtx op wrappers and side effects
Affected files ...
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#21 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#21 (text+ko) ====
@@ -1774,96 +1774,155 @@
PRE(sys__umtx_op)
{
+ /* 5 args are always passed through. The last two can vary, but
+ they're always pointers. They may not be used though. */
switch(ARG2) {
case VKI_UMTX_OP_LOCK:
PRINT( "sys__umtx_op ( %#lx, LOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRE_REG_READ5(long, "_umtx_op_lock",
+ struct umtx *, obj, int, op, unsigned long, id,
+ void *, zero, struct vki_timespec *, timeout);
+ PRE_MEM_READ( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
+ if (ARG5)
+ PRE_MEM_READ( "_umtx_op_lock(timespec)", ARG5, sizeof(struct vki_timespec) );
+ PRE_MEM_WRITE( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
break;
case VKI_UMTX_OP_UNLOCK:
- PRINT( "sys__umtx_op ( %#lx, UNLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, UNLOCK, %ld)", ARG1, ARG3);
+ PRE_REG_READ3(long, "_umtx_op_unlock",
+ struct umtx *, obj, int, op, unsigned long, id);
+ PRE_MEM_READ( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
+ PRE_MEM_WRITE( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
break;
case VKI_UMTX_OP_WAIT:
PRINT( "sys__umtx_op ( %#lx, WAIT, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRE_REG_READ5(long, "_umtx_op_wait",
+ struct umtx *, obj, int, op, unsigned long, id,
+ void *, zero, struct vki_timespec *, timeout);
+ PRE_MEM_READ( "_umtx_op_wait(mtx)", ARG1, sizeof(struct vki_umtx) );
+ if (ARG5)
+ PRE_MEM_READ( "_umtx_op_wait(timespec)", ARG5, sizeof(struct vki_timespec) );
break;
case VKI_UMTX_OP_WAKE:
- PRINT( "sys__umtx_op ( %#lx, WAKE, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, WAKE, %ld)", ARG1, ARG3);
+ PRE_REG_READ3(long, "_umtx_op_wake",
+ struct umtx *, obj, int, op, unsigned long, id);
+ PRE_MEM_READ( "_umtx_op_wake(mtx)", ARG1, sizeof(struct vki_umtx) );
break;
case VKI_UMTX_OP_MUTEX_TRYLOCK:
- PRINT( "sys__umtx_op ( %#lx, MUTEX_TRYLOCK, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, MUTEX_TRYLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_MUTEX_LOCK:
- PRINT( "sys__umtx_op ( %#lx, MUTEX_LOCK, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, MUTEX_LOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_MUTEX_UNLOCK:
- PRINT( "sys__umtx_op ( %#lx, MUTEX_UNLOCK, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, MUTEX_UNLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_SET_CEILING:
- PRINT( "sys__umtx_op ( %#lx, SET_CEILING, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, SET_CEILING, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_CV_WAIT:
PRINT( "sys__umtx_op ( %#lx, CV_WAIT, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_CV_SIGNAL:
- PRINT( "sys__umtx_op ( %#lx, CV_SIGNAL, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, CV_SIGNAL, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_CV_BROADCAST:
- PRINT( "sys__umtx_op ( %#lx, CV_BROADCAST, %ld, %#lx, %#lx)",
- ARG1, ARG3, ARG4, ARG5);
+ PRINT( "sys__umtx_op ( %#lx, CV_BROADCAST, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_WAIT_UINT:
- PRINT( "sys__umtx_op ( %#lx, CV_WAIT_UINT)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_WAIT_UINT, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRE_REG_READ5(long, "_umtx_op_wait_uint",
+ int *, obj, int, op, unsigned long, id,
+ void *, zero, struct vki_timespec *, timeout);
+ PRE_MEM_READ( "_umtx_op_wait(uint)", ARG1, sizeof(int) );
+ if (ARG5)
+ PRE_MEM_READ( "_umtx_op_wait(timespec)", ARG5, sizeof(struct vki_timespec) );
break;
case VKI_UMTX_OP_RW_RDLOCK:
- PRINT( "sys__umtx_op ( %#lx, CV_RW_RDLOCK)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_RW_RDLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_RW_WRLOCK:
- PRINT( "sys__umtx_op ( %#lx, CV_RW_WRLOCK)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_RW_WRLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_RW_UNLOCK:
- PRINT( "sys__umtx_op ( %#lx, CV_RW_UNLOCK)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_RW_UNLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_WAIT_UINT_PRIVATE:
- PRINT( "sys__umtx_op ( %#lx, CV_WAIT_UINT_PRIVATE)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_WAIT_UINT_PRIVATE, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
+ PRE_REG_READ5(long, "_umtx_op_wait_uint_private",
+ int *, obj, int, op, unsigned long, id,
+ void *, zero, struct vki_timespec *, timeout);
+ PRE_MEM_READ( "_umtx_op_wait_private(uint)", ARG1, sizeof(int) );
+ if (ARG5)
+ PRE_MEM_READ( "_umtx_op_wait_private(timespec)", ARG5, sizeof(struct vki_timespec) );
break;
case VKI_UMTX_OP_WAKE_PRIVATE:
- PRINT( "sys__umtx_op ( %#lx, CV_WAKE_PRIVATE)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_WAKE_PRIVATE, %ld)", ARG1, ARG3);
+ PRE_REG_READ3(long, "_umtx_op_wake_private",
+ struct umtx *, obj, int, op, unsigned long, id);
+ PRE_MEM_READ( "_umtx_op_wake_private(mtx)", ARG1, sizeof(struct vki_umtx) );
break;
case VKI_UMTX_OP_MUTEX_WAIT:
- PRINT( "sys__umtx_op ( %#lx, CV_MUTEX_WAIT)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_MUTEX_WAIT, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
case VKI_UMTX_OP_MUTEX_WAKE:
- PRINT( "sys__umtx_op ( %#lx, CV_MUTEX_WAKE)", ARG1);
+ PRINT( "sys__umtx_op ( %#lx, CV_MUTEX_WAKE, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5);
break;
default:
- /* XXX: PHK ?? */
- break;
+ PRINT( "sys__umtx_op ( %#lx, %ld(UNKNOWN), %ld, %#lx, %#lx )", ARG1, ARG2, ARG3, ARG4, ARG5);
+ break;
}
}
POST(sys__umtx_op)
{
+ switch(ARG2) {
+ case VKI_UMTX_OP_LOCK:
+ if (SUCCESS)
+ POST_MEM_WRITE( ARG1, sizeof(struct vki_umtx) );
+ break;
+ case VKI_UMTX_OP_UNLOCK:
+ if (SUCCESS)
+ POST_MEM_WRITE( ARG1, sizeof(struct vki_umtx) );
+ break;
+ case VKI_UMTX_OP_WAIT:
+ case VKI_UMTX_OP_WAKE:
+ case VKI_UMTX_OP_WAIT_UINT:
+ case VKI_UMTX_OP_WAIT_UINT_PRIVATE:
+ case VKI_UMTX_OP_WAKE_PRIVATE:
+ break;
+ default:
+ break;
+ }
}
PRE(sys__umtx_lock)
{
PRINT( "sys__umtx_lock ( %#lx )", ARG1);
+ PRE_REG_READ1(long, "_umtx_lock", struct vki_umtx *, umtx);
+ PRE_MEM_READ( "_umtx_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
+ PRE_MEM_WRITE( "_umtx_lock(mtx)", ARG1, sizeof(struct vki_umtx) );
}
POST(sys__umtx_lock)
{
+ if (SUCCESS)
+ POST_MEM_WRITE(ARG1, sizeof(struct vki_umtx));
}
PRE(sys__umtx_unlock)
{
PRINT( "sys__umtx_unlock ( %#lx )", ARG1);
+ PRE_REG_READ1(long, "_umtx_unlock", struct vki_umtx *, umtx);
+ PRE_MEM_READ( "_umtx_unlock(mtx)", ARG1, sizeof(struct vki_umtx) );
+ PRE_MEM_WRITE( "_umtx_unlock(mtx)", ARG1, sizeof(struct vki_umtx) );
}
POST(sys__umtx_unlock)
{
+ if (SUCCESS)
+ POST_MEM_WRITE(ARG1, sizeof(struct vki_umtx));
}
PRE(sys_rtprio_thread)
More information about the p4-projects
mailing list