Author: sewardj
Date: 2007-09-27 20:09:01 +0100 (Thu, 27 Sep 2007)
New Revision: 6924

Log:
Add a test for correct handling of XCHG on x86/amd64.

Added:
   branches/THRCHECK/thrcheck/tests/tc11_XCHG.c
   branches/THRCHECK/thrcheck/tests/tc11_XCHG.stderr.exp
   branches/THRCHECK/thrcheck/tests/tc11_XCHG.stdout.exp
Modified:
   branches/THRCHECK/thrcheck/tests/Makefile.am


Modified: branches/THRCHECK/thrcheck/tests/Makefile.am
===================================================================
--- branches/THRCHECK/thrcheck/tests/Makefile.am        2007-09-27 08:06:03 UTC 
(rev 6923)
+++ branches/THRCHECK/thrcheck/tests/Makefile.am        2007-09-27 19:09:01 UTC 
(rev 6924)
@@ -30,7 +30,9 @@
        tc09_bad_unlock.vgtest tc09_bad_unlock.stderr.exp \
                tc09_bad_unlock.stdout.exp \
        tc10_rec_lock.vgtest tc10_rec_lock.stderr.exp \
-               tc10_rec_lock.stdout.exp
+               tc10_rec_lock.stdout.exp \
+       tc11_XCHG.vgtest tc11_XCHG.stderr.exp \
+               tc11_XCHG.stdout.exp
 
 check_PROGRAMS = \
        hg01_all_ok \
@@ -48,7 +50,8 @@
        tc07_hbl1 \
        tc08_hbl2 \
        tc09_bad_unlock \
-       tc10_rec_lock
+       tc10_rec_lock \
+       tc11_XCHG
 
 # is this necessary?
 AM_CFLAGS      = $(WERROR) -Winline -Wall -Wshadow -g      $(AM_FLAG_M3264_PRI)

Added: branches/THRCHECK/thrcheck/tests/tc11_XCHG.c
===================================================================
--- branches/THRCHECK/thrcheck/tests/tc11_XCHG.c                                
(rev 0)
+++ branches/THRCHECK/thrcheck/tests/tc11_XCHG.c        2007-09-27 19:09:01 UTC 
(rev 6924)
@@ -0,0 +1,86 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* Simple test program, no race.  Parent and child both modify x and
+   use the hardware bus lock (implicitly, since XCHG r,m on x86/amd64
+   does not require an explicit LOCK prefix.). */
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+#  define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+#  define PLAT_amd64_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
+#  define PLAT_ppc32_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
+#  define PLAT_ppc64_linux 1
+#elif defined(_AIX) && defined(__64BIT__)
+#  define PLAT_ppc64_aix5 1
+#elif defined(_AIX) && !defined(__64BIT__)
+#  define PLAT_ppc32_aix5 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+#  define XCHG_M_R(_addr,_lval) \
+     __asm__ __volatile__( \
+        "xchgl %0, %1" \
+        : /*out*/ "+r"(_lval) \
+        : /*in*/  "m"(_addr) \
+        : "memory", "cc" \
+     )
+#  define XCHG_M_R_with_redundant_LOCK(_addr,_lval) \
+     __asm__ __volatile__( \
+        "lock xchgl %0, %1" \
+        : /*out*/ "+r"(_lval) \
+        : /*in*/  "m"(_addr) \
+        : "memory", "cc" \
+     )
+#else
+#  error "Fix Me for this platform"
+#endif
+
+int x = 0;
+
+void* child_fn ( void* arg )
+{
+   int v = 12345;
+   XCHG_M_R_with_redundant_LOCK(x, v);
+   assert(v == 0 || v == 6789);
+   return NULL;
+}
+
+int main ( void )
+{
+   int v = 6789;
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   XCHG_M_R(x, v);
+   assert(v == 0 || v == 12345);
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   if (v == 0 || v == 12345)
+      printf("success\n");
+   else
+      printf("failure\n");
+
+   return v;
+}

Added: branches/THRCHECK/thrcheck/tests/tc11_XCHG.stderr.exp
===================================================================
--- branches/THRCHECK/thrcheck/tests/tc11_XCHG.stderr.exp                       
        (rev 0)
+++ branches/THRCHECK/thrcheck/tests/tc11_XCHG.stderr.exp       2007-09-27 
19:09:01 UTC (rev 6924)
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Added: branches/THRCHECK/thrcheck/tests/tc11_XCHG.stdout.exp
===================================================================
--- branches/THRCHECK/thrcheck/tests/tc11_XCHG.stdout.exp                       
        (rev 0)
+++ branches/THRCHECK/thrcheck/tests/tc11_XCHG.stdout.exp       2007-09-27 
19:09:01 UTC (rev 6924)
@@ -0,0 +1 @@
+success


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to