[S390] cio: use barrier() in stsch_reset.
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 9 Jan 2007 09:18:41 +0000 (10:18 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 9 Jan 2007 09:18:41 +0000 (10:18 +0100)
Use barrier() in stsch_reset() instead of duplicating the stsch()
inline assembly and adding "memory" to the clobberlist.
Pointed out by Chuck Ebbert.

Real fix would be to add a fixup section to the stsch() and extend the
basic program check handler so it searches the exception tables in case
of a program check.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/cio.c

index b471ac4a1bf66a1a50b4a33a1f8ca5619648a1ae..ae1bf231d08945bcad13903266f44ad1a3a00be6 100644 (file)
@@ -880,19 +880,15 @@ static void cio_reset_pgm_check_handler(void)
 static int stsch_reset(struct subchannel_id schid, volatile struct schib *addr)
 {
        int rc;
-       register struct subchannel_id reg1 asm ("1") = schid;
 
        pgm_check_occured = 0;
        s390_reset_pgm_handler = cio_reset_pgm_check_handler;
+       rc = stsch(schid, addr);
+       s390_reset_pgm_handler = NULL;
 
-       asm volatile(
-               "       stsch   0(%2)\n"
-               "       ipm     %0\n"
-               "       srl     %0,28"
-               : "=d" (rc)
-               : "d" (reg1), "a" (addr), "m" (*addr) : "memory", "cc");
+       /* The program check handler could have changed pgm_check_occured */
+       barrier();
 
-       s390_reset_pgm_handler = NULL;
        if (pgm_check_occured)
                return -EIO;
        else