diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-11-22 01:13:16 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-11-22 01:13:16 +0000 |
commit | fadcb01177024fa83ab315e4926d6d9c296d6435 (patch) | |
tree | e86363937865f0e8ba3cc8937473daf9263f57b9 /src | |
parent | ed24f2853878f6fb746ab6e20f0ec066155baac6 (diff) |
TAS code originally written for s390 (32-bit) does not work for s390x
(64-bit). Fix it. Per report from Permaine Cheung.
Diffstat (limited to 'src')
-rw-r--r-- | src/include/storage/s_lock.h | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index 16457507a51..c7dd885fbfe 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -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) |