Commit e3850ecf authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/cpumf: get rid of variable length array

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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 1d999577
...@@ -199,14 +199,15 @@ static inline int ecctr(u64 ctr, u64 *val) ...@@ -199,14 +199,15 @@ static inline int ecctr(u64 ctr, u64 *val)
/* Store CPU counter multiple for the MT utilization counter set */ /* Store CPU counter multiple for the MT utilization counter set */
static inline int stcctm5(u64 num, u64 *val) static inline int stcctm5(u64 num, u64 *val)
{ {
typedef struct { u64 _[num]; } addrtype;
int cc; int cc;
asm volatile ( asm volatile (
" .insn rsy,0xeb0000000017,%2,5,%1\n" " .insn rsy,0xeb0000000017,%2,5,%1\n"
" ipm %0\n" " ipm %0\n"
" srl %0,28\n" " srl %0,28\n"
: "=d" (cc), "=Q" (*(addrtype *) val) : "d" (num) : "cc"); : "=d" (cc)
: "Q" (*val), "d" (num)
: "cc", "memory");
return cc; return cc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment