mirror of https://gitee.com/openkylin/linux.git
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: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
1d9995771f
commit
e3850ecfc1
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue