From: Martin Schwidefsky <schwidefsky@de.ibm.com>

s390 inline assembly bug-fixes:

- Add memory barriers to spinlocks, atomic variable functions and to
  test_and_{set,clear,change}_bit.

- Add "=m" and "m" contraints to tell gcc that the content of a variable
  is in fact used.

- Replace "+m" constraints by "=m" on the output and "m" on the input list.

- Use c-implemtation for ffz and __ffs.

- Use generic c-implemtation for ffs and fls.

 include/asm-s390/checksum.h  |    4 
 include/asm-s390/div64.h     |    4 
 include/asm-s390/timex.h     |    4 
 include/asm-s390/tlbflush.h  |    2 
 include/asm-s390/uaccess.h   |    4 



---

 25-akpm/include/asm-s390/atomic.h    |   21 ++-
 25-akpm/include/asm-s390/bitops.h    |  219 ++++++++---------------------------
 25-akpm/include/asm-s390/byteorder.h |    6 
 25-akpm/include/asm-s390/checksum.h  |    4 
 25-akpm/include/asm-s390/div64.h     |    4 
 25-akpm/include/asm-s390/pgtable.h   |    8 -
 25-akpm/include/asm-s390/processor.h |   41 +++---
 25-akpm/include/asm-s390/rwsem.h     |  147 +++++++++++------------
 25-akpm/include/asm-s390/semaphore.h |    6 
 25-akpm/include/asm-s390/spinlock.h  |   64 +++++-----
 25-akpm/include/asm-s390/system.h    |   97 +++++++--------
 25-akpm/include/asm-s390/timex.h     |    4 
 25-akpm/include/asm-s390/tlbflush.h  |    2 
 25-akpm/include/asm-s390/uaccess.h   |    4 
 14 files changed, 270 insertions(+), 357 deletions(-)

diff -puN include/asm-s390/atomic.h~s390-inline-assembly-constraints include/asm-s390/atomic.h
--- 25/include/asm-s390/atomic.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/atomic.h	Wed Jan 28 13:13:03 2004
@@ -1,7 +1,6 @@
 #ifndef __ARCH_S390_ATOMIC__
 #define __ARCH_S390_ATOMIC__
 
-#ifdef __KERNEL__
 /*
  *  include/asm-s390/atomic.h
  *
@@ -27,6 +26,8 @@ typedef struct {
 } __attribute__ ((aligned (4))) atomic_t;
 #define ATOMIC_INIT(i)  { (i) }
 
+#ifdef __KERNEL__
+
 #define __CS_LOOP(ptr, op_val, op_string) ({				\
 	typeof(ptr->counter) old_val, new_val;				\
         __asm__ __volatile__("   l     %0,0(%3)\n"			\
@@ -35,8 +36,10 @@ typedef struct {
                              "   cs    %0,%1,0(%3)\n"			\
                              "   jl    0b"				\
                              : "=&d" (old_val), "=&d" (new_val),	\
-			       "+m" (((atomic_t *)(ptr))->counter)	\
-			     : "a" (ptr), "d" (op_val) : "cc" );	\
+			       "=m" (((atomic_t *)(ptr))->counter)	\
+			     : "a" (ptr), "d" (op_val),			\
+			       "m" (((atomic_t *)(ptr))->counter)	\
+			     : "cc", "memory" );			\
 	new_val;							\
 })
 #define atomic_read(v)          ((v)->counter)
@@ -106,8 +109,10 @@ typedef struct {
                              "   csg   %0,%1,0(%3)\n"			\
                              "   jl    0b"				\
                              : "=&d" (old_val), "=&d" (new_val),	\
-			       "+m" (((atomic_t *)(ptr))->counter)	\
-			     : "a" (ptr), "d" (op_val) : "cc" );	\
+			       "=m" (((atomic_t *)(ptr))->counter)	\
+			     : "a" (ptr), "d" (op_val),			\
+			       "m" (((atomic_t *)(ptr))->counter)	\
+			     : "cc", "memory" );			\
 	new_val;							\
 })
 #define atomic64_read(v)          ((v)->counter)
@@ -182,9 +187,9 @@ atomic_compare_and_swap(int expected_old
                 "  ipm  %0\n"
                 "  srl  %0,28\n"
                 "0:"
-                : "=&d" (retval), "+m" (v->counter)
-                : "a" (v), "d" (expected_oldval) , "d" (new_val)
-                : "cc" );
+                : "=&d" (retval), "=m" (v->counter)
+                : "a" (v), "d" (expected_oldval) , "d" (new_val),
+		  "m" (v->counter) : "cc", "memory" );
         return retval;
 }
 
diff -puN include/asm-s390/bitops.h~s390-inline-assembly-constraints include/asm-s390/bitops.h
--- 25/include/asm-s390/bitops.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/bitops.h	Wed Jan 28 13:13:03 2004
@@ -13,6 +13,7 @@
  *
  */
 #include <linux/config.h>
+#include <linux/compiler.h>
 
 /*
  * 32 bit bitops format:
@@ -109,6 +110,8 @@ extern const char _sb_findmap[];
 
 #endif /* __s390x__ */
 
+#define __BITOPS_BARRIER() __asm__ __volatile__ ( "" : : : "memory" )
+
 #ifdef CONFIG_SMP
 /*
  * SMP safe set_bit routine based on compare and swap (CS)
@@ -189,6 +192,7 @@ test_and_set_bit_cs(unsigned long nr, vo
 	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
 	/* Do the atomic update. */
 	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_OR);
+	__BITOPS_BARRIER();
 	return (old & mask) != 0;
 }
 
@@ -211,6 +215,7 @@ test_and_clear_bit_cs(unsigned long nr, 
 	mask = ~(1UL << (nr & (__BITOPS_WORDSIZE - 1)));
 	/* Do the atomic update. */
 	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_AND);
