]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
s390/cpumf: get rid of variable length array
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 14 Dec 2016 12:45:07 +0000 (13:45 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Jan 2017 06:27:51 +0000 (07:27 +0100)
The stcctm5 inline assembly uses a variable length array to specify
the memory that is written to.  According to the gcc manual this trick
only works if the length is known at compile time. This is not the the
case for the stccm5 inline assembly.

Therefore simply use a full memory clobber. As requested by Martin
also move the output Q constraint operand to the input operands list,
since all we want is that the compiler generates an instruction that
may use the displacement field: in other words we only need the
address of *val. That the inline assembly actually writes to an array
starting at val is taken care of with the memory clobber.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/cpu_mf.h

index 428c41239a49fcd6ecca66df9aac9d4deecf633e..d1e0707310fd05d6d437ba3f40f76706edc81a71 100644 (file)
@@ -199,14 +199,15 @@ static inline int ecctr(u64 ctr, u64 *val)
 /* Store CPU counter multiple for the MT utilization counter set */
 static inline int stcctm5(u64 num, u64 *val)
 {
-       typedef struct { u64 _[num]; } addrtype;
        int cc;
 
        asm volatile (
                "       .insn   rsy,0xeb0000000017,%2,5,%1\n"
                "       ipm     %0\n"
                "       srl     %0,28\n"
-               : "=d" (cc), "=Q" (*(addrtype *) val)  : "d" (num) : "cc");
+               : "=d" (cc)
+               : "Q" (*val), "d" (num)
+               : "cc", "memory");
        return cc;
 }