| From 255dc5e7dd1a7b6a303b7fe1b8c936bdac8f92d1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Jun 2021 16:03:56 +0200 |
| Subject: KVM: s390: get rid of register asm usage |
| |
| From: Heiko Carstens <hca@linux.ibm.com> |
| |
| [ Upstream commit 4fa3b91bdee1b08348c82660668ca0ca34e271ad ] |
| |
| Using register asm statements has been proven to be very error prone, |
| especially when using code instrumentation where gcc may add function |
| calls, which clobbers register contents in an unexpected way. |
| |
| Therefore get rid of register asm statements in kvm code, even though |
| there is currently nothing wrong with them. This way we know for sure |
| that this bug class won't be introduced here. |
| |
| Signed-off-by: Heiko Carstens <hca@linux.ibm.com> |
| Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Reviewed-by: Thomas Huth <thuth@redhat.com> |
| Reviewed-by: Cornelia Huck <cohuck@redhat.com> |
| Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20210621140356.1210771-1-hca@linux.ibm.com |
| [borntraeger@de.ibm.com: checkpatch strict fix] |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/kvm/kvm-s390.c | 18 +++++++++--------- |
| 1 file changed, 9 insertions(+), 9 deletions(-) |
| |
| diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c |
| index 20afffd6b982..f94b4f78d4da 100644 |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -327,31 +327,31 @@ static void allow_cpu_feat(unsigned long nr) |
| |
| static inline int plo_test_bit(unsigned char nr) |
| { |
| - register unsigned long r0 asm("0") = (unsigned long) nr | 0x100; |
| + unsigned long function = (unsigned long)nr | 0x100; |
| int cc; |
| |
| asm volatile( |
| + " lgr 0,%[function]\n" |
| /* Parameter registers are ignored for "test bit" */ |
| " plo 0,0,0,0(0)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (cc) |
| - : "d" (r0) |
| - : "cc"); |
| + : [function] "d" (function) |
| + : "cc", "0"); |
| return cc == 0; |
| } |
| |
| static __always_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; |
| - |
| asm volatile( |
| - /* Parameter regs are ignored */ |
| + " lghi 0,0\n" |
| + " lgr 1,%[query]\n" |
| + /* Parameter registers are ignored */ |
| " .insn rrf,%[opc] << 16,2,4,6,0\n" |
| : |
| - : "d" (r0), "a" (r1), [opc] "i" (opcode) |
| - : "cc", "memory"); |
| + : [query] "d" ((unsigned long)query), [opc] "i" (opcode) |
| + : "cc", "memory", "0", "1"); |
| } |
| |
| #define INSN_SORTL 0xb938 |
| -- |
| 2.30.2 |
| |