+	__BITOPS_BARRIER();
 	return (old ^ new) != 0;
 }
 
@@ -233,6 +238,7 @@ test_and_change_bit_cs(unsigned long nr,
 	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
 	/* Do the atomic update. */
 	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_XOR);
+	__BITOPS_BARRIER();
 	return (old & mask) != 0;
 }
 #endif /* CONFIG_SMP */
@@ -435,7 +441,7 @@ test_and_set_bit_simple(unsigned long nr
         asm volatile("oc 0(1,%1),0(%2)"
 		     : "=m" (*(char *) addr)
 		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
-		       "m" (*(char *) addr) : "cc" );
+		       "m" (*(char *) addr) : "cc", "memory" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_set_bit(X,Y)		test_and_set_bit_simple(X,Y)
@@ -454,7 +460,7 @@ test_and_clear_bit_simple(unsigned long 
         asm volatile("nc 0(1,%1),0(%2)"
 		     : "=m" (*(char *) addr)
 		     : "a" (addr), "a" (_ni_bitmap + (nr & 7)),
-		       "m" (*(char *) addr) : "cc" );
+		       "m" (*(char *) addr) : "cc", "memory" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_clear_bit(X,Y)	test_and_clear_bit_simple(X,Y)
@@ -473,7 +479,7 @@ test_and_change_bit_simple(unsigned long
         asm volatile("xc 0(1,%1),0(%2)"
 		     : "=m" (*(char *) addr)
 		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
-		       "m" (*(char *) addr) : "cc" );
+		       "m" (*(char *) addr) : "cc", "memory" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_change_bit(X,Y)	test_and_change_bit_simple(X,Y)
@@ -681,59 +687,6 @@ find_next_bit (unsigned long * addr, int
         return (offset + res);
 }
 
-/*
- * ffz = Find First Zero in word. Undefined if no zero exists,
- * so code should check against ~0UL first..
- */
-static inline unsigned long ffz(unsigned long word)
-{
-	unsigned long reg;
-        int result;
-
-        __asm__("   slr  %0,%0\n"
-                "   lhi  %2,0xff\n"
-                "   tml  %1,0xffff\n"
-                "   jno  0f\n"
-                "   ahi  %0,16\n"
-                "   srl  %1,16\n"
-                "0: tml  %1,0x00ff\n"
-                "   jno  1f\n"
-                "   ahi  %0,8\n"
-                "   srl  %1,8\n"
-                "1: nr   %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   alr  %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_zb_findmap) : "cc" );
-        return result;
-}
-
-/*
- * __ffs = find first bit in word. Undefined if no bit exists,
- * so code should check against 0UL first..
- */
-static inline unsigned long __ffs (unsigned long word)
-{
-	unsigned long reg, result;
-
-        __asm__("   slr  %0,%0\n"
-                "   lhi  %2,0xff\n"
-                "   tml  %1,0xffff\n"
-                "   jnz  0f\n"
-                "   ahi  %0,16\n"
-                "   srl  %1,16\n"
-                "0: tml  %1,0x00ff\n"
-                "   jnz  1f\n"
-                "   ahi  %0,8\n"
-                "   srl  %1,8\n"
-                "1: nr   %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   alr  %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_sb_findmap) : "cc" );
-        return result;
-}
-
 #else /* __s390x__ */
 
 /*
@@ -910,35 +863,31 @@ find_next_bit (unsigned long * addr, uns
         return (offset + res);
 }
 
+#endif /* __s390x__ */
+
 /*
  * ffz = Find First Zero in word. Undefined if no zero exists,
  * so code should check against ~0UL first..
  */
 static inline unsigned long ffz(unsigned long word)
 {
-	unsigned long reg, result;
+        unsigned long bit = 0;
 
-        __asm__("   lhi  %2,-1\n"
-                "   slgr %0,%0\n"
-                "   clr  %1,%2\n"
-                "   jne  0f\n"
-                "   aghi %0,32\n"
-                "   srlg %1,%1,32\n"
-                "0: lghi %2,0xff\n"
-                "   tmll %1,0xffff\n"
-                "   jno  1f\n"
-                "   aghi %0,16\n"
-                "   srlg %1,%1,16\n"
-                "1: tmll %1,0x00ff\n"
-                "   jno  2f\n"
-                "   aghi %0,8\n"
-                "   srlg %1,%1,8\n"
-                "2: ngr  %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   algr %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_zb_findmap) : "cc" );
-        return result;
+#ifdef __s390x__
+	if (likely((word & 0xffffffff) == 0xffffffff)) {
+		word >>= 32;
+		bit += 32;
+	}
+#endif
+	if (likely((word & 0xffff) == 0xffff)) {
+		word >>= 16;
+		bit += 16;
+	}
+	if (likely((word & 0xff) == 0xff)) {
+		word >>= 8;
+		bit += 8;
+	}
+	return bit + _zb_findmap[word & 0xff];
 }
 
 /*
@@ -947,32 +896,25 @@ static inline unsigned long ffz(unsigned
  */
 static inline unsigned long __ffs (unsigned long word)
 {
-        unsigned long reg, result;
+	unsigned long bit = 0;
 
-        __asm__("   slgr %0,%0\n"
-                "   ltr  %1,%1\n"
-                "   jnz  0f\n"
-                "   aghi %0,32\n"
-                "   srlg %1,%1,32\n"
-                "0: lghi %2,0xff\n"
-                "   tmll %1,0xffff\n"
-                "   jnz  1f\n"
-                "   aghi %0,16\n"
-                "   srlg %1,%1,16\n"
-                "1: tmll %1,0x00ff\n"
-                "   jnz  2f\n"
-                "   aghi %0,8\n"
-                "   srlg %1,%1,8\n"
-                "2: ngr  %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   algr %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_sb_findmap) : "cc" );
-        return result;
+#ifdef __s390x__
+	if (likely((word & 0xffffffff) == 0)) {
+		word >>= 32;
+		bit += 32;
+	}
+#endif
+	if (likely((word & 0xffff) == 0)) {
+		word >>= 16;
+		bit += 16;
+	}
+	if (likely((word & 0xff) == 0)) {
+		word >>= 8;
+		bit += 8;
+	}
+	return bit + _sb_findmap[word & 0xff];
 }
 
-#endif /* __s390x__ */
-
 /*
  * Every architecture must define this function. It's the fastest
  * way of searching a 140-bit bitmap where the first 100 bits are
@@ -989,68 +931,12 @@ static inline int sched_find_first_bit(u
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
-extern inline int ffs (int x)
-{
-        int r = 1;
-
-        if (x == 0)
-		return 0;
-        __asm__("    tml  %1,0xffff\n"
-                "    jnz  0f\n"
-                "    srl  %1,16\n"
-                "    ahi  %0,16\n"
-                "0:  tml  %1,0x00ff\n"
-                "    jnz  1f\n"
-                "    srl  %1,8\n"
-                "    ahi  %0,8\n"
-                "1:  tml  %1,0x000f\n"
-                "    jnz  2f\n"
-                "    srl  %1,4\n"
-                "    ahi  %0,4\n"
-                "2:  tml  %1,0x0003\n"
-                "    jnz  3f\n"
-                "    srl  %1,2\n"
-                "    ahi  %0,2\n"
-                "3:  tml  %1,0x0001\n"
-                "    jnz  4f\n"
-                "    ahi  %0,1\n"
-                "4:"
-                : "=&d" (r), "+d" (x) : : "cc" );
-        return r;
-}
+#define ffs(x) generic_ffs(x)
 
 /*
  * fls: find last bit set.
  */
-static __inline__ int fls(int x)
-{
-	int r = 32;
-
-	if (x == 0)
-		return 0;
-	__asm__("    tmh  %1,0xffff\n"
-		"    jz   0f\n"
-		"    sll  %1,16\n"
-		"    ahi  %0,-16\n"
-		"0:  tmh  %1,0xff00\n"
-		"    jz   1f\n"
-		"    sll  %1,8\n"
-		"    ahi  %0,-8\n"
-		"1:  tmh  %1,0xf000\n"
-		"    jz   2f\n"
-		"    sll  %1,4\n"
-		"    ahi  %0,-4\n"
-		"2:  tmh  %1,0xc000\n"
-		"    jz   3f\n"
-		"    sll  %1,2\n"
-		"    ahi  %0,-2\n"
-		"3:  tmh  %1,0x8000\n"
-		"    jz   4f\n"
-		"    ahi  %0,-1\n"
-		"4:"
-		: "+d" (r), "+d" (x) : : "cc" );
-	return r;
-}
+#define fls(x) generic_fls(x)
 
 /*
  * hweightN: returns the hamming weight (i.e. the number
@@ -1273,11 +1159,16 @@ ext2_find_next_zero_bit(void *vaddr, uns
 
 /* Bitmap functions for the minix filesystem.  */
 /* FIXME !!! */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
-#define minix_test_bit(nr,addr) test_bit(nr,addr)
-#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
+#define minix_test_and_set_bit(nr,addr) \
+	test_and_set_bit(nr,(unsigned long *)addr)
+#define minix_set_bit(nr,addr) \
+	set_bit(nr,(unsigned long *)addr)
+#define minix_test_and_clear_bit(nr,addr) \
+	test_and_clear_bit(nr,(unsigned long *)addr)
+#define minix_test_bit(nr,addr) \
+	test_bit(nr,(unsigned long *)addr)
+#define minix_find_first_zero_bit(addr,size) \
+	find_first_zero_bit(addr,size)
 
 #endif /* __KERNEL__ */
 
diff -puN include/asm-s390/byteorder.h~s390-inline-assembly-constraints include/asm-s390/byteorder.h
--- 25/include/asm-s390/byteorder.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/byteorder.h	Wed Jan 28 13:13:03 2004
@@ -50,7 +50,7 @@ static __inline__ __u32 ___arch__swab32p
 		"        icm   %0,4,2(%1)\n"
 		"        icm   %0,2,1(%1)\n"
 		"        ic    %0,0(%1)"
-		: "=&d" (result) : "a" (x) : "cc" );
+		: "=&d" (result) : "a" (x), "m" (*x) : "cc" );
 #else /* __s390x__ */
 		"   lrv  %0,%1"
 		: "=d" (result) : "m" (*x) );
@@ -67,7 +67,7 @@ static __inline__ __u32 ___arch__swab32(
 	
 	__asm__ __volatile__ (
 		"   lrvr  %0,%1"
-		: "=d" (result) : "d" (x) );
+		: "=d" (result) : "d" (x), "m" (x) );
 	return result;
 #endif /* __s390x__ */
 }
@@ -85,7 +85,7 @@ static __inline__ __u16 ___arch__swab16p
 #ifndef __s390x__
 		"        icm   %0,2,1(%1)\n"
 		"        ic    %0,0(%1)\n"
-		: "=&d" (result) : "a" (x) : "cc" );
+		: "=&d" (result) : "a" (x), "m" (*x) : "cc" );
 #else /* __s390x__ */
 		"   lrvh %0,%1"
 		: "=d" (result) : "m" (*x) );
diff -puN include/asm-s390/checksum.h~s390-inline-assembly-constraints include/asm-s390/checksum.h
--- 25/include/asm-s390/checksum.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/checksum.h	Wed Jan 28 13:13:03 2004
@@ -42,7 +42,7 @@ csum_partial(const unsigned char * buff,
 	__asm__ __volatile__ (
 		"0:  cksm %0,%1\n"	/* do checksum on longs */
 		"    jo   0b\n"
-		: "+&d" (sum), "+&a" (rp) : : "cc" );
+		: "+&d" (sum), "+&a" (rp) : : "cc", "memory" );
 #else /* __s390x__ */
         __asm__ __volatile__ (
                 "    lgr  2,%1\n"    /* address in gpr 2 */
@@ -51,7 +51,7 @@ csum_partial(const unsigned char * buff,
                 "    jo   0b\n"
                 : "+&d" (sum)
                 : "d" (buff), "d" (len)
-                : "cc", "2", "3" );
+                : "cc", "memory", "2", "3" );
 #endif /* __s390x__ */
 	return sum;
 }
diff -puN include/asm-s390/div64.h~s390-inline-assembly-constraints include/asm-s390/div64.h
--- 25/include/asm-s390/div64.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/div64.h	Wed Jan 28 13:13:03 2004
@@ -36,8 +36,8 @@
 	     "   ahi  1,1\n"					\
 	     "1: st   1,4+%1\n"					\
              "   lr   %0,0"					\
