| From d36972dba754a8eb68cecf467ca37dc5dd6a9481 Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Fri, 31 Jan 2020 05:02:00 -0500 |
| Subject: [PATCH] KVM: s390: do not clobber registers during guest reset/store |
| status |
| |
| commit 55680890ea78be0df5e1384989f1be835043c084 upstream. |
| |
| The initial CPU reset clobbers the userspace fpc and the store status |
| ioctl clobbers the guest acrs + fpr. As these calls are only done via |
| ioctl (and not via vcpu_run), no CPU context is loaded, so we can (and |
| must) act directly on the sync regs, not on the thread context. |
| |
| Cc: stable@kernel.org |
| Fixes: e1788bb995be ("KVM: s390: handle floating point registers in the run ioctl not in vcpu_put/load") |
| Fixes: 31d8b8d41a7e ("KVM: s390: handle access registers in the run ioctl not in vcpu_put/load") |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Reviewed-by: David Hildenbrand <david@redhat.com> |
| Reviewed-by: Cornelia Huck <cohuck@redhat.com> |
| Signed-off-by: Janosch Frank <frankja@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20200131100205.74720-2-frankja@linux.ibm.com |
| Signed-off-by: Christian Borntraeger <borntraeger@de.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 681deaf9f20a..33fe62f6ae55 100644 |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -2865,9 +2865,7 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu) |
| vcpu->arch.sie_block->gcr[14] = CR14_UNUSED_32 | |
| CR14_UNUSED_33 | |
| CR14_EXTERNAL_DAMAGE_SUBMASK; |
| - /* make sure the new fpc will be lazily loaded */ |
| - save_fpu_regs(); |
| - current->thread.fpu.fpc = 0; |
| + vcpu->run->s.regs.fpc = 0; |
| vcpu->arch.sie_block->gbea = 1; |
| vcpu->arch.sie_block->pp = 0; |
| vcpu->arch.sie_block->fpf &= ~FPF_BPBC; |
| @@ -4352,7 +4350,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, |
| switch (ioctl) { |
| case KVM_S390_STORE_STATUS: |
| idx = srcu_read_lock(&vcpu->kvm->srcu); |
| - r = kvm_s390_vcpu_store_status(vcpu, arg); |
| + r = kvm_s390_store_status_unloaded(vcpu, arg); |
| srcu_read_unlock(&vcpu->kvm->srcu, idx); |
| break; |
| case KVM_S390_SET_INITIAL_PSW: { |
| -- |
| 2.7.4 |
| |