| From 55680890ea78be0df5e1384989f1be835043c084 Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Fri, 31 Jan 2020 05:02:00 -0500 |
| Subject: KVM: s390: do not clobber registers during guest reset/store status |
| |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/kvm/kvm-s390.c | 6 ++---- |
| 1 file changed, 2 insertions(+), 4 deletions(-) |
| |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -2564,9 +2564,7 @@ static void kvm_s390_vcpu_initial_reset( |
| 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; |
| @@ -3994,7 +3992,7 @@ long kvm_arch_vcpu_ioctl(struct file *fi |
| 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: { |