-	     : "=d" (__r), "+m" (__n)				\
-	     : "d" (base) : "0", "1", "2", "cc" );		\
+	     : "=d" (__r), "=m" (__n)				\
+	     : "d" (base), "m" (__n) : "0", "1", "2", "cc" );	\
 	(n) = (__n);						\
         __r;                                                    \
 })
diff -puN include/asm-s390/pgtable.h~s390-inline-assembly-constraints include/asm-s390/pgtable.h
--- 25/include/asm-s390/pgtable.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/pgtable.h	Wed Jan 28 13:13:03 2004
@@ -553,11 +553,15 @@ ptep_clear_flush(struct vm_area_struct *
 	if (!(pte_val(pte) & _PAGE_INVALID)) {
 		/* S390 has 1mb segments, we are emulating 4MB segments */
 		pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
-		__asm__ __volatile__ ("ipte %0,%1" : : "a" (pto), "a" (address));
+		__asm__ __volatile__ ("ipte %2,%3"
+				      : "=m" (*ptep) : "m" (*ptep),
+				        "a" (pto), "a" (address) );
 	}
 #else /* __s390x__ */
 	if (!(pte_val(pte) & _PAGE_INVALID)) 
-		__asm__ __volatile__ ("ipte %0,%1" : : "a" (ptep), "a" (address));
+		__asm__ __volatile__ ("ipte %2,%3"
+				      : "=m" (*ptep) : "m" (*ptep),
+				        "a" (ptep), "a" (address) );
 #endif /* __s390x__ */
 	pte_clear(ptep);
 	return pte;
diff -puN include/asm-s390/processor.h~s390-inline-assembly-constraints include/asm-s390/processor.h
--- 25/include/asm-s390/processor.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/processor.h	Wed Jan 28 13:13:03 2004
@@ -66,7 +66,7 @@ extern struct task_struct *last_task_use
 
 #else /* __s390x__ */
 
-# define TASK_SIZE		(0x20000000000UL)
+# define TASK_SIZE		(0x40000000000UL)
 # define TASK31_SIZE		(0x80000000UL)
 # define TASK_UNMAPPED_BASE	(test_thread_flag(TIF_31BIT) ? \
 					(TASK31_SIZE / 2) : (TASK_SIZE / 2))
@@ -200,14 +200,14 @@ static inline void __load_psw_mask (unsi
 		"    st	  %0,4(%1)\n"
 		"    lpsw 0(%1)\n"
 		"1:"
-		: "=&d" (addr) : "a" (&psw) : "memory", "cc" );
+		: "=&d" (addr) : "a" (&psw), "m" (psw) : "memory", "cc" );
 #else /* __s390x__ */
 	asm volatile (
 		"    larl  %0,1f\n"
 		"    stg   %0,8(%1)\n"
 		"    lpswe 0(%1)\n"
 		"1:"
-		: "=&d" (addr) : "a" (&psw) : "memory", "cc" );
+		: "=&d" (addr) : "a" (&psw), "m" (psw) : "memory", "cc" );
 #endif /* __s390x__ */
 }
  
@@ -229,14 +229,16 @@ static inline void enabled_wait(void)
 		"    oi   4(%1),0x80\n"
 		"    lpsw 0(%1)\n"
 		"1:"
-		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+		: "=&a" (reg) : "a" (&wait_psw), "m" (wait_psw)
+		: "memory", "cc" );
 #else /* __s390x__ */
 	asm volatile (
 		"    larl  %0,0f\n"
 		"    stg   %0,8(%1)\n"
 		"    lpswe 0(%1)\n"
 		"0:"
-		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+		: "=&a" (reg) : "a" (&wait_psw), "m" (wait_psw)
+		: "memory", "cc" );
 #endif /* __s390x__ */
 }
 
@@ -247,7 +249,7 @@ static inline void enabled_wait(void)
 static inline void disabled_wait(unsigned long code)
 {
         char psw_buffer[2*sizeof(psw_t)];
-        char ctl_buf[4];
+        unsigned long ctl_buf;
         psw_t *dw_psw = (psw_t *)(((unsigned long) &psw_buffer+sizeof(psw_t)-1)
                                   & -sizeof(psw_t));
 
@@ -258,9 +260,9 @@ static inline void disabled_wait(unsigne
          * the processor is dead afterwards
          */
 #ifndef __s390x__
-        asm volatile ("    stctl 0,0,0(%1)\n"
-                      "    ni    0(%1),0xef\n" /* switch off protection */
-                      "    lctl  0,0,0(%1)\n"
+        asm volatile ("    stctl 0,0,0(%2)\n"
+                      "    ni    0(%2),0xef\n" /* switch off protection */
+                      "    lctl  0,0,0(%2)\n"
                       "    stpt  0xd8\n"       /* store timer */
                       "    stckc 0xe0\n"       /* store clock comparator */
                       "    stpx  0x108\n"      /* store prefix register */
@@ -271,13 +273,14 @@ static inline void disabled_wait(unsigne
                       "    std   6,0x178\n"    /* store f6 */
                       "    stm   0,15,0x180\n" /* store general registers */
                       "    stctl 0,15,0x1c0\n" /* store control registers */
-                      "    oi    0(%1),0x10\n" /* fake protection bit */
-                      "    lpsw 0(%0)"
-                      : : "a" (dw_psw), "a" (&ctl_buf) : "cc" );
-#else /* __s390x__ */
-        asm volatile ("    stctg 0,0,0(%1)\n"
-                      "    ni    4(%1),0xef\n" /* switch off protection */
-                      "    lctlg 0,0,0(%1)\n"
+                      "    oi    0x1c0,0x10\n" /* fake protection bit */
+                      "    lpsw 0(%1)"
+                      : "=m" (ctl_buf)
+		      : "a" (dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc" );
+#else /* __s390x__ */
+        asm volatile ("    stctg 0,0,0(%2)\n"
+                      "    ni    4(%2),0xef\n" /* switch off protection */
+                      "    lctlg 0,0,0(%2)\n"
                       "    lghi  1,0x1000\n"
                       "    stpt  0x328(1)\n"      /* store timer */
                       "    stckc 0x330(1)\n"      /* store clock comparator */
@@ -303,8 +306,10 @@ static inline void disabled_wait(unsigne
                       "    stmg  0,15,0x280(1)\n" /* store general registers */
                       "    stctg 0,15,0x380(1)\n" /* store control registers */
                       "    oi    0x384(1),0x10\n" /* fake protection bit */
-                      "    lpswe 0(%0)"
-                      : : "a" (dw_psw), "a" (&ctl_buf) : "cc", "0", "1");
+                      "    lpswe 0(%1)"
+                      : "=m" (ctl_buf)
+		      : "a" (dw_psw), "a" (&ctl_buf),
+		        "m" (dw_psw) : "cc", "0", "1");
 #endif /* __s390x__ */
 }
 
diff -puN include/asm-s390/rwsem.h~s390-inline-assembly-constraints include/asm-s390/rwsem.h
--- 25/include/asm-s390/rwsem.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/rwsem.h	Wed Jan 28 13:13:03 2004
@@ -102,21 +102,21 @@ static inline void __down_read(struct rw
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   ahi  %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   ahi  %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   aghi %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
-		: "cc", "memory" );
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count),
+		  "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" );
 	if (old < 0)
 		rwsem_down_read_failed(sem);
 }
@@ -130,25 +130,25 @@ static inline int __down_read_trylock(st
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: ltr  %1,%0\n"
 		"   jm   1f\n"
-		"   ahi  %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   ahi  %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b\n"
 		"1:"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: ltgr %1,%0\n"
 		"   jm   1f\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   aghi %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b\n"
 		"1:"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
-		: "cc", "memory" );
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count),
+		  "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" );
 	return old >= 0 ? 1 : 0;
 }
 
@@ -162,20 +162,20 @@ static inline void __down_write(struct r
 	tmp = RWSEM_ACTIVE_WRITE_BIAS;
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   a    %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   a    %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   ag   %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count), "m" (tmp)
 		: "cc", "memory" );
 	if (old != 0)
 		rwsem_down_write_failed(sem);
@@ -190,22 +190,22 @@ static inline int __down_write_trylock(s
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%1)\n"
+		"   l    %0,0(%2)\n"
 		"0: ltr  %0,%0\n"
 		"   jnz  1f\n"
-		"   cs   %0,%2,0(%1)\n"
+		"   cs   %0,%4,0(%2)\n"
 		"   jl   0b\n"
 #else /* __s390x__ */
-		"   lg   %0,0(%1)\n"
+		"   lg   %0,0(%2)\n"
 		"0: ltgr %0,%0\n"
 		"   jnz  1f\n"
-		"   csg  %0,%2,0(%1)\n"
+		"   csg  %0,%4,0(%2)\n"
 		"   jl   0b\n"
 #endif /* __s390x__ */
 		"1:"
-                : "=&d" (old)
-		: "a" (&sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS)
-		: "cc", "memory" );
+                : "=&d" (old), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count),
+		  "d" (RWSEM_ACTIVE_WRITE_BIAS) : "cc", "memory" );
 	return (old == RWSEM_UNLOCKED_VALUE) ? 1 : 0;
 }
 
@@ -218,20 +218,21 @@ static inline void __up_read(struct rw_s
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   ahi  %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   ahi  %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   aghi %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count),
+		  "i" (-RWSEM_ACTIVE_READ_BIAS)
 		: "cc", "memory" );
 	if (new < 0)
 		if ((new & RWSEM_ACTIVE_MASK) == 0)
@@ -248,20 +249,20 @@ static inline void __up_write(struct rw_
 	tmp = -RWSEM_ACTIVE_WRITE_BIAS;
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   a    %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   a    %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   ag   %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count), "m" (tmp)
 		: "cc", "memory" );
 	if (new < 0)
 		if ((new & RWSEM_ACTIVE_MASK) == 0)
@@ -278,20 +279,20 @@ static inline void __downgrade_write(str
 	tmp = -RWSEM_WAITING_BIAS;
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   a    %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   a    %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   ag   %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count), "m" (tmp)
 		: "cc", "memory" );
 	if (new > 1)
 		rwsem_downgrade_wake(sem);
@@ -306,20 +307,20 @@ static inline void rwsem_atomic_add(long
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   ar   %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   ar   %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   agr  %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   agr  %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "d" (delta)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count), "d" (delta)
 		: "cc", "memory" );
 }
 
