[S390] zcore: fix inline assembly in memcpy_real()
authorMichael Holzheu <holzheu@de.ibm.com>
Fri, 12 Oct 2007 14:11:44 +0000 (16:11 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 12 Oct 2007 14:13:09 +0000 (16:13 +0200)
memcpy_real uses the mvcle instruction. This instruction alters all used
registers (source, destination and 2 x count). Therefore we have to flag
those registers as input/output registers (+d). In addition to that, we
have to specify, that we read from memory designated by "src" and write to
memory designated by "dest".

Signed-off-by: Michael Holzheu <holzheu@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/char/zcore.c

index 3712ede167235fcecd2ceeab4b0b9faac7f74461..7073daf77981005e7edfe0c6f59c08b2a3251212 100644 (file)
@@ -141,15 +141,16 @@ static int memcpy_real(void *dest, unsigned long src, size_t count)
 
        if (count == 0)
                return 0;
-       flags = __raw_local_irq_stnsm(0xf8); /* switch to real mode */
+       flags = __raw_local_irq_stnsm(0xf8UL); /* switch to real mode */
        asm volatile (
                "0:     mvcle   %1,%2,0x0\n"
                "1:     jo      0b\n"
                "       lhi     %0,0x0\n"
                "2:\n"
                EX_TABLE(1b,2b)
-               : "+d" (rc)
-               : "d" (_dest), "d" (_src), "d" (_len1), "d" (_len2)
+               : "+d" (rc), "+d" (_dest), "+d" (_src), "+d" (_len1),
+                 "+d" (_len2), "=m" (*((long*)dest))
+               : "m" (*((long*)src))
                : "cc", "memory");
        __raw_local_irq_ssm(flags);