| From d78286bea3657a8761803b71a7d8b685007f750b Mon Sep 17 00:00:00 2001 |
| From: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Date: Wed, 2 Oct 2019 14:24:47 +0200 |
| Subject: [PATCH] KVM: s390: fix __insn32_query() inline assembly |
| |
| commit b1c41ac3ce569b04644bb1e3fd28926604637da3 upstream. |
| |
| The inline assembly constraints of __insn32_query() tell the compiler |
| that only the first byte of "query" is being written to. Intended was |
| probably that 32 bytes are written to. |
| |
| Fix and simplify the code and just use a "memory" clobber. |
| |
| Fixes: d668139718a9 ("KVM: s390: provide query function for instructions returning 32 byte") |
| Cc: stable@vger.kernel.org # v5.2+ |
| Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c |
| index db64187e9505..681deaf9f20a 100644 |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -327,7 +327,7 @@ static inline int plo_test_bit(unsigned char nr) |
| return cc == 0; |
| } |
| |
| -static inline void __insn32_query(unsigned int opcode, u8 query[32]) |
| +static inline void __insn32_query(unsigned int opcode, u8 *query) |
| { |
| register unsigned long r0 asm("0") = 0; /* query function */ |
| register unsigned long r1 asm("1") = (unsigned long) query; |
| @@ -335,9 +335,9 @@ static inline void __insn32_query(unsigned int opcode, u8 query[32]) |
| asm volatile( |
| /* Parameter regs are ignored */ |
| " .insn rrf,%[opc] << 16,2,4,6,0\n" |
| - : "=m" (*query) |
| + : |
| : "d" (r0), "a" (r1), [opc] "i" (opcode) |
| - : "cc"); |
| + : "cc", "memory"); |
| } |
| |
| #define INSN_SORTL 0xb938 |
| -- |
| 2.7.4 |
| |