@@ -332,20 +333,20 @@ static inline long rwsem_atomic_update(l
 
 	__asm__ __volatile__(
 #ifndef __s390x__
-		"   l    %0,0(%2)\n"
+		"   l    %0,0(%3)\n"
 		"0: lr   %1,%0\n"
-		"   ar   %1,%3\n"
-		"   cs   %0,%1,0(%2)\n"
+		"   ar   %1,%5\n"
+		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b"
 #else /* __s390x__ */
-		"   lg   %0,0(%2)\n"
+		"   lg   %0,0(%3)\n"
 		"0: lgr  %1,%0\n"
-		"   agr  %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
+		"   agr  %1,%5\n"
+		"   csg  %0,%1,0(%3)\n"
 		"   jl   0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "d" (delta)
+                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+		: "a" (&sem->count), "m" (sem->count), "d" (delta)
 		: "cc", "memory" );
 	return new;
 }
diff -puN include/asm-s390/semaphore.h~s390-inline-assembly-constraints include/asm-s390/semaphore.h
--- 25/include/asm-s390/semaphore.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/semaphore.h	Wed Jan 28 13:13:03 2004
@@ -95,9 +95,9 @@ static inline int down_trylock(struct se
 		"   cs   %0,%1,0(%3)\n"
 		"   jl   0b\n"
 		"1:"
-		: "=&d" (old_val), "=&d" (new_val),
-		  "+m" (sem->count.counter)
-		: "a" (&sem->count.counter) : "cc" );
+		: "=&d" (old_val), "=&d" (new_val), "=m" (sem->count.counter)
+		: "a" (&sem->count.counter), "m" (sem->count.counter)
+		: "cc", "memory" );
 	return old_val <= 0;
 }
 
diff -puN include/asm-s390/spinlock.h~s390-inline-assembly-constraints include/asm-s390/spinlock.h
--- 25/include/asm-s390/spinlock.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/spinlock.h	Wed Jan 28 13:13:03 2004
@@ -57,8 +57,9 @@ extern inline void _raw_spin_lock(spinlo
                            "1:  slr   %1,%1\n"
                            "    cs    %1,%0,0(%3)\n"
                            "    jl    0b\n"
-                           : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock)
-			   : "a" (&lp->lock) : "cc" );
+                           : "=&d" (reg1), "=&d" (reg2), "=m" (lp->lock)
+			   : "a" (&lp->lock), "m" (lp->lock)
+			   : "cc", "memory" );
 #else /* __s390x__ */
 	unsigned long reg1, reg2;
         __asm__ __volatile("    bras  %1,1f\n"
@@ -66,9 +67,9 @@ extern inline void _raw_spin_lock(spinlo
                            "1:  slr   %0,%0\n"
                            "    cs    %0,%1,0(%3)\n"
                            "    jl    0b\n"
-                           : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock)
-                           : "a" (&lp->lock), "i" (__DIAG44_OPERAND)
-			   : "cc" );
+                           : "=&d" (reg1), "=&d" (reg2), "=m" (lp->lock)
+			   : "a" (&lp->lock), "i" (__DIAG44_OPERAND),
+			     "m" (lp->lock) : "cc", "memory" );
 #endif /* __s390x__ */
 }
 
@@ -82,8 +83,9 @@ extern inline int _raw_spin_trylock(spin
 	__asm__ __volatile("    slr   %0,%0\n"
 			   "    basr  %1,0\n"
 			   "0:  cs    %0,%1,0(%3)"
-			   : "=&d" (result), "=&d" (reg), "+m" (lp->lock)
-			   : "a" (&lp->lock) : "cc" );
+			   : "=&d" (result), "=&d" (reg), "=m" (lp->lock)
+			   : "a" (&lp->lock), "m" (lp->lock)
+			   : "cc", "memory" );
 	return !result;
 }
 
