TAS code originally written for s390 (32-bit) does not work for s390x
authorTom Lane
Fri, 22 Nov 2002 01:13:16 +0000 (01:13 +0000)
committerTom Lane
Fri, 22 Nov 2002 01:13:16 +0000 (01:13 +0000)
(64-bit).  Fix it.  Per report from Permaine Cheung.

src/include/storage/s_lock.h

index 16457507a512a8cdc28e31e759d62c31ad468c27..c7dd885fbfe5ee73cec405d1fd89ce7b08ad369a 100644 (file)
@@ -63,7 +63,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *   $Id: s_lock.h,v 1.102 2002/11/10 00:33:43 momjian Exp $
+ *   $Id: s_lock.h,v 1.103 2002/11/22 01:13:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -150,7 +150,8 @@ tas(volatile slock_t *lock)
 
 #endif  /* __arm__ */
 
-#if defined(__s390__) || defined(__s390x__)
+
+#if defined(__s390__) && !defined(__s390x__)
 /*
  * S/390 Linux
  */
@@ -176,6 +177,32 @@ tas(volatile slock_t *lock)
 
 #endif  /* __s390__ */
 
+#if defined(__s390x__)
+/*
+ * S/390x Linux (64-bit zSeries)
+ */
+#define TAS(lock)     tas(lock)
+
+static __inline__ int
+tas(volatile slock_t *lock)
+{
+   int         _res;
+
+   __asm__ __volatile__(
+       "   la  1,1         \n"
+       "   lg  2,%2        \n"
+       "   slr 0,0         \n"
+       "   cs  0,1,0(2)    \n"
+       "   lr  %1,0        \n"
+:      "=m"(lock), "=d"(_res)
+:      "m"(lock)
+:      "0", "1", "2");
+
+   return (_res);
+}
+
+#endif  /* __s390x__ */
+
 
 #if defined(__sparc__)
 #define TAS(lock) tas(lock)