@@ -93,7 +95,8 @@ extern inline void _raw_spin_unlock(spin
 
 	__asm__ __volatile("cs %0,%3,0(%4)"
 			   : "=d" (old), "=m" (lp->lock)
-			   : "0" (lp->lock), "d" (0), "a" (lp) : "cc" );
+			   : "0" (lp->lock), "d" (0), "a" (lp)
+			   : "cc", "memory" );
 }
 		
 /*
@@ -126,8 +129,8 @@ typedef struct {
                      "   la    3,1(2)\n"     /* one more reader */ \
                      "   cs    2,3,0(%1)\n"  /* try to write new value */ \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) : "a" (&(rw)->lock), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #else /* __s390x__ */
 #define _raw_read_lock(rw)   \
         asm volatile("   lg    2,0(%1)\n"   \
@@ -137,9 +140,9 @@ typedef struct {
                      "   la    3,1(2)\n"   /* one more reader */  \
                      "   csg   2,3,0(%1)\n" /* try to write new value */ \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #endif /* __s390x__ */
 
 #ifndef __s390x__
@@ -151,8 +154,8 @@ typedef struct {
                      "   ahi   3,-1\n"    /* one less reader */ \
                      "   cs    2,3,0(%1)\n" \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) : "a" (&(rw)->lock), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #else /* __s390x__ */
 #define _raw_read_unlock(rw) \
         asm volatile("   lg    2,0(%1)\n"   \
@@ -162,9 +165,9 @@ typedef struct {
                      "   bctgr 3,0\n"    /* one less reader */ \
                      "   csg   2,3,0(%1)\n" \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #endif /* __s390x__ */
 
 #ifndef __s390x__
@@ -176,8 +179,8 @@ typedef struct {
                      "1: slr   2,2\n"     /* old lock value must be 0 */ \
                      "   cs    2,3,0(%1)\n" \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) : "a" (&(rw)->lock), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #else /* __s390x__ */
 #define _raw_write_lock(rw) \
         asm volatile("   llihh 3,0x8000\n" /* new lock value = 0x80...0 */ \
@@ -186,9 +189,9 @@ typedef struct {
                      "1: slgr  2,2\n"      /* old lock value must be 0 */ \
                      "   csg   2,3,0(%1)\n" \
                      "   jl    0b"         \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #endif /* __s390x__ */
 
 #ifndef __s390x__
@@ -200,8 +203,8 @@ typedef struct {
                      "   sll   2,31\n"    /* old lock value must be 0x80000000 */ \
                      "   cs    2,3,0(%1)\n" \
                      "   jl    0b"       \
-                     : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) : "a" (&(rw)->lock), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #else /* __s390x__ */
 #define _raw_write_unlock(rw) \
         asm volatile("   slgr  3,3\n"      /* new lock value = 0 */ \
@@ -210,9 +213,9 @@ typedef struct {
                      "1: llihh 2,0x8000\n" /* old lock value must be 0x8..0 */\
                      "   csg   2,3,0(%1)\n"   \
                      "   jl    0b"         \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
+                     : "=m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \
+		       "m" ((rw)->lock) : "2", "3", "cc", "memory" )
 #endif /* __s390x__ */
 
 extern inline int _raw_write_trylock(rwlock_t *rw)
@@ -230,8 +233,9 @@ extern inline int _raw_write_trylock(rwl
 			     "   llihh %1,0x8000\n"
 			     "0: csg %0,%1,0(%3)\n"
 #endif /* __s390x__ */
-			     : "=&d" (result), "=&d" (reg), "+m" (rw->lock)
-			     : "a" (&rw->lock) : "cc" );
+			     : "=&d" (result), "=&d" (reg), "=m" (rw->lock)
+			     : "a" (&rw->lock), "m" (rw->lock)
+			     : "cc", "memory" );
 	return result == 0;
 }
 
diff -puN include/asm-s390/system.h~s390-inline-assembly-constraints include/asm-s390/system.h
--- 25/include/asm-s390/system.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/system.h	Wed Jan 28 13:13:03 2004
@@ -32,28 +32,28 @@ extern struct task_struct *__switch_to(v
 static inline void save_fp_regs(s390_fp_regs *fpregs)
 {
 	asm volatile (
-		"   std   0,8(%0)\n"
-		"   std   2,24(%0)\n"
-		"   std   4,40(%0)\n"
-		"   std   6,56(%0)"
-		: : "a" (fpregs) : "memory" );
+		"   std   0,8(%1)\n"
+		"   std   2,24(%1)\n"
+		"   std   4,40(%1)\n"
+		"   std   6,56(%1)"
+		: "=m" (*fpregs) : "a" (fpregs), "m" (*fpregs) : "memory" );
 	if (!MACHINE_HAS_IEEE)
 		return;
 	asm volatile(
-		"   stfpc 0(%0)\n"
-		"   std   1,16(%0)\n"
-		"   std   3,32(%0)\n"
-		"   std   5,48(%0)\n"
-		"   std   7,64(%0)\n"
-		"   std   8,72(%0)\n"
-		"   std   9,80(%0)\n"
-		"   std   10,88(%0)\n"
-		"   std   11,96(%0)\n"
-		"   std   12,104(%0)\n"
-		"   std   13,112(%0)\n"
-		"   std   14,120(%0)\n"
-		"   std   15,128(%0)\n"
-		: : "a" (fpregs) : "memory" );
+		"   stfpc 0(%1)\n"
+		"   std   1,16(%1)\n"
+		"   std   3,32(%1)\n"
+		"   std   5,48(%1)\n"
+		"   std   7,64(%1)\n"
+		"   std   8,72(%1)\n"
+		"   std   9,80(%1)\n"
+		"   std   10,88(%1)\n"
+		"   std   11,96(%1)\n"
+		"   std   12,104(%1)\n"
+		"   std   13,112(%1)\n"
+		"   std   14,120(%1)\n"
+		"   std   15,128(%1)\n"
+		: "=m" (*fpregs) : "a" (fpregs), "m" (*fpregs) : "memory" );
 }
 
 static inline void restore_fp_regs(s390_fp_regs *fpregs)
@@ -63,7 +63,7 @@ static inline void restore_fp_regs(s390_
 		"   ld    2,24(%0)\n"
 		"   ld    4,40(%0)\n"
 		"   ld    6,56(%0)"
-		: : "a" (fpregs));
+		: : "a" (fpregs), "m" (*fpregs) );
 	if (!MACHINE_HAS_IEEE)
 		return;
 	asm volatile(
@@ -80,7 +80,7 @@ static inline void restore_fp_regs(s390_
 		"   ld    13,112(%0)\n"
 		"   ld    14,120(%0)\n"
 		"   ld    15,128(%0)\n"
-		: : "a" (fpregs));
+		: : "a" (fpregs), "m" (*fpregs) );
 }
 
 #define switch_to(prev,next,last) do {					     \
@@ -107,15 +107,15 @@ static inline unsigned long __xchg(unsig
 		shift = (3 ^ (addr & 3)) << 3;
 		addr ^= addr & 3;
 		asm volatile(
-			"    l   %0,0(%3)\n"
+			"    l   %0,0(%4)\n"
 			"0:  lr  0,%0\n"
-			"    nr  0,%2\n"
-			"    or  0,%1\n"
-			"    cs  %0,0,0(%3)\n"
+			"    nr  0,%3\n"
+			"    or  0,%2\n"
+			"    cs  %0,0,0(%4)\n"
 			"    jl  0b\n"
-			: "=&d" (old)
-			: "d" (x << shift), "d" (~(255 << shift)), "a" (addr)
-			: "memory", "cc", "0" );
+			: "=&d" (old), "=m" (*(int *) addr)
+			: "d" (x << shift), "d" (~(255 << shift)), "a" (addr),
+			  "m" (*(int *) addr) : "memory", "cc", "0" );
 		x = old >> shift;
 		break;
 	case 2:
@@ -123,34 +123,36 @@ static inline unsigned long __xchg(unsig
 		shift = (2 ^ (addr & 2)) << 3;
 		addr ^= addr & 2;
 		asm volatile(
-			"    l   %0,0(%3)\n"
+			"    l   %0,0(%4)\n"
 			"0:  lr  0,%0\n"
-			"    nr  0,%2\n"
-			"    or  0,%1\n"
-			"    cs  %0,0,0(%3)\n"
+			"    nr  0,%3\n"
+			"    or  0,%2\n"
+			"    cs  %0,0,0(%4)\n"
 			"    jl  0b\n"
-			: "=&d" (old) 
-			: "d" (x << shift), "d" (~(65535 << shift)), "a" (addr)
-			: "memory", "cc", "0" );
+			: "=&d" (old), "=m" (*(int *) addr)
+			: "d" (x << shift), "d" (~(65535 << shift)), "a" (addr),
+			  "m" (*(int *) addr) : "memory", "cc", "0" );
 		x = old >> shift;
 		break;
 	case 4:
 		asm volatile (
-			"    l   %0,0(%2)\n"
-			"0:  cs  %0,%1,0(%2)\n"
+			"    l   %0,0(%3)\n"
+			"0:  cs  %0,%2,0(%3)\n"
 			"    jl  0b\n"
-			: "=&d" (old) : "d" (x), "a" (ptr)
-			: "memory", "cc", "0" );
+			: "=&d" (old), "=m" (*(int *) ptr)
+			: "d" (x), "a" (ptr), "m" (*(int *) ptr)
+			: "memory", "cc" );
 		x = old;
 		break;
 #ifdef __s390x__
 	case 8:
 		asm volatile (
-			"    lg  %0,0(%2)\n"
-			"0:  csg %0,%1,0(%2)\n"
+			"    lg  %0,0(%3)\n"
+			"0:  csg %0,%2,0(%3)\n"
 			"    jl  0b\n"
-			: "=&d" (old) : "d" (x), "a" (ptr)
-			: "memory", "cc", "0" );
+			: "=&d" (old), "=m" (*(long *) ptr)
+			: "d" (x), "a" (ptr), "m" (*(long *) ptr)
+			: "memory", "cc" );
 		x = old;
 		break;
 #endif /* __s390x__ */
@@ -268,7 +270,8 @@ __cmpxchg(volatile void *ptr, unsigned l
 #define local_irq_enable() ({ \
         unsigned long  __dummy; \
         __asm__ __volatile__ ( \
-                "stosm 0(%1),0x03" : "=m" (__dummy) : "a" (&__dummy) ); \
+                "stosm 0(%1),0x03" \
+		: "=m" (__dummy) : "a" (&__dummy) : "memory" ); \
         })
 
 #define local_irq_disable() ({ \
@@ -279,10 +282,10 @@ __cmpxchg(volatile void *ptr, unsigned l
         })
 
 #define local_save_flags(x) \
-        __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x) )
+        __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x), "m" (x) )
 
 #define local_irq_restore(x) \
-        __asm__ __volatile__("ssm   0(%0)" : : "a" (&x) : "memory")
+        __asm__ __volatile__("ssm   0(%0)" : : "a" (&x), "m" (x) : "memory")
 
 #define irqs_disabled()			\
 ({					\
@@ -294,7 +297,7 @@ __cmpxchg(volatile void *ptr, unsigned l
 #ifdef __s390x__
 
 #define __load_psw(psw) \
-        __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw) : "cc" );
+        __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw), "m" (psw) : "cc" );
 
 #define __ctl_load(array, low, high) ({ \
 	__asm__ __volatile__ ( \
diff -puN include/asm-s390/timex.h~s390-inline-assembly-constraints include/asm-s390/timex.h
--- 25/include/asm-s390/timex.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/timex.h	Wed Jan 28 13:13:03 2004
@@ -25,7 +25,7 @@ static inline cycles_t get_cycles(void)
 {
 	cycles_t cycles;
 
-	__asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc");
+	__asm__("stck 0(%1)" : "=m" (cycles) : "a" (&cycles) : "cc");
 	return cycles >> 2;
 }
 
@@ -33,7 +33,7 @@ static inline unsigned long long get_clo
 {
 	unsigned long long clk;
 
-	__asm__("stck 0(%0)" : : "a" (&(clk)) : "memory", "cc");
+	__asm__("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc");
 	return clk;
 }
 
diff -puN include/asm-s390/tlbflush.h~s390-inline-assembly-constraints include/asm-s390/tlbflush.h
--- 25/include/asm-s390/tlbflush.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/tlbflush.h	Wed Jan 28 13:13:03 2004
@@ -85,7 +85,7 @@ static inline void global_flush_tlb(void
 			"    slr  2,2\n"
 			"    slr  3,3\n"
 			"    csp  2,%0"
-			: : "a" (addr) : "cc", "2", "3" );
+			: : "a" (addr), "m" (dummy) : "cc", "2", "3" );
 	}
 }
 
diff -puN include/asm-s390/uaccess.h~s390-inline-assembly-constraints include/asm-s390/uaccess.h
--- 25/include/asm-s390/uaccess.h~s390-inline-assembly-constraints	Wed Jan 28 13:13:03 2004
+++ 25-akpm/include/asm-s390/uaccess.h	Wed Jan 28 13:13:03 2004
@@ -124,8 +124,8 @@ struct exception_table_entry
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0)	\
-		: "cc" );					\
+		: "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0),\
+		  "m" (x) : "cc" );				\
 })
 
 #else /* __s390x__